기초 설정 및 설치 작업이 끝났으니 Pipeline을 작성할 수 있다.
Jenkins 대시보드 -> 새로운 Item -> Pipeline 선택
Jenkins 관리 -> Plugins -> Available plugins -> Generic Webhook Trigger 검색 -> 설치 & 재시작
생성한 Pipeline -> 구성 -> Github project 활성화Project url에 프로젝트 Repository의 Clone 링크 (Code -> HTTPS 클릭 시 나오는 .git으로 끝나는 링크)를 입력한다.
조금 내려서 Build Triggers의 Generic Webhook Trigger를 활성화 시켜준다.
그리고 Post content parameter에 변수를 두개 추가한다.
특정 브랜치에 PR이 Merge된 경우에만 Pipeline을 실행시키고 싶을 때!!
그냥 Github integration을 사용하면 webhook에서 브랜치나 상황을 필터링 할 수 없다
$.pull_request.merged
$.pull_request.base.ref
쭉 내려서 Optional filter에 다음과 같이 입력해준다.
(?=.*true)(?=.develop).
$IF_MERGED $BRANCH
프로젝트 Repository -> Settings -> Webhooks -> Add webhook
Jenkins 서버 URL
:8080/generic-webhook-trigger/invokeJenkins 관리 -> System -> Global properties
Pipeline Script에서 사용하기 위한 환경변수를 추가해놓고 ${env.환경변수명} 으로 가져다 사용할 수 있다.
개발자가 코드를 올리면 서버에 자동으로 반영하는 Pipeline의 전체 과정을 한번에 정리하자면 총 5 stages로 나눌 수 있다.
1. Clone
2. Gradle 빌드
3. Docker 빌드
4. Docker Push
5. Docker Pull & 실행
Script의 구조는 아래와 같다.
pipeline { } 안에 모든 명령어를 작성한다.
pipeline {
agent any
environment {
registryCredential = 'dockerhub_credentials'
dockerImage = ''
imageName = 'Docker 이미지 이름'
}
stages 블록 내부에 모든 stage 선언
1번 stage: Github Repository Clone하기
stages {
stage('Prepare') {
steps {
echo 'Clonning Repository'
git branch: 'develop', credentialsId: 'github-credentials', url: '<https://github.com/backend>'
}
post {
success {
echo 'Successfully cloned repository'
}
failure {
error 'Failed to clone repository'
}
}
}
2번 stage: jar파일 빌드하기
sudo apt-get install gradle
stage('Bulid Gradle') {
steps {
echo 'Bulid Gradle'
dir('.'){
sh'''
chmod +x gradlew
./gradlew clean bootJar
'''
}
}
post {
success {
echo 'bootJar successful'
}
failure {
error 'bootJar failed'
}
}
}
3번 stage: Docker 이미지 빌드하기
stage('Bulid Docker') {
steps {
echo 'Bulid Docker'
script {
dockerImage = docker.build(imageName, "--build-arg PROFILE=dev .")
}
}
post {
success {
echo 'Successfully Built Image'
}
failure {
error 'This pipeline stops here...'
}
}
}
4번 stage: Docker 이미지 Dockerhub에 Push하기
stage('Push Docker') {
steps {
echo 'Push Docker'
script {
docker.withRegistry( '', registryCredential) {
dockerImage.push()
}
}
}
post {
success {
echo 'Successfully Pushed Image'
}
failure {
error 'This pipeline stops here...'
}
}
}
Spring Boot 서버에 SSH Agent로 접근해 Docker 이미지를 pull & 실행한다.
stage('Docker Run') {
steps {
echo 'Pull Docker Image & Docker Image Run'
sshagent (credentials: ['ssh_agent']) {
sh "ssh -o StrictHostKeyChecking=no ubuntu@Spring Boot 서버 IP주소 'docker pull 이미지 이름:버전'"
sh "ssh -o StrictHostKeyChecking=no ubuntu@Spring Boot 서버 IP주소 'docker ps -q --filter name=컨테이너 이름 | grep -q . && docker rm -f \\$(docker ps -aq --filter name=컨테이너 이름)'"
sh "ssh -o StrictHostKeyChecking=no ubuntu@Spring Boot 서버 IP주소 'docker run -d --name server -p 8080:8080 -e DB_PATH=${env.DB_PATH} 이미지 이름:버전'"
}
}
}
}
마지막으로 Pipeline의 모든 stage를 수행한 결과를 Slack Notification으로 수신한다.
post {
success {
slackSend (channel: '#jenkins_notification', color: '#00FF00', message: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
failure {
![](https://velog.velcdn.com/images/yun8565/post/c738f70a-33ca-4cd6-8f93-b23151ceb7a4/image.png)
slackSend (channel: '#jenkins_notification', color: '#FF0000', message: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
}
}
} // Pipeline 끝
Jenkins 대시보드 -> Pipeline -> 지금 빌드 클릭
Stage View에서 실행 과정을 한 눈에 볼 수 있다.
좌측의 Build history를 클릭해서 Console Output으로 상황을 직접 확인할 수 있다.
Docker
, Docker Pipeline
, SSH Agent
, Slack Notification
, Generic Webhook Trigger
정리를 하다 보니 Docker를 활용하는 방법은 Github Actions를 쓰는게 좋을 것 같다. Jenkins로 별도의 서버를 구축하는 수고를 덜 수 있고 Script 파일 하나만 프로젝트 Repository에 추가하면 되기 때문이다.
그래도 이렇게 정리를 해놓았으니 다음에 혹시 Jenkins를 사용해야 할 때 참고할 수 있을 것 같다!