젠킨스로 자동빌드배포

kkambbak1·2023년 5월 19일
1

젠킨스 파이프라인과 깃허브 웹훅으로 commit시 자동 빌드/배포

23.05.10 ~ 05.14

젠킨스

git, DB는 이미 설치 및 세팅이 되어있다고 가정

젠킨스 설치

docker run \\
  --name jenkins_1 \\
  -p 8081:8080 \\
  -e TZ=Asia/Seoul \\
  -v /docker_projects/jenkins_1/var/jenkins_home:/var/jenkins_home \\
  -v /var/run/docker.sock:/var/run/docker.sock \\
  -v /docker_projects/jenkins_1/data:/data \\
  -u root \\
  -d \\
  --restart unless-stopped \\
  jenkins/jenkins:lts

젠킨스 접속

도메인:8081

비밀번호 확인 후 접속, 추천 플러그인 설치

  • docker exec jenkins_1 cat /var/jenkins_home/secrets/initialAdminPassword

사용자 생성

jdk17 update

23.05월 기준으로 기본적으로 젠킨스 이미지에는 11이 깔려있는데, 내 프로젝트는 자바17기반이기 때문에 업데이트를 해주어야한다.

docker exec -it jenkins_1 bash
apt-get update
apt-get install openjdk-17-jdk -y
exit

환경변수 jdk17로 변경

java --version
env
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
echo $JAVA_HOME

완료 시 17버전이 되있는걸 볼 수 있다.

젠킨스 내에 docker 설치

apt-get update -y
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
rm /etc/apt/keyrings/docker.gpg
curl -fsSL <https://download.docker.com/linux/debian/gpg> | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/debian> \\  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli docker-compose-plugin

작업 생성

새로운 아이템 > 이름: gram_1 > pipeline 선택

application-secret.yml 옮기기

몇가지 방법들이 존재한다. 내가 사용한 방법은 이렇다.

Jenkins Credential Plugin에 저장하여 pipeline에서 application-secret.yml을 같이 빌드하게끔 만들자.

Jenkins 관리에서 Credentials > Add Credentials

  • secret file 선택
  • File 첨부 (application-secret.yml)
  • ID에 표기될 ID 입력 (gram_secret으로 입력해주었다.)

pipeline에 credential 추가

  • credentialsId: 방금 만든 시크릿 ID
  • variable: 아래 스크립트에서 사용될 변수명
  • cp $secret_yml_file ./src/main/resources/
    • 파일을 옮겨준다.

pipeline 작성

github public repo에서 가져올때는 이렇게만 작성해도 된다.
private이라면, 어떻게 해야하는지 추후 작성

pipeline {
    agent any

    tools {
        jdk 'openjdk-17-jdk'
    }

    stages {
        stage('Prepare') {
            steps {
                git branch: 'main',
                    url: '<https://github.com/kkambbak/MyPublicRepo>'
            }

            post {
                success {
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }
        }

        stage('secret.yml download') {
        	steps {
            	withCredentials([file(credentialsId: 'gram_secret', variable: 'secret_yml_file')]) {
                	script {
                    	sh 'cp $secret_yml_file ./src/main/resources/'
                    }
        		}
        	}
        }

        stage('Build Gradle Test') {

            steps {
                sh (script:'''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh """
                    chmod +x gradlew
                    """
                }

                dir('.') {
                    sh """
                    activeProfile=test testDbIp=172.17.0.1 testDbId=lldjlocal testDbPw=1234 ./gradlew clean build
                    """
                }
            }

            post {
                success {
                    sh 'echo "Successfully Build Gradle Test"'
                }
                 failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }
        }

        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker stop gram_1 &&
                docker rm -f gram_1 &&
                docker rmi -f gram
                """
            }

            post {
                success {
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }

        stage('Bulid Docker Image') {
            steps {
                sh 'echo " Image Bulid Start"'
                sh """
                ./gradlew bootBuildImage
                """
            }

            post {
                success {
                    sh 'echo "Bulid Docker Image Success"'
                }

                failure {
                    sh 'echo "Bulid Docker Image Fail"'
                }
            }
        }

        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker run \\
                  --name=gram_1 \\
                  -p 8080:8080 \\
                  -v /docker_projects/gram_1/volumes/gen:/gen \\
                  --restart unless-stopped \\
                  -e TZ=Asia/Seoul \\
                  -d \\
                  sbdb
                """
            }

            post {
                success {
                    sh 'echo "Docker Run Success"'
                }

                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}

1차 빌드 및 배포 완료

웹훅으로 main브랜치에 커밋시 자동 빌드배포

github의 webhook 설정에서

도메인:8081/github-webhook/으로 설정

젠킨스에서 Build Trigger에서 웹훅 체크

2차 배포 완료

쿠버네티스까지 활용하는 것도 기록해보도록 하겠다.

profile
윤성

0개의 댓글