Infra

[Infra] Docker, Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ MSA ํ”„๋กœ์ ํŠธ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ(3) - Jenkins ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

giraffe_ 2023. 5. 30. 11:13

์ด ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, Docker์™€ Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋Š” Docker๋ฅผ ์„ค์น˜์™€ ์ˆ˜๋™ ๋ฐฐํฌ ๊ณผ์ •๊ณผ ์ž๋™ ๋ฐฐํฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Jenkins๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ–ˆ๋‹ค

 

 

 

Docker ์„ค์น˜ํ•˜๊ธฐ : https://programmingiraffe.tistory.com/12

 

[Infra] Docker, Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ MSA ํ”„๋กœ์ ํŠธ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ(1) - Docker ์„ค์น˜

์ด ํฌ์ŠคํŒ…์—์„œ๋Š” MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, Docker์™€ Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ๊ตฌ๊ธ€๋ง ํ•˜๋ฉด์„œ ๋…ํ•™์„ ํ–ˆ๊ณ , ๋ฌด์ˆ˜ํ•œ ์‚ฝ์งˆ๊ณผ ์ด์ „ ํ”„๋กœ์ ํŠธ๋“ค์˜ ๋ฌธ์„œ์™€ ์ฃผ๋ณ€ ๋™

programmingiraffe.tistory.com

 

Jenkins ์„ค์น˜ํ•˜๊ธฐ : https://programmingiraffe.tistory.com/124

 

[Infra] Docker, Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ MSA ํ”„๋กœ์ ํŠธ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ(2) - Jenkins ์„ค์น˜

์ด ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, Docker์™€ Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋Š” Docker๋ฅผ ์„ค์น˜์™€ ์ˆ˜๋™ ๋ฐฐํฌ ๊ณผ์ •๊ณผ ์ž๋™ ๋ฐฐํฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€

programmingiraffe.tistory.com

 

 

 

 

 

๐Ÿ’ป ํ™˜๊ฒฝ

  • OS : Window
  • Server : AWS EC2
  • Backend : Spring boot, Spring Cloud(Gateway, Eureka), Gradle, Java11
  • Deploy : Docker, Dockerhub, Jenkins
  • Git : Gitlab

 

 

 

 

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋„

 

์•„ํ‚คํ…์ฒ˜(์ˆ˜์ •๋จ)

 

  • ๋ฐฑ์—”๋“œ 6๊ฐœ, DB 2๊ฐœ, Jenkins(Docker in docker๋กœ ํ–ˆ๋‹ค) ์ด 9๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  GitLab๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ webhook์„ ์„ค์ •ํ•ด push ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ๋˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.
  • ๊ฐ ์„œ๋น„์Šค๋ณ„๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ๋ธŒ๋žœ์น˜ ๋ณ„๋กœ webhook์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 

CI/CD ๊ณผ์ •

 

 

 

  1. ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น ๋ธŒ๋žœ์น˜์— push ๋œ๋‹ค. (ํ‘ธ์‰ฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒ)
  2. ํ”„๋กœ์ ํŠธ ๋‚ด์˜ Jenkinsfile์„ ์ฝ์–ด ์‹คํ–‰ํ•œ๋‹ค.
  3. Git์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ Cloneํ•ด, ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.
  4. jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ , ๋„์ปค ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•œ๋‹ค.
  5. ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋„์ปค ํ—ˆ๋ธŒ์— ์—…๋กœ๋“œ ํ•œ๋‹ค.
  6. ์ง€๊ธˆ ๋„์ปค์—์„œ run ๋˜๊ณ  ์žˆ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ์‚ญ์ œ์‹œํ‚จ๋‹ค.
  7. ๊ทธ๋ฆฌ๊ณ  ๋„์ปค ํ—ˆ๋ธŒ์— ์žˆ๋˜ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„ run ํ•œ๋‹ค.
  8. Spring ์„œ๋ฒ„๊ฐ€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ AWS์— ๋ฐฐํฌ๋œ๋‹ค.

 

 

 

 

 


