토이 프로젝트/서버갖고 놀기 for DevOps

Jenkins 로 프로젝트 빌드 & 배포하기 - 2) Jenkins 로 github 프로젝트 docker image 로 빌드하기

TerianP 2023. 4. 14.
728x90

Jenkins 로 프로젝트 빌드하기 2탄 시작합니다!

 

지난 글에서는 Jenkins 설치 및 여러 설정을 잡았습니다. 

단순히 Jenkins 만 사용하는 것이 아니라 메일 서버와 연결해서 빌드 결과를 받을 수 있도록 연결도 했습니다. 그리고 이번에는 본격적으로 github 와 연결해서 docker image 로 빌드하고 배포까지 하는 작업을 해보도록 하겠습니다.

2023.04.08 - [토이 프로젝트/서버갖고 놀기 for DevOps] - Jenkins 로 프로젝트 빌드 & 배포하기 - 1) Jenkins 설치 및 설정잡기 (feat. mail 연결)

 

Jenkins 로 프로젝트 빌드 & 배포하기 - 1) Jenkins 설치 및 설정잡기 (feat. mail 연결)

오랜만에 돌아온 갖고 놀기 시리즈!! 사실 원래는 datachannel 에 대한 내용에 대해 글을 쓰고 싶었는데 결국 Jenkins 연동에 대해서 먼저 글을 작성하게 되었습니다..ㅠㅠ 어쨌든 Jenkins 연결 일대기

terianp.tistory.com

 

1. Jenkins 프로젝트 만들기

0) Jenkinsfile 작성

- 똑!같!이! 이름을 Jenkins 로 만든 후 프로젝트 루트 폴더에 위치한다.

- 사실 pipeline 내용 자체는 그렇게 특이하지도, 어렵지도 않다. 보면 알겠지만, stage 해당 에서 어떤 동작을 할지 정의하고, step 에서 실제 동작을 위한 명령어를 입력한다. 나의 경우 linux 에 설치하였기에 명령어는 sh 를 기반으로 사용한다.

- 아래 Jenkinsfile 은 정말정말 간단한 예제이며, 각 프로젝트에 맞게 작성해야합니다.

- checkout : 연결된 github 의 프로젝트를 checkout 해오기 위한 stage. 
- build : 프로젝트를 빌드하기 위한 stage. gradlew 로 빌드한다는 것을 명시해주었다.
- test : 프로젝트 테스트 정의
- docker build : docker image 파일로 빌드하기 위한 stage.
- deploy : 빌드된 docker image 를 배포하기 위한 stage.
- post : 모든 빌드과정이 끝난 후 실행할 내용을 작성한다. 나의 경우 success 와 fail 모두 빌드 결과를 mail 로 발송한다고 적어두었다.
pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                echo 'Checking out the repository...'
                checkout scm
            }
        }
        stage('Build') {
            steps {
                echo 'Building the application...'
                sh 'chmod +x gradlew'
                sh './gradlew clean build -x test'
            }
        }
        stage('Test') {
            steps {
                echo 'Running tests...'
                sh './gradlew test'
            }
        }
        stage('Docker Build') {
            steps {
                echo 'Building Docker image...'
                script {
                    docker.build('wkdtpwhs/chatforyou_p2p:latest', '.')
                }
            }
        }
        stage('Deploy') {
        // 빌드된 docker image 를 deploy 즉 배포하기 위한 stage
            steps {
                echo 'Deploying the application...'
                script {
                    def dockerImage = docker.build('wkdtpwhs/chatforyou_p2p:latest', '.')
                    
                    docker.image('wkdtpwhs/chatforyou_p2p:latest').run("-d", "-p 8443:443 -p 8080:80 -p 5000-6000:5000-6000", "--name=chatforyou_p2p")
                }
            }
        }
    }

    post {
        success {
            emailext (
                subject: "Build ${currentBuild.displayName} succeeded",
                body: "The build for ${env.JOB_NAME} was successful.",
                to: 'jsj@mail.hjproject.kro.kr', // 메일정보
                attachLog: true // 로그파일 첨부 여부
            )
        }
        failure {
            emailext (
                subject: "Build ${currentBuild.displayName} failed",
                body: "The build for ${env.JOB_NAME} failed. Please check the attached build logs.",
                to: 'jsj@mail.hjproject.kro.kr', // 메일정보
                attachLog: true
            )
        }
    }
}

 

 

 

1) Jenkins 메인 페이지에서 "+ 새로운 아이템" 을 누른다.

 

2) Pipline 를 누른 후 다음 버튼을 누르자.

- 왜 Pipline 인가? 에 대한 이유는 바로 프로젝트를 빌드하기위한 정보는  Jenkinsfile 를 바탕으로 하기 때문이다.

- 이 Jenkinsfile 에는 각 빌드의 stage 와 stage 에 맞는 step 을 정의한다. 예를 들어 Build 라는 stage 에서 어떤 step 을 따를지 - 어떤 파일로 빌드할지 - 를 정의할 수 있다.

pipline 을 선택한다.

 

2) General → Github project url 등록

- github 의 프로젝트 url 로 등록한다.

나의 url

 

3)  해당 빌드 프로젝트에서 github repository 에 접근하기 위한 credential 을 등록해야한다

요렇게 등록한다.

