2021.11.06 - [DevOps] - [Jenkins 다중서버 무중단 배포 3/5] Github 연동
개요
Jenkins를 통해서 Spring Boot 애플리케이션을 다수의 서버에 무중단으로 배포하는 것을 목표로 합니다.
이글에서는 Jenkins에 Pipeline을 생성하고 스크립트를 작성하겠습니다.
Pipeline Script 흐름은 이렇습니다.
- 소스를 내려받습니다.
- 소스를 빌드합니다. → 빌드 실패 시 중단
- 빌드한 파일을 서버에 복사합니다.
- 프로그랩 실행 스크립트를 실행합니다.
- 프로그램이 잘 동작하는지 체크 스크립트를 실행합니다. → 체크 실패시 중단
- 다음 서버를 3번부터 반복합니다.
Pipeline 생성
Dashboard에서 '새로운 Item'을 클릭합니다.
Pipeline을 선택하고 이름을 등록합니다.
설정 페이지 이동 후 Build Triggers 항목에 'Github hook...'을 체크해 주면 Git에서 Push가 발생했을 때 자동으로 빌드를 시작하게 됩니다.
다음으로 Github 설정입니다.
Definition: 'Pipeline script foom SCM'으로 설정해 줍니다. 이 설정으로 Pipeline 스크립트를 Github에 저장하고 가져올 것입니다.
SCM: 'git'으로 설정해 줍니다.
Repository URL: github 프로젝트 URL을 입력합니다.
Credentials: Jenkins의 'Manage Credentials'에 저장했던 Github 인증서를 선택합니다.
Script Path: Github의 Pipeline 스크립트 파일입니다. 기본은 root의 JenkinsFile 파일명으로 되어있지만 경로를 변경하실 때는 경로 앞에 점을 붙여서 지정하면 됩니다. (ex: ./deploy/develop/jenkins/JenkinsFile)
아래는 Github에 저장할 JenkinsFile입니다.
// (5)
def ssh_publisher(SERVER_CONFIG) {
sshPublisher(
continueOnError: false,
failOnError: true,
publishers:[
sshPublisherDesc(
configName: "${SERVER_CONFIG}",
verbose: true,
transfers: [
// (5.1) Copy script files
sshTransfer(
sourceFiles: "deploy/develop/script/*.sh",
removePrefix: "deploy/develop/script",
remoteDirectory: "build/script"
),
// (5.2) Copy build files
sshTransfer(
sourceFiles: "build/libs/*.jar",
removePrefix: "build/libs",
remoteDirectory: "/build/lib",
// Absolute path.
execCommand: "sh /home/build/script/deploy_server.sh"
),
// (5.3) Health check
sshTransfer(
// Absolute path.
execCommand: "sh /home/build/script/health_check.sh"
)
]
)
]
)
}
// (1)
pipeline {
environment {
// (2) Registered in Jenkins
SERVER_LIST = "server1,server2"
}
agent any
stages {
stage("Build") {
// (3)
steps {
sh "chmod +x gradlew"
sh "./gradlew clean build -x test"
}
}
stage("Deploy") {
steps {
echo "deploy.."
echo "${SERVER_LIST}"
script {
// (4)
SERVER_LIST.tokenize(',').each {
echo "SERVER: ${it}"
ssh_publisher("${it}")
}
}
}
}
}
}
- 스크립트의 시작입니다.
- Jenkins 설정에서 등록한 서버 목록입니다. 컴마(,) 구분자로 서버의 이름을 등록합니다.
- 코드 pull 이후 빌드하는 스크립트입니다.
- 서버 목록을 반복하면서 배포하게 됩니다.
- 서버 배포 함수입니다.
- 서버에서 실행할 스크립트를 복사합니다.
- Spring Boot jar 파일을 복사한 후 서버를 올리는 스크립트를 실행합니다. 'execCommand'의 경로는 절대 경로입니다.
- 서버가 잘 올라갔는지 체크하는 스크립트를 실행합니다. 체크에 실해하면 다음 서버 배포는 중단됩니다. 'execCommand'의 경로는 절대 경로입니다. 서버 배포를 위한 함수입니다.
'execCommand'는 절대 경로로 지정하고 나머지는 Jenkins 설정에서 서버 등록할 때 지정한 'Remote Directory'의 상대 경로입니다.
다음 글에서는 실행 및 체크 스크립트를 작성하겠습니다.
'DevOps' 카테고리의 다른 글
Jenkins Pipeline Slack 연동 (0) | 2021.11.07 |
---|---|
[Jenkins 다중서버 무중단 배포 5/5] 배포 스크립트 작성 (0) | 2021.11.07 |
[Jenkins 다중서버 무중단 배포 3/5] Github 연동 (0) | 2021.11.06 |
[Jenkins 다중서버 무중단 배포 2/5] 서버 등록 (0) | 2021.10.30 |
[Jenkins 다중서버 무중단 배포 1/5] Jenkins 설치 (0) | 2021.10.30 |