๐Ÿคต๐Ÿป Jenkins Pipeline ์ƒ์„ฑ

  • ์ƒˆ๋กœ์šด Item ์ƒ์„ฑ

 

 

 

  • ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์ƒ์„ฑํ•œ๋‹ค. item ์ด๋ฆ„์€ ํ•ด๋‹น ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ–ˆ๋‹ค.

 

 

 

 

 

๐Ÿคต๐Ÿป Jenkins file ์ž‘์„ฑ

pipeline {
    agent any
    environment {
        DOCKER = 'sudo docker'
    }

    stages {
        stage('Clone Repository') {
            steps {
                checkout scm
                echo 'Checkout Scm'
            }
        }

        stage('Build image') {
            steps {
                sh 'ls -al'
                dir('[๋””๋ ‰ํ† ๋ฆฌ๋ช…]) {
                    sh 'ls -al'
                    sh 'chmod +x ./gradlew'
                    sh './gradlew build'
                    sh 'docker build -t [docker hub ๊ณ„์ •]/[docker ์ด๋ฏธ์ง€ ์ด๋ฆ„] .'
                }
                echo 'Build image...'
            }
        }

        stage('Remove Previous image') {
            steps {
                script {
                    try {
                        h 'docker stop [docker ์ด๋ฏธ์ง€ ์ด๋ฆ„]'
                        sh 'docker rm [docker ์ด๋ฏธ์ง€ ์ด๋ฆ„]'
                    } catch (e) {
                        echo 'fail to stop and remove container'
                    }
                }
            }
        }
        stage('Run New image') {
            steps {
                sh 'docker run --name [docker hub ๊ณ„์ •]/[docker ์ด๋ฏธ์ง€ ์ด๋ฆ„] -d -p [ํฌํŠธ๋ฒˆํ˜ธ]:[ํฌํŠธ๋ฒˆํ˜ธ] [docker hub ๊ณ„์ •]/[docker ์ด๋ฏธ์ง€ ์ด๋ฆ„]'
                echo 'Run New member image'
            }
        }
    }
}

 

 

 

 

 

๐Ÿคต๐Ÿป SCM ์„ค์ •

Jenkins script๋ฅผ ์ž‘์„ฑํ•ด์„œ push ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ฝ๋„๋ก ํ•  ๊ฒƒ์ด๋ฏ€๋กœ Definition์„ Pipeline script์—์„œ Pipeline script from SCM์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Git๊ณผ ์—ฐ๋™ํ•  ๊ฒƒ์ด๋ฏ€๋กœ SCM์„ Git์œผ๋กœ ์„ ํƒํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Git ์—ฐ๋™์„ ์„ค์ •ํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์ด ์ถ”๊ฐ€๋กœ ๋ณด์ธ๋‹ค.

 

 

 

Repository URL ์ž…๋ ฅ

Git ํ”„๋กœ์ ํŠธ์˜ URL์„ ์ž…๋ ฅํ•œ๋‹ค.

 

 

 

 

 

๐ŸฆŠ GibLab Access Token ์ƒ์„ฑ

Git ํ”„๋กœ์ ํŠธ์˜ Access Token ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Failed to connect to repository๊ฐ€ ๋œฌ๋‹ค. GitLab ํ”„๋กœ์ ํŠธ์— ๊ฐ€์„œ Access Token์„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

 

 

 

 

GitLab ํ”„๋กœ์ ํŠธ์—์„œ Settings > Access Toekn ์— ๋“ค์–ด๊ฐ€์„œ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

(์ตœ์ดˆ 1ํšŒ๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋ฏธ ํ† ํฐ์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋œ๋‹ค.)

 

 

 

 

 

 

๐Ÿคต๐Ÿป SCM ์„ค์ •

 

Credientials ์„ค์ •ํ•˜๊ธฐ

 

๋‹ค์‹œ Jenkins์˜ SCM ์„ค์ •์œผ๋กœ ๋Œ์•„์™€์„œ Credientials์—์„œ ๋‚ด GitLab ๊ณ„์ •๊ณผ ์—ฐ๋™ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๋ฏธ ์ถ”๊ฐ€๋ฅผ ํ–ˆ๋‹ค๋ฉด ๋‚ด ๊ณ„์ •์„ ์„ ํƒํ•˜๋ฉด ๋˜์ง€๋งŒ, ๋‚ด ๊ณ„์ •์ด ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด Add > Jenkins๋ฅผ ํด๋ฆญํ•ด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

 

 

