๐Ÿ’ป/์ธํ”„๋ผ

[BackEnd] CI/CD, Jenkins๋ž€?

ruhz 2022. 6. 28. 23:24

?

๊ฐœ๋ฐœ์ž๋Š” ๊ฐœ๋ฐœ๋งŒ ์ž˜ํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹ˆ์˜€๋‚˜?
๊ฐœ๋ฐœ์ž๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ๊ฐœ๋ฐœ ์™ธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๊ฒ ์ง€๋งŒ, ์—ฌ๊ธฐ์„  2๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

๋ฌธ์ œ 1. ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์ด ๋„ˆ๋ฌด ์ŠคํŠธ๋ ˆ์Šค์•ผ

ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ 10๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒํŠธ๋ฅผ ๋‚˜๋ˆ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ชจ์Šต์„ ์ƒ์ƒํ•ด๋ณด์ž. ๊ฐ์ž ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ ๋งˆ๋‹ค ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹์„ ๋„ฃ์„ ๊ฒƒ์ด๋‹ค. ์ฐฉํ•˜๊ฒŒ ํ•ฉ์ณ์ง€๋ฉด ์ฐธ ์ข‹๊ฒ ์ง€๋งŒ ์ปค๋ฐ‹๋“ค์„ ๋จธ์ง€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด  "๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋ˆ„๊ตฌ์•ผ, ๋‚ด ๊บผ ์•ˆ ๋˜์ž–์•„! "์™€ ๊ฐ™์€ ์•„์šฐ์„ฑ์ด ํ„ฐ์ ธ๋‚˜์˜ค๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์ด๋ฅผ 'Merge hell'์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. 

 

์œ„์™€ ๊ฐ™์€ ์‚ฌํƒœ๋ฅผ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ์ปค๋ฐ‹์„ ํ•  ๋•Œ ๋งˆ๋‹ค ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค. ๋‹น์—ฐํžˆ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ๊ท€์ฐฎ๊ณ  ๋‹ฌ๊ฐ‘์ง€ ์•Š์€ ์ผ์ด์ง€๋งŒ ํ˜‘์—…ํ•ด ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋Š” ํ†ตํ•ฉํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

๋ฌธ์ œ 2. ์ž๊พธ ๋‹ค๋ฅธ ๋ถ€์„œ์—์„œ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•ด๋‹ฌ๋ผ๊ณ  ํ•ด

๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋๋‹ค๋ฉด ์ƒˆ๋กœ ๋ฐฐํฌํ•ด๋‹ฌ๋ผ๋Š” ๋‹ค๋ฅธ ๋ถ€์„œ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค. ์••์ถ•ํŒŒ์ผ๋กœ ๋š๋”ฑ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ํ•ด๋‹น ๋ถ€๋ถ„์˜ ๋‹ด๋‹น์ž๋ผ๋ฉด ์žˆ์„ ์ˆ˜ ์—†๋Š” ์ผ์ด๋‹ค. ๋งˆ๋•…ํžˆ ์—…๋ฐ์ดํŠธ๋œ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ด ์•ฝ์†๋œ ํ˜•ํƒœ๋กœ ๊ณต์œ ํ•ด์ค˜์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , AWS ์ฝ˜์†”์„ ๋งŒ์ง€๊ณ , ... ๋ฐฐํฌ ์—ญ์‹œ ๋ณดํ†ต ์ž‘์—…์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์—ญ์‹œ ํ˜‘์—…์„ ์œ„ํ•ด์„œ ๊ผญ ํ•„์š”ํ•œ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฉ” ์ˆ˜๊ฐ€ ์—†๋‹ค. 

 

0. CI/CD

๋ฌธ์ œ 1์€ CI์™€ ๊ด€๋ จํ•œ ๋ฌธ์ œ์ด๋‹ค. CI๋Š” Continuous Integration์˜ ์•ฝ์ž๋กœ '์ง€์†์ ์ธ ํ†ตํ•ฉ'์„ ์˜๋ฏธํ•œ๋‹ค. ์ •ํ™•ํžˆ๋Š” '์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •'์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฌธ์ œ 2๋Š” CD์™€ ๊ด€๋ จํ•œ ๋ฌธ์ œ์ด๋‹ค. Continous Delivery์˜ ์•ฝ์ž๋กœ '์ง€์†์ ์ธ ๋ฐฐํฌ'๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ •ํ™•ํžˆ๋Š” '์ตœ์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •'์„ ์˜๋ฏธํ•œ๋‹ค. 

CI(Continous Integration)๋Š” '์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •'
CD(Continous Delivery)๋Š” '์ตœ์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •'

 

1. Jenkins

์ง‘์‚ฌ : "์ œ๊ฐ€ ๊ท€์ฐฎ์€ ์ผ์€ ๋‹ค ์•Œ์•„์„œ ํ• ํ…Œ๋‹ˆ ๊ฐœ๋ฐœ์ž๋‹˜์€ ๊ฐœ๋ฐœ๋งŒ ํ•˜์„ธ์š”"

