Pipeline Script를 활용한 Build & Deploy

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
24/28

GitHub에 저장된 작업물을 가져와 Build

1. Jenkins 관리 > Gloabl Tool Configuration > Maven Section 확인

여기에서 중요한 것은 "Name"으로 지정한 값이다.

우리는 Build를 위해 Maven을 활용하므로 어떤 Maven을 활용하여 Build 과정을 수행해야 할지 명시해줘야 한다.

애초에 Jenkins 실행 환경에 Maven이 설치되어 있다면 문제 없지만 Maven 설치가 되지 않은 환경에서도 정상적으로 빌드 가능하게 만들기 위해선 이 설정을 해주는 것이 좋다.

2. 새로운 Item 생성후 Script 입력

이후 Pipeline Section에 가서 아래 구문을 입력한다.

pipeline{
    agent any
    tools {
        maven 'Maven3.8.6'
    }
    stages{
        stage('Git clone'){
            steps{
                git branch: 'main', url: 'https://github.com/idj7183/CI-CD-project';
            }
        }
        
        stage('build'){
            steps{
                bat '''
                    echo build start
                    mvn clean compile package -DskipTests=true
                '''
            }
        }
    }
}

먼저 봐야할 것은 "tools"이다.

우리는 Maven을 통해 빌드를 수행할 것이므로 어떤 Maven을 활용해 빌드를 수행할지 명시해줘야 한다.

이를 위해 1번 과정에서 확인한 Name을 입력해주면 된다.

필자는 1번 과정에서 확인할 수 있듯 빌드 시 활용할 Maven을 "Maven3.8.6"이라는 Name으로 지정하였기 때문에 위 Script와 같이 작성했다.

두 번째로 봐야 할 것은 stage('build')에 있는 steps 안의 "bat"이다.

이는 Jenkins 실행 환경과도 이어진다.

만약 내가 Docker Desktop이나 Linux 상에 Jenkins를 설치하였다면 Shell 명령어를 사용하기 위해선 "sh"라는 예약어를 활용한다. 따라서 Jenkins 설치 환경이 Linux OS라면 "sh ~"가 될 것이다.

하지만 필자는 Windows에 Jenkins를 설치하였기 때문에 Jenkins는 Shell 명령어가 아닌 Batch 명령어를 활용해야 한다.

따라서 Batch 명령어를 실행하는 예약어인 "bat"을 활용한 것이다.

만약 Windows 활용 시 "sh"를 활용했거나 Linux 활용 시 "bat"을 활용할 경우 아래 사진과 같이 Build Fail이 발생할 것이다.

마지막으로 봐야 하는 것은 stage('Git clone') 내부에 존재하는 steps이다.

이 steps에서는 아래와 같은 문구를 활용했음을 확인할 수 있다.

git branch: 'main', url: 'https://github.com/idj7183/CI-CD-project';
위와 같은 문법을 한 번도 보지 못했다면, 그게 정상일 것이다. 왜냐하면 위 문구는 Jenkins Declarative Script만을 위한 문법을 활용한 명령어, DSL이기 때문이다.

우리는 이전에 DSL을 쉽게 활용하기 위해 Jenkins 측에서 "Pipeline Syntax"라는 기능을 제공함을 배웠다. 이를 활용해보자.

Pipeline Sytanx 활용법

2-1. Piepline Section > Pipeline Syntax 선택

2-2. Sample Step > git 선택

git 뿐만 아닌 다른 여러 기능들에 대한 DSL문 생성을 지원함을 볼 수 있다.

2-3. 필요한 구문 입력

  • Repository URL : 빌드할 작업물이 저장된 Github URL
  • Branch : 가져올 작업물이 저장된 Branch
  • Credentials : 만약 Repoistory가 Private이라면 인증을 위해 입력해줘야 함

이후 Generate Pipeline Script 버튼을 클릭해보자.

