프로젝트/협업 프로젝트(2023.12.18-2024.01.25)

[Key Word 개발기] 젠킨스 파이프라인 스크립트 형상관리

dal_been 2024. 1. 21. 17:08
728x90

현재 파이프라인 스크립트를 젠킨스 쪽에서 수정하고 배포하고 있다. 그러다보니 수정이 필요할때마다 젠킨스에 들어가야하고 변경사항에 대해서 매번 따로 기록해야하는 번거로움이 생겼다. 

그래서 파이프라인도 형상관리를 할 수 없을까 고민하게되었다.

 

젠킨스 형상관리

 

젠킨스쪽에서 구성에서 가면 pipeline script scm이라는 부분이 있다. 여기서 scm이란?? GIT처럼 변경사항을 추적하고 통제하는 것을 말한다.

 

젠킨스는 pipeline script scm을 통해 파이프라인 스크립트를 형상관리를 지원하고 있었다. 형상관리를 통해 젠킨스 서버와 독립적으로 깃에서 파이프라인 스크립트를 관리할 수 잇었다. 따라서 스크립트에 문제가 발생한다면 이전 스크립트를 사용할 수 있게 할 수 있다.

 

 

깃 레포지토리 파이프라인 스크립트 추가

 

파이프라인 스크립트를 별도의 레포에 관리할 수 있지만 우리팀은 프로젝트 레포에다가 jenkins라는 디렉토리를 생성하여 파이프라인 스크립트를 작성하도록 하였다.

 

파일명은 0000.jenkinsfile로 통일하였고 우리팀은 backend-prod.jenkinsfile로 명명하였다. 파일에는 젠킨스 서버에 있던 파이프라인 스크립트를 그대로 가져와 복사하였다

 

 

pipeline {
   agent any
   stages {
       stage('Github') {
           steps {
               git branch: 'develop', url: 'https://github.com/ZB-Keyword/Keyword-BackEnd.git'
               withCredentials([GitUsernamePassword(credentialsId: 'github_token', gitToolName: 'Default')]) {
                    sh 'git submodule update --init --recursive'
               }
           }
       }
       
       stage('Build') {
           steps {
               sh "chmod +x gradlew"
               sh "./gradlew bootJar"
           }
       }
       
       stage('Deploy') {
           steps {
                dir('build/libs') {
                    script {
                        sshagent(credentials: ['keyword_ssh']) {
                            // 파일 복사
                            sh 'scp -o StrictHostKeyChecking=no keyword-0.0.1-SNAPSHOT.jar ubuntu@${BACKEND_IP}:./'
        
                            // 스크립트 실행
                            def result = sh(script: 'ssh ubuntu@${BACKEND_IP} "sh keyword_run.sh"', returnStatus: true)
                            
                            // 스크립트 실행 결과 출력
                            echo "스크립트 실행 결과: ${result}"
        
                            // 스크립트가 실패한 경우 Jenkins를 중단
                            if (result != 0) {
                                error "스크립트 실행 중 오류 발생"
                            }
                        }
                    }
                }
           }
       }
   }
   post {
        success {
            slackSend (
                channel: '#jenkins-build-alarm', 
                color: '#00FF00', 
                message: """
SUCCESS: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}] 
"""
            )
        }
        failure {
            slackSend (
                channel: '#jenkins-build-alarm', 
                color: '#FF0000', 
                message: "FAIL: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}] (${env.BUILD_URL})"
            )
        }
    }
}

 

여기서 중요한 점은 민감한정보의 노출하지 않도록 주의해야한다. 우리팀의 스크립트에서는 서버 IP정보가 그대로 파이프라인 스크립트에 작성되어있어 젠킨스 환경변수로 분리하고 "{BACKEND_IP}"로 대체하였다.

 

젠킨스 수정하기

 

젠킨스 구성 쪽에서 pipeline script from scm으 선택하고

 

Git선택 + repository url + 자격증명(pulblic 레포는 필요 없음) + 브랜치 설정 을 해준다

Script path에는 프로젝트 레포에 jenkins/backend-prod.jenkinsfile로 해두었기 때문에 그대로 입력하면 된다.

 

이후 다시 빌드해주면 정상적으로 작동한다.

 


매번 젠킨스 서버에 가서 고쳐야하는 부분과 고친 부분을 따로 관리하는 부분이 번거로웠는데 이렇게 형상관리 할 수 있게 되서 마음이 매우 편해졌다 ㅎㅎ