์‚ฌ์‹ค ๋ฌธ์ œ 1, ๋ฌธ์ œ 2๋Š” ์†์ด ๋งŽ์ด ๊ฐˆ ๋ฟ ํ•ด๊ฒฐ์ฑ…์ด ์—†๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์†์ด ๋งŽ์ด ๊ฐ€๋Š” ๊ณผ์ •์„ ์ผ๋ จ์˜ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋งŒ๋“ค์–ด ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋“ค์ด ์žˆ์œผ๋‹ˆ, ๊ทธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๋…€์„์ด Jenkins๋‹ค. CI๋ฅผ ์œ„ํ•ด ์ปค๋ฐ‹์ด ๋“ค์–ด์˜ค๋ฉด, ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ ํ•ด์ค€๋‹ค. ๊ณผ์ •์— ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ํ†ตํ•ฉํ•ด์ค€๋‹ค. ์ด ์ตœ์‹ ์˜ ์ฝ”๋“œ๋“ค์„ ๋‹น์žฅ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๊ณต์œ ํ•˜๋ฉฐ CD๊นŒ์ง€ ํ•ด๊ฒฐํ•ด์ค€๋‹ค. ์ด์ œ ๋‚ด๊ฐ€ ํ•ด์•ผํ•  ์ผ์€ ์—ด์‹ฌํžˆ ๊ฐœ๋ฐœํ•˜๊ณ  ์ปค๋ฐ‹ํ•ด์„œ ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ๋‚ด ์ฝ”๋“œ๋ฅผ ์•ˆ์ฐฉ์‹œํ‚ค๋Š” ๊ฒƒ๋งŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Jenkins๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด ๊ฒ€์ฆ, ํ†ตํ•ฉ, ๋ฐฐํฌ๋ฅผ ๋ชจ๋‘ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค!

Jenkins Pipeline

Jenkins๋Š” ์ž๋™ํ™” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ ๋ณ„๋กœ ์œ ๋™์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Gitlab ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์†Œ์Šค ํด๋”๋กœ ๋‘๋ ค๊ณ  ํ•œ๋‹ค๋ฉด Gitlab ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ Jenkins๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์„ ์œ„ํ•ด Jenkins๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.  ์ผ๋ จ์˜ CI/CD ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก, ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ๋‹ค์šด ๋ฐ›๋Š”๋‹ค.

 

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์€ Jenkins Pipeline์ด๋ผ๋Š” ๊ณณ์— ๊ฝ‚ํžŒ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ Jenkins์˜ ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, ๋ฐฐํฌ ๋“ฑ์˜ ์ƒ์„ธ ๊ณผ์ •์„ ์ •์˜ํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด๋‹ค. Jenkins Pipeline์„ ์ •์˜ํ•˜๋Š” ๋ฌธ๋ฒ•์—๋Š” Declatrative, Scripted ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. ์ด ์ค‘ Declarative ๋ฐฉ์‹์˜ ๋ผˆ๋Œ€๋ฅผ ์‚ดํŽด๋ณด์ž.

Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any 
    stages {
        stage('Build') { 
            steps {
                // 
            }
        }
        stage('Test') { 
            steps {
                // 
            }
        }
        stage('Deploy') { 
            steps {
                // 
            }
        }
    }
}

Jenkins Pipeline์€ ํฌ๊ฒŒ 4๊ฐœ์˜ Section์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Agent Section : Jenkins๊ฐ€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋– ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๋…ธ๋“œ ๋‹จ์œ„์˜ ์—…๋ฌด๋ฅผ ์ง€์‹œํ•œ๋‹ค.
  • Stages Section : ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์—…๋ฌด๋ณ„ ๋‹จ์œ„(stage)๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • Steps Section : ๊ฐ ์—…๋ฌด(stage)์˜ ์ƒ์„ธ ์ž‘์—…์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ธฐ๋Šฅ(step)๋“ค์„ ํ™œ์šฉํ•ด ์ •์˜ํ•œ๋‹ค.
  • Post Section : ๊ฐ ์—…๋ฌด(stage)๊ฐ€ ๋๋‚œ ํ›„์˜ ๋ฃจํ‹ด์„ ์ •์˜ํ•œ๋‹ค.

 

2. ์š”์•ฝ

  1. CI/CD๋Š” ํ˜‘์—…์„ ์œ„ํ•ด์„œ ๊ผญ ํ•„์š”ํ•˜์ง€๋งŒ ๋ฒˆ๊ฑฐ๋กญ๊ณ , ๊ฐœ๋ฐœ ์™ธ์ ์ธ ์†Œ๋ชจ๊ฐ€ ํฌ๋‹ค.
  2. Jenkins๋Š” ์ฝ”๋“œ์˜ ํ†ตํ•ฉ๊ณผ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•ด์„œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
  3. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์กฐํ•ฉํ•˜๊ณ  4๊ฐœ์˜ Section์„ ์ž‘์„ฑํ•ด Jenkins Pipeline์„ ๋งŒ๋“ค์–ด ์ž๋™ํ™” ๊ณผ์ •์„ ์ •์˜ํ•œ๋‹ค.

 


[์ฐธ๊ณ ]

https://www.youtube.com/watch?v=JPDKLgX5bRg 

https://www.jenkins.io/doc/book/pipeline/