- Add 를 눌러서 credential 를 등록한다.

  • Username 은 본인의 깃허브 아이디
  • Password는 이전에 발급받은 Github Token 값을 사용한다.

token 과 아이디를 사용한다.

 

4) 어떤 브렌치에 대해서 빌드할지 선택한다

- 아무것도 안적으면 모든 브렌치에 대해서 동작한다.

어떤 브렌치에 대해서 동작할지 설정한다

5) 어떤 동작 - Triggers - 의 해서 빌드가 동작할건지 정한다.

- 우리는 GitHub 의 webhook 기능을 사용한다.

 

6) Jenkinsfile 의 위치 설정

- Jenkinsfile 의 위치를 정한다.

Jenkinsfile 의 위치


2. Github 에 webhook 설정하기

이제 github 에 webhook 을 설정해보자

 

1) git repository - Settings 에 Webhooks 로 들어가자 

2) Payload URL 에 jenkins 서버 ip/github-webhook/ 를 적는다.

webook url 설정!

3) repository 에서 어떤 동작이 일어났을 때 webhook 이 발생될지 설정한다.

- pull requests 와 pushes 이벤트가 일어났을 때 webhook 이 동작되도록 설정

당신의 입맛대로!


3. Jenkins 로 빌드하기!!!

빌드하는 방법은 아주 간단하다. 직접 Jenkins 로 들어가서 build 를 눌러도 되고, webhook 설정한 것을 확인하기 위해서 repository 에 아무 commit & push 를 날리면 Jenkins 에 webhook 이 날아가고 build 동작이 발생한다.

 

1) 아래는 hook log 에서 확인하는 webhook 동작

webhook 동작 Jenkins 는 빌드 시작!

2) 아래처럼 자동으로 빌드가 시작된다.

- 빌드는 pipline 에서 정한 stage 의 순서대로 진행된다.

 

3) 빌드 결과가 mail 로 날아온다!

- 단순히 빌드 결과만이 아니라 전체적인 빌드 log 가 함께 날아온다.

- 이걸 잘만 이용한다면, 빌드가 성공했을 때와 실패했을 때를 Jenkins 에 직접 접속하지 않아도 알 수 있고 특히 실패했을 때 왜 실패했는지 자세하게 확인 가능하다

- 무려 15번만에 성공했다ㅠ.ㅠ

내용과 함께 build.log 가 날아온다

 


4. Jenkins 프로젝트 완료!

사실 이전부터 정말정말 해보고 싶었던 목표였다. 개인적으로 직접 빌드하고, 배포하고하는게 너무 귀찮아서 꼭 자동화를 구현해보고 싶었기 때문이다.

다만 프로젝트는 성공했지만...포스팅 내용은 많이 아쉬운 부분이 있다. 사실 Jenkins 는 Azure 학생 무료 계정으로 가상 머신을 받아서 했는데 어느 순간인가 돈이 나가기 시작해서 무려 10만원까지 나가는 것을 확인하고 결국 서버도 삭제하고, 볼륨도 삭제하고 모두 삭제해버렸다. 워낙 급하게 삭제했어서 제대로 스샷도 못찍었고 때문에 이번 포스팅의 내용이 조금 많이 부족한 점이 있다ㅠㅠ

 

매번 서버를 빌리고, 삭제하고를 반복해서 심지어 Kurento + Coturn 설정은 지금까지 4번이나 했었다. 자꾸 재설치하고 세팅하는게 화나서 결국 라즈베리 파이를 2개 더 구입했다. 아마 앞으로는 서버에 대한 내용은 모두 라즈베리 파이에 설치해서 진행하려고 한다.

 

그리고 라즈베리파이가 늘어났기에 다음에는 단순 docker 가 아닌, 꼭 해보고 싶었던 것 중 하나인 Kubernate 로 서버를 설정을 잡아보도록 하려고 한다. 아마 이때 Jenkins 도 설치할 것이고, 그때는 부족한 내용을 꼭 더 추가하겠습니다...

 

 


Reference

https://narup.tistory.com/179

 

[Jenkins] 젠킨스란?

1. 젠킨스(Jenkins)란? 모든 언어의 조합과 소스 코드 레포지토리에 대한 지속적인 통합(Continuous integration, CI)과 지속적 배포(continuous delivery, CD) 환경을 구축하기 위한 도구다. 빌드, 테스트, 배포 프

narup.tistory.com

https://velog.io/@zzarbttoo/JenkinsGit-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0Git-Token-%EB%B0%9C%EA%B8%89-Jenkins-Credential-%EB%93%B1%EB%A1%9D

 

[Jenkins]Git 연동하기(Git Token 발급 + Jenkins Credential 등록)

안녕하세요 오늘은 git 에서 Token을 발급받아 Jenkins Credential에 등록해보겠습니다!먼저 Github Settings -> Developer settings -> Personal access token 항목에 들어갑니다 이후 Generate new

velog.io

https://alsyean.tistory.com/52

 

[Jenkins ] Jenkins email로 알림 받기

이번 시간에는 jenkins email로 알림을 받아보자 아래와 같이 시스템 설정을 들어가 주자 젠킨스가 빌드에 실패했을 때 이메일로 알려 줄 수 있는 설정부터 해보자 필자는 구글 이메일로 오게 하겠

alsyean.tistory.com

 

댓글