Jenkins Pipeline 작성

BinaryHyeok·2023년 3월 26일
1
post-thumbnail

개요

SpringBoot를 EC2에서 도커에 띄우기 위한 Jenkinsfile을 작성합니다.

Jenkinsfile 및 Dockerfile 작성

프로젝트 내에 deploy폴더를 만들고 그 안에 Jenkinsfile과 Dockerfile을 생성하였습니다.

Jenkinsfile

pipeline {
    agent any
    environment{
        TARGET_HOST = "[계정명]@[IP]"
        IMAGE_NAME = "server/test"
        CONTAINER_NAME ="server_develop"
        LAST_VERSION = "1.0"
        NEW_VERSION = "1.0"
        PROJECT_PATH = "/home/ubuntu/test"
    }
    stages {
        stage('Clone') {
            steps {
                git branch: 'be_develop', credentialsId: 'Gitlab' ,url: '[Gitlab 주소]'
            }
        }
        stage('Build') {
            steps {
                dir("./Backend/test"){
                    sh 'chmod +x gradlew'
                    sh  './gradlew clean build'
                }
            }
        }
        stage('Test') {
            steps {
                 echo  '테스트 단계와 관련된 몇 가지 단계를 수행합니다.'
            }
        }
        stage('Copy build file'){
            steps{
                dir("./Backend/test"){
                    sshagent (credentials: ['test_ssh']){
                        sh 'scp -o StrictHostKeyChecking=no ./deploy/Dockerfile ${TARGET_HOST}:${PROJECT_PATH}'
                        sh 'scp -o StrictHostKeyChecking=no ./build/libs/test.jar ${TARGET_HOST}:${PROJECT_PATH}'
                    }
                }
            }
        }
        stage('Stop process'){
            steps{
                sshagent (credentials: ['test_ssh']){
                    script{
                        try{
                            sh'''
                             ssh -o StrictHostKeyChecking=no ${TARGET_HOST} "docker rm -f ${CONTAINER_NAME}"
                             ssh -o StrictHostKeyChecking=no ${TARGET_HOST} "docker rmi ${IMAGE_NAME}:${LAST_VERSION}"
                             '''
                        } catch (e){
                            echo 'Remove Container Failed : ${CONTAINER_NAME}'
                        }
                    }

                }
            }
        }
        stage('Deploy'){
            steps{
                sshagent (credentials: ['test_ssh']){
                   sh'''
                   ssh -o StrictHostKeyChecking=no ${TARGET_HOST} "docker build --tag ${IMAGE_NAME}:${NEW_VERSION} --build-arg ARG_PROFILE=test ${PROJECT_PATH}"
                   ssh -o StrictHostKeyChecking=no ${TARGET_HOST} "docker run -v server-file-test:/file --name ${CONTAINER_NAME} -p 8888:8888 -d ${IMAGE_NAME}:${NEW_VERSION}"
                   '''
                }
            }
        }
    }
}

environment

내가 사용할 변수를 등록했습니다.

stage('Clone')

가져올 브랜치, Jenkins에 등록한 Gitlab credentialsId, gitlab url을 입력하여 branch내의 파일을 모두 가져옵니다.
이 때 가져온 프로젝트는 Jenkins container 내의 다음과 같은 폴더에 저장합니다.
/var/jenkins_home/workspace/[jenkins item 이름폴더]

stage('Build')

dir을 통해서 springboot내 프로젝트에서 gradle이 있는 위치 까지 이동한 뒤 gradle을 빌드합니다.

stage('Test')

테스트를 수행한다.

stage('Copy build file')

jenkins container 내의 Dockerfile과 jar파일을 EC2로 복사합니다.
StrictHostKeyChecking=no 옵션을 사용해서 ssh로 파일을 복사할 때 호스트의 키 검사를 비활성화 합니다.

stage('Stop process')

현재 실행 되고 컨테이너와 이미지를 삭제합니다.
try catch구문을 이용하여 try가 실패하더라도 pipeline이 끝나지 않습니다.

stage('Deploy')

젠킨스 컨테이너에서 EC2로 옮긴 Dockerfile, jar로 도커 이미지를 빌드하고, 컨테이너화 합니다.

Dockerfile

FROM openjdk:11.0.11-jre-slim

WORKDIR /jar

COPY ["test.jar", "."]

ARG ARG_PROFILE
ENV PROFILE=${ARG_PROFILE}

ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-Duser.timezone=Asia/Seoul", "-jar","test.jar"]

다음과 같이 작성하였습니다.

이제 젠킨스에서 Push event가 발생하도록 설정해 놓은 브랜치로 커밋을 해봅니다.

다음과 같이 파이프라인 스테이지에 마다의 성공, 실패 여부와 소요시간이 표시됩니다.

마치면서

다음에는 Nginx에 SSL적용을 하여 https로 Springboot와 Jenkins로 접근 할 수 있도록 할 예정입니다.


[참고]

https://www.jenkins.io/doc/book/pipeline/syntax/

1개의 댓글

comment-user-thumbnail
2023년 10월 23일

good good

답글 달기