본문 바로가기
DevOps

[Jenkins 다중서버 무중단 배포 4/5] Pipeline 생성 및 스크립트 작성

by 헬로월드 2021. 11. 6.
반응형

2021.11.06 - [DevOps] - [Jenkins 다중서버 무중단 배포 3/5] Github 연동

개요

Jenkins를 통해서 Spring Boot 애플리케이션을 다수의 서버에 무중단으로 배포하는 것을 목표로 합니다.

이글에서는 Jenkins에 Pipeline을 생성하고 스크립트를 작성하겠습니다.

 

Pipeline Script 흐름은 이렇습니다.

  1. 소스를 내려받습니다.
  2. 소스를 빌드합니다. → 빌드 실패 시 중단
  3. 빌드한 파일을 서버에 복사합니다.
  4. 프로그랩 실행 스크립트를 실행합니다.
  5. 프로그램이 잘 동작하는지 체크 스크립트를 실행합니다. → 체크 실패시 중단
  6. 다음 서버를 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}")
                    }
                }
            }
        }
    }
}
  1. 스크립트의 시작입니다.
  2. Jenkins 설정에서 등록한 서버 목록입니다. 컴마(,) 구분자로 서버의 이름을 등록합니다.
  3. 코드 pull 이후 빌드하는 스크립트입니다.
  4. 서버 목록을 반복하면서 배포하게 됩니다.
  5. 서버 배포 함수입니다.
    1. 서버에서 실행할 스크립트를 복사합니다.
    2. Spring Boot jar 파일을 복사한 후 서버를 올리는 스크립트를 실행합니다. 'execCommand'의 경로는 절대 경로입니다.
    3. 서버가 잘 올라갔는지 체크하는 스크립트를 실행합니다. 체크에 실해하면 다음 서버 배포는 중단됩니다. 'execCommand'의 경로는 절대 경로입니다. 서버 배포를 위한 함수입니다.

'execCommand'는 절대 경로로 지정하고 나머지는 Jenkins 설정에서 서버 등록할 때 지정한 'Remote Directory'의 상대 경로입니다.

 


다음 글에서는 실행 및 체크 스크립트를 작성하겠습니다.

 

2021.11.07 - [DevOps] - [enkins 다중서버 무중단 배포 5/5] 배포 스크립트 작성

728x90