본문 바로가기
프로젝트 기록/Architecture, Infra, CICD

[CI/CD] Jenkins로 스프링 부트 프로젝트 비공개 파일 관리와 빌드 스크립트 작성

by clean01 2024. 5. 7.

이 포스트에 기록할 내용은

  1. application.yml과 같이 숨겨야하는 정보를 github에 올리지 않아도 배포되도록 jenkins credentials에서 파일 관리하기
  2. pipeline Item을 만들어서 git clone, 설정 파일 정보 추가, 빌드하기

이렇게 두가지입니다.

Github에 올라가면 안되는 파일을 관리

application.yml 등과 같은 설정 파일에는 DB url, api key 등과 같은 노출되면 안되는 정보들이 존재합니다.
이런 정보가 깃헙에 올라가면 안되기 때문에 보통은 .gitignore에 추가해서 올라가지 않도록 방지하지만, 젠킨스는 깃헙에 있는 코드를 clone 받아서 빌드를 하고 있기 때문에 이 파일들을 빌드 전에 추가해주는 과정이 필요합니다.

노출되면 안되는 파일들은 Jenkins credentials로 관리할 수 있습니다.

Jenkins 대시보드로 들어와서 Jenkins 관리 > Credentials페이지로 이동합니다.

그리고 스크롤을 맨 아래로 내려서 (global)을 클릭해주고

Add Credentials를 눌러서 새로운 정보를 등록해주겠습니다.

그리고 아래 예시처럼 작성해줍니다.
Kind는 Secret file로 해주시고, 파일 선택을 눌러서 공개되면 안되는 파일을 추가해줍니다.
ID와 Description은 원하는대로 작성해주세요.
(저는 application이라는 ID를 가진 credentials를 이미 등록했기 때문에 경고가 뜨고 있습니다.)

일단은 Credentials 등록은 끝났습니다.
이제 젠킨스 파이프라인을 하나 만들어주도록 하겠습니다.

파이프라인 만들기

새로운 Item을 누르고

Pipeline을 선택해줍니다.

그리고 스크롤을 아래로 내려서 pipeline script를 적는 부분에 저는 아래와 같이 적어주었습니다.

pipeline {
    agent any

    stages {
        stage('git clone') {
            steps {
                sh '''
                    rm -rf mewsinsa
                    git clone https://github.com/f-lab-edu/mewsinsa.git
                    cd mewsinsa
                    git switch develop-v1
                '''
            }
        }

        stage('add properties') {
            steps {
                withCredentials([file(credentialsId: 'application', variable: 'application'),
                                file(credentialsId: 'application-jwt', variable: 'application-jwt'),
                                file(credentialsId: 'application-auth', variable: 'application-auth')]) {
                    script {
                        sh 'chmod 755 /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources'
                        sh 'cp ${application}       /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application.yml'
                        sh 'cp ${application-jwt}   /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application-jwt.properties'
                        sh 'cp ${application-auth}  /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application-auth.properties'
                    }
                }
            }
        }

        stage('build') {
            steps {
                dir('/var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa') {
                   sh '''
                    echo 'start bootJar'
                    chmod +x gradlew
                    ./gradlew clean bootJar
                    '''
                }
            }
        }
    }
}

이 중 add properties 부분에서 아까 credentials에 등록해준 파일들을 추가해주고 있는 것을 확인할 수 있습니다.

stage('add properties') {
            steps {
                withCredentials([file(credentialsId: 'application', variable: 'application'),
                                file(credentialsId: 'application-jwt', variable: 'application-jwt'),
                                file(credentialsId: 'application-auth', variable: 'application-auth')]) {
                    script {
                        sh 'chmod 755 /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources'
                        sh 'cp ${application}       /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application.yml'
                        sh 'cp ${application-jwt}   /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application-jwt.properties'
                        sh 'cp ${application-auth}  /var/jenkins_home/workspace/mewsinsa-pipeline/mewsinsa/src/main/resources/application-auth.properties'
                    }
                }
            }
        }

좌측 지금 빌드를 눌러 실행해보면 빌드까지 잘 되고 있는 것을 확인하실 수 있습니다.

앞으로 할 일은

  1. 빌드 후 ssh로 배포 서버(ec2)로 빌드 파일 전송 후 실행시키는 스크립트 작성
  2. github webhook을 이용해서 해당 repository에 push가 일어날 때마다 빌드되도록 하기

이렇게 두가지인데, 순서대로 진행해 보도록 하겠습니다.

Reference