Jenkins Pipeline 구성하기

sieun·2022년 9월 25일
2
post-thumbnail

개요

jenkins의 pipeline 기능을 사용하면 배포 프로세스를 관리하기 편할 것 같았고, 어디서 오류가 생긴 것인지 쉽게 발견 가능하기 때문에 이전부터 사용해 보고싶었습니다. 따라서 Springboot 프로젝트를 빌드하여 배포하는 과정을 scripted 버전과 declarative 버전의 스크립트로 작성해보고, 어떤 과정으로 Jenkins pipeline이 동작하는지 알아볼 것입니다.



사전준비

아래 링크에 젠킨스 설치 및 기본 설정들을 정리해두었습니다. 젠킨스 설정하는데 참고하시면 될 것 같습니다.
https://www.notion.so/Jenkins-62e7ebad93ba4c4cbfa1808ac29ac647



Pipeline 구축

  • Pipeline plugin 설치되어있는지 확인
  • 아이템 생성
    new ItemPipeline , item name 입력 → OK 클릭



파이프라인 샘플코드 작성

  • 사전준비
    • 환경변수 파일 넣기
      • 저의 경우에는 /home/env 위치로 환경변수 파일인 applicatoin.properties 를 넣었습니다.
    • [ip주소]:[port번호]/job/pipeline/pipeline-syntax/ 로 들어가면 Snippet Generator가 Pipeline Script를 생성해주기 때문에 편리하게 작성할 수 있습니다.
  • Scripted
node {
    stage('clone') {
        git branch: ‘[브랜치명]’, credentialsId: ‘[credentials 아이디]’, url: ‘[github repository SSH url]}
    stage('Change application.yml') {
        sh '''
            rm ./src/main/resources/application.properties
            cp /home/env/application.properties /var/lib/jenkins/workspace/pipeline/src/main/resources
        '''
    }
    stage('Gradle Build') {
        sh '''
            ./gradlew clean bootJar
        '''
    }
    stage('Send JAR File To Deploy Server'){
        sh'''
            scp -P [포트번호] -i /var/lib/jenkins/.ssh/id_rsa.pem ./build/libs/mongo-log-0.0.1-SNAPSHOT.jar [계정명]@[ip주소]:/var/www/mongo-log/mongo-log-0.0.1-SNAPSHOT.jar
        '''
    }
    stage('Deploy Using systemd'){
        sh'''
            ssh -i /var/lib/jenkins/.ssh/id_rsa.pem [계정명]@[ip주소] "sudo systemctl restart mongo-log.service"
        '''
    }
}

참고로, 저는 배포서버에 빌드한 파일을 전송할 때 scp를 사용하였지만 그 외에도 편리한 명령어도 여럿 존재하니 찾아보시고 적절하게 활용하시면 될 것 같습니다.


  • [생성한 아이템]configureAdvanced Project OptionsPipeline
  • 아래 Script 칸에 코드 입력


  • Declarative
pipeline{
	agent any

	stages{
		stage('Clone'){
			steps{
				git branch: '[브랜치명]', credentialsId: '[credentials 아이디]', url: 'git@github.com:[organization명]/[repository명].git'
			}
		}
		stage('Change application.yml'){
			steps{
				sh 'rm ./src/main/resources/application.properties'
				sh 'cp /home/env/application.properties /var/lib/jenkins/workspace/pipeline/src/main/resources'
			}
		}
		stage('Gradle Build'){
			steps{
				sh './gradlew clean bootJar'
			}
		}
		stage('Send JAR File To Deploy Server'){
			steps{
				sh 'scp -P [포트번호] -i /var/lib/jenkins/.ssh/id_rsa.pem ./build/libs/mongo-log-0.0.1-SNAPSHOT.jar [계정명]@[ip주소]:/var/www/mongo-log/mongo-log-0.0.1-SNAPSHOT.jar'
			}
		}
		stage('Deploy Using systemd'){
			steps{
				sh 'ssh -i /var/lib/jenkins/.ssh/id_rsa.pem [계정명]@[ip주소] "sudo systemctl restart mongo-log.service"'
			}
		}
	}
}
  • [생성한 아이템]configureAdvanced Project OptionsPipeline깃허브 url, credentials, branch명, jenkinsfile명을 입력



Github push 후 빌드 자동화 방법

  • Build Triggers
    • Build after other projects are built : 다른 프로젝트를 먼저 빌드해야할 때 필요.
    • Build periodically : 주기적으로 프로젝트를 빌드할 때 필요.
    • GitHub hook trigger for GITScm polling : 깃허브에 코드가 새로 푸시되면 jenkins에게 webhook 메세지를 보내고, 이 메세지를 받은 jenkins가 빌드를 실행.
    • Poll SCM : 소스코드 저장소의 내용에 변경이 있을때 빌드 수행.
    • Quiet period : 빌드를 실행할 때 약간의 지연시간을 주는 옵션. 여러 번의 푸시가 있을 경우, 마지막 푸시만을 실행.
    • Trigger builds remotely : 외부에서 URL호출로 빌드작업을 시작. 토큰으로 인증 요청을 설정할 수 있음. 깃허브의 푸시 또는 메신저의 webhook의 경우 사용됨.

플러그인 설치

Magage JenkinsManage Pluginsgithub integration 플러그인 설치


방법1) Webhook 설정

dashboard[pipeline 프로젝트 명]GeneralBuildTriggers


github repository settingsWebhooksAdd webhook


방법2) Poll SCM

2분 주기로 깃허브에 변경된 내용이 있는지 확인하고, 변경사항이 존재한다면 빌드를 실행하도록 설정하였다.



결과

젠킨스 프로젝트가 바라보고 있는 깃허브 브랜치의 코드가 업데이트되면, 젠킨스 프로젝트가 자동으로 레포를 클론하고 빌드하여 빌드파일을 배포서버에 전송합니다. 그 후, 배포서버에 systemd로 프로세스를 restart하면 제가 진행하고자 하는 배포과정을 끝내게 됩니다.

  • 결과화면



📕 Reference

https://www.jenkins.io/doc/book/installing/linux/
https://dsstream.com/declarative-vs-scripted-pipeline-key-differences/

profile
열심히 공부중입니다😇

0개의 댓글