이렇게 생성된 DSL 문을 복사하여 내가 원하는 steps에 붙여 넣으면 된다.

3. 빌드 후 결과 확인

실제로 Build 과정까지 잘 수행되었고 Console Ouput을 확인해보면 war 파일이 정상적으로 생성되었음을 알 수 있다.


생성한 war파일을 Tomcat에 배포

0. Tomcat 실행

이 과정을 수행하기 위해선 당연히 "구동되고 있는 Tomcat"에 생성한 war파일이 배포되어야 할 것이다.

이를 위해 먼저 Tomcat을 구동시켜 놓자.

또한 새로 생성한 war 파일이 Tomcat에 새로 배포되었음을 쉽게 확인하기 위해 기존에 Tomcat에 배포된 war 파일을 삭제하자.

방법은 Tomcat 실행 주소로 접속 후 Manager App에 들어가 이전에 "tomcat" 계정(manager-gui 권한을 가지고 있는 User)으로 접속하여 "/hello-world" Section의 "배치된 것을 제거" 버튼을 클릭하면 된다.

이 작업이 종료되었다면 위에서 생성했던 Item에 접속하여 설정을 변경하자.

1. Pipeline > Script Section에 아래 내용 추가

stage('deploy'){
    steps{
        deploy adapters: [tomcat9(credentialsId: 'deployer_user', path: '', url: 'http://localhost:8080')], contextPath: null, war: '**/*.war'
    }
}

stage('build') 구문 아래에 추가로 기입하면 된다.

당연히 steps 문구는 Pipeline Syntax를 통해 생할 수 있다.

  • Sample step : Deploy 선택
  • WAR/EAR files : Build된 결과물

기본적으로 이전 Tomcat 연동 과정에서 수행했던 설정법과 똑같이 설정하면 된다.

Jenkins Maven Project와 Tomcat 연동

2. 빌드 후 결과 확인

추가한 "deploy" Stage까지 성공적으로 수행되었음을 확인할 수 있다.

마지막으로 "http://localhost:8080/hello-world" 링크로 접속하여 결과물이 제대로 배포되었는지 확인하자.

성공!


SSH Server에 빌드 결과물 배포

필자는 Docker Desktop에 설치했던 docker-server에 결과물을 배포할 것이다.

아래 과정은 결과물을 배포 후 더욱 확실한 확인을 위해 Docker Image 생성까지 수행할 건데 만약 Docker Image 생성까지는 수행하고 싶지 않다면 Dockerfile이 해당 SSH Server에 존재하지 않아도 된다.

기존에는 3개의 Docker Image만 존재함을 확인하고 가자

1. Item 설정 > Pipeline Section에 들어가 Script 수정

pipeline{
    agent any
    tools {
        maven 'Maven3.8.6'
    }
    stages{
        stage('Git clone'){
            steps{
                git branch: 'main', url: 'https://github.com/idj7183/CI-CD-project';
            }
        }
        
        stage('build'){
            steps{
                bat '''
                    echo build start
                    mvn clean compile package -DskipTests=true
                '''
            }
        }
        
        stage('ssh publisher'){
            steps{
                sshPublisher(publishers: [sshPublisherDesc(configName: 'docker-server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker build -t pipeline-image -f Dockerfile .', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '.', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.war')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

Tomcat 배포 내용이 삭제되고 "stage('ssh publisher')"가 추가되었음을 볼 수 있다.

당연히 이 문구도 Pipeline Syntax를 통해 생성한 것이다.

Sample Step을 sshPublisher로 선택 후 Exec Command에 pipeline-image라는 이름의 Docker Image를 생성하는 명령어를 입력한다.

나머지 값은 아래 사이트에 나와 있는 설정 방법과 동일하다.

SSH Server에 Build 결과물 넘기기

2. 빌드 후 결과 확인

pipeline-image라는 새로운 Image가 생성되었음을 확인할 수 있다.

성공!

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글