Username์— ๋‚ด Gitlab ๊ณ„์ •์„ ์ž…๋ ฅํ•ด์ฃผ๊ณ , Password์— Gitlab ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ถ”๊ฐ€๊ฐ€ ๋˜๊ณ , ์ถ”๊ฐ€๋œ ๊ณ„์ •์„ Credientials๋กœ ์„ ํƒํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

Branches to Build ์„ค์ •

webhook์„ ๊ฑธ branch๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

 

 

 

 

Script Path ์ž…๋ ฅํ•˜๊ธฐ

Repository ๋‚ด์—์„œ Jenkinsfile์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

 

 

 

 

 

 

๐Ÿคต๐Ÿป Jenkins์—์„œ Webhook ์„ค์ •

GitLab Plugin ์„ค์น˜

Dashboard > Jenkins ๊ด€๋ฆฌ > Plugin ๊ด€๋ฆฌ > Available Plugin์— ๋“ค์–ด๊ฐ„๋‹ค.

๊ฒ€์ƒ‰์ฐฝ์— gitlab์„ ๊ฒ€์ƒ‰ํ•ด ์•„๋ž˜ ๋‚˜์˜ค๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

 

 

 

Build Trigger ์„ค์ •

๋‹ค์‹œ Jenkins pipeline์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ๋Œ์•„์™€์„œ Build Trigger๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

 

Build when a change is pushed to GitLab ํด๋ฆญ

(์ด๋•Œ, ์ฒดํฌํ•˜๋ฉด ๋‚˜์˜ค๋Š” URL์„ ๋ณต์‚ฌํ•œ๋‹ค. GitLab์œผ๋กœ ๊ฐ€์„œ Webhook์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์“ฐ์ธ๋‹ค.)

 

 

 

 

 

 

 

 

 

Secret token ์ƒ์„ฑํ•˜๊ธฐ

๊ณ ๊ธ‰ > Secret token > Generate ์„ ํด๋ฆญํ•œ๋‹ค. (Secret token ๋ณต์‚ฌํ•ด๋‘”๋‹ค. GitLab์œผ๋กœ ๊ฐ€์„œ Webhook์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์“ฐ์ธ๋‹ค.)

 

 

 

 

 

 

 

๐ŸฆŠ GibLab์—์„œ Webhook ์„ค์ •

 

ํ”„๋กœ์ ํŠธ > Settings > Webhooks ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์•„๋ž˜ ์‚ฌํ•ญ์„ ์ž…๋ ฅํ•˜๊ณ  Add webhook์„ ํ•œ๋‹ค.

 

  • URL : ์ด์ „์— Jenkins์—์„œ Build Trigger์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์˜†์— ๋‚˜์˜จ URL ์ž…๋ ฅ
  • Secret token : ๊ณ ๊ธ‰ > Secret token > Generate ํ–ˆ์„ ๋•Œ ๋‚˜์˜จ token ์ž…๋ ฅ
  • Trigger : Webhook Trigger๋ฅผ ๊ฑธ ๋ธŒ๋žœ์น˜๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

 

 

 

 

 

 

 

๐Ÿ˜Ž ๊ฒฐ๊ณผ

GibLab Webhook

ํ”„๋กœ์ ํŠธ์— ์„ค์ •๋œ Webhook์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Test๋ฅผ ํ†ตํ•ด ์ง์ ‘ Push ์ด๋ฒคํŠธ๋ฅผ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

 

 

 

Jenkins ํŒŒ์ดํ”„๋ผ์ธ ๋ณ„ CI/CD ์„ฑ๊ณต ํ™•์ธ

 

 

 

 

 

ํŒŒ์ดํ”„๋ผ์ธ์—์„œ CI/CD Stage ํ™•์ธ

 

 

 

 

 

Docker ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ

ํ˜„์žฌ ๋ฐฐํฌ์ค‘์ธ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

docker ps