Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ

์ง€๋‚œ XNUMX๋…„ ๋™์•ˆ ์ง€์†์ ์ธ ํ†ตํ•ฉ(Continuous Integration, CI) ๋ฐ ์ง€์†์ ์ธ ๋ฐฐํฌ(Continuous Delivery, CD)๋ฅผ ์œ„ํ•œ ๋„๊ตฌ ๊ฐœ๋ฐœ์— ์ƒ๋‹นํ•œ ๋ฐœ์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ๊ณผ ์šด์˜(Development Operations, DevOps)์„ ํ†ตํ•ฉํ•˜๋Š” ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์œผ๋กœ CI/CD ๋„๊ตฌ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์†”๋ฃจ์…˜์€ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹œ๋Œ€์— ๋ฐœ ๋งž์ถ”๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜๊ณ  ํ’ˆ์งˆ ๋ณด์ฆ ์†Œํ”„ํŠธ์›จ์–ด (Quality Assurance, QA) ์„ธ๊ณ„์—์„œ ๋งŽ์€ ์‹ ์ œํ’ˆ์ด ์ง€์†์ ์œผ๋กœ ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์„ ํƒ์˜ ํญ์ด ๋„“๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅธ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ

๊ธฐ์กด์˜ ๋ชจ๋“  CI/CD ๋„๊ตฌ ์ค‘์—์„œ ์ด ๋ถ„์•ผ์—์„œ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ฐพ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค. GitLab ํ”Œ๋žซํผ์˜ ์ผ๋ถ€์ธ Jenkins์™€ GitLab CI/CD ๋„๊ตฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Jenkins๋Š” ๊ทธ ์ด์ƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 16000 GitHub์˜ ๋ณ„. gitlab.com์˜ GitLab ์ €์žฅ์†Œ๋Š” ์ ์ˆ˜๊ฐ€ ์กฐ๊ธˆ ๋” ๋†’์•˜์Šต๋‹ˆ๋‹ค. 2000 ๋ณ„. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ์ธ๊ธฐ๋„๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด Jenkins๊ฐ€ GitLab CI/CD๊ฐ€ ํฌํ•จ๋œ ํ”Œ๋žซํผ๋ณด๋‹ค 8๋ฐฐ ๋” ๋งŽ์€ ๋ณ„์„ ํš๋“ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CI / CD ๋„๊ตฌ๋ฅผ ์„ ํƒํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์ง€ํ‘œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ ๋งŽ์€ ๋น„๊ต์—์„œ Jenkins์™€ GitLab CI / CD๊ฐ€ ์„œ๋กœ ๋งค์šฐ ๊ฐ€๊นŒ์šด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ ์ œํ’ˆ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ์™€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€์—ฌํ•œ ํ‰๊ฐ€๋ฅผ ์ถ•์ ํ•˜๋Š” G2 ํ”Œ๋žซํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ‰๊ท  ๋“ฑ๊ธ‰์ž…๋‹ˆ๋‹ค. ์  ํ‚จ์Šค, 288๊ฐœ ๋ฆฌ๋ทฐ ๊ธฐ์ค€ ๋ณ„ 4,3๊ฐœ์ž…๋‹ˆ๋‹ค. ์˜ค, ์˜ค GitLab 270๊ฐœ์˜ ๋ฆฌ๋ทฐ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ๋„๊ตฌ์˜ ํ‰๊ท  ํ‰์ ์€ ๋ณ„ 4,4๊ฐœ์ž…๋‹ˆ๋‹ค. Jenkins์™€ GitLab CI/CD๋Š” ๋™๋“ฑํ•œ ์กฐ๊ฑด์œผ๋กœ ๊ฒฝ์Ÿํ•œ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. Jenkins ํ”„๋กœ์ ํŠธ๋Š” 2011๋…„์— ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ ๊ทธ ์ดํ›„๋กœ ํ…Œ์Šคํ„ฐ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” ๋„๊ตฌ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— 2014๋…„์— ์‹œ์ž‘๋œ GitLab CI/CD ํ”„๋กœ์ ํŠธ๋Š” ์ด ํ”Œ๋žซํผ์ด ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ๋•๋ถ„์— ๋งค์šฐ ๋†’์€ ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ํ”Œ๋žซํผ๊ณผ ๋น„๊ตํ•˜์—ฌ Jenkins์˜ ์ธ๊ธฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉด Travis CI์™€ Jenkins ํ”Œ๋žซํผ์„ ๋น„๊ตํ•˜๋Š” ๊ธฐ์‚ฌ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. 85๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์ž๋“ค์€ ๊ฐ€์žฅ ๋งˆ์Œ์— ๋“œ๋Š” CI/CD ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. 79%๋Š” Jenkins๋ฅผ ์„ ํƒํ–ˆ๊ณ  5%๋Š” Travis CI๋ฅผ ์„ ํƒํ–ˆ์œผ๋ฉฐ 16%๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ
ะ ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะพะฟั€ะพัะฐ

๋‹ค๋ฅธ CI/CD ๋„๊ตฌ ์ค‘์—์„œ GitLab CI/CD๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์  ํ‚จ์Šค ์†Œ๊ฐœ

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ
์  ํ‚จ์Šค ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์ž˜ ์•Œ๋ ค์ง„ ์œ ์—ฐํ•œ CI/CD ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Jenkins๋Š” ์ „์ ์œผ๋กœ Java๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ, ํ†ตํ•ฉ ๋ฐ ๋ฆด๋ฆฌ์Šค์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๋‹ค์–‘ํ•œ ์šด์˜ ์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” macOS, Windows ๋ฐ OpenSUSE, Ubuntu ๋ฐ Red Hat๊ณผ ๊ฐ™์€ ๋งŽ์€ Linux ๋ฐฐํฌํŒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ OS์šฉ์œผ๋กœ ์„ค๊ณ„๋œ Jenkins์šฉ ์„ค์น˜ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ๋„๊ตฌ๋Š” Docker ๋ฐ JRE(Java Runtime Environment)๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Jenkins ๊ฐœ๋ฐœ์ž๋Š” Kubernetes ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ Jenkins X๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Jenkins X๋Š” DevOps ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด Helm, Jenkins CI/CD ์„œ๋ฒ„, Kubernetes ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ๋Š” GitOps๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Jenkins์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งค์šฐ ์ž˜ ๊ตฌ์กฐํ™”๋˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฝ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. Jenkins ํŒ€์€ Jenkins์™€ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์•ฝ 1000๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ ํ์‡„ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์  ํ‚จ์Šค์˜ ํŠน์ง•

Jenkins์˜ ์ž˜ ์•Œ๋ ค์ง„ ๊ธฐ๋Šฅ ์ค‘์—๋Š” ์„ค์ • ์šฉ์ด์„ฑ, ๋‹ค์–‘ํ•œ ์ž‘์—…์˜ ๋†’์€ ์ˆ˜์ค€์˜ ์ž๋™ํ™” ๋ฐ ์šฐ์ˆ˜ํ•œ ๋ฌธ์„œํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DevOps ์ž‘์—… ํ•ด๊ฒฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉด Jenkins๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ฒ˜๋ฆฌ์˜ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉด๋ฐ€ํžˆ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋งค์šฐ ์•ˆ์ •์ ์ธ ๋„๊ตฌ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ CI/CD ๋„๊ตฌ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Jenkins์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.

โ–1. ๋ฌด๋ฃŒ, ์˜คํ”ˆ ์†Œ์Šค, ๋‹ค์ค‘ ํ”Œ๋žซํผ ์ง€์›

Jenkins๋Š” macOS, Windows ๋ฐ Linux ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž๋™ํ™”๋œ ์ž‘์—…์˜ ๊ท ์ผํ•˜๊ณ  ๋น ๋ฅธ ์‹คํ–‰์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” Docker ํ™˜๊ฒฝ์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” Apache Tomcat ๋ฐ GlassFish์™€ ๊ฐ™์€ Java ์ง€์› ์ปจํ…Œ์ด๋„ˆ์—์„œ ์„œ๋ธ”๋ฆฟ์œผ๋กœ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์„ฑ์ ์œผ๋กœ Jenkins ์„ค์น˜ ๋ฌธ์„œํ™”.

โ–2. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ ๊ฐœ๋ฐœ

Jenkins ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋Š” ๋‹ค๋ฅธ CI/CD ๋„๊ตฌ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ณด๋‹ค ํ›จ์”ฌ ๋” ์„ฑ์ˆ™ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Jenkins์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ 1500๊ฐœ๊ฐ€ ๋„˜์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€์„ ์ฃผ์–ด ๊ด‘๋ฒ”์œ„ํ•œ ์ž‘์—…์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ’๋ถ€ํ•œ ๋ฌด๋ฃŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Jenkins๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ’๋น„์‹ผ ์œ ๋ฃŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์ž…ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋‹ค ํ†ตํ•ฉ ๋งŽ์€ DevOps ๋„๊ตฌ๊ฐ€ ์žˆ๋Š” Jenkins.

โ–3. ์‰ฌ์šด ์„ค์น˜ ๋ฐ ์„ค์ •

Jenkins๋Š” ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ ํ”„๋กœ์„ธ์Šค๋„ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Jenkins ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฌธ์„œ์˜ ํ’ˆ์งˆ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–4. ์นœ์ ˆํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ

์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Jenkins๋Š” ์ˆ˜๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํฌํ•จํ•˜๋Š” ์ƒํƒœ๊ณ„์ธ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. Jenkins๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์‚ฌ์šฉ์ž ๋ฐ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐœ๋ฐœ๋˜์–ด ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์„ ๋•์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” Jenkins์˜ ๋ฐœ์ „์„ ์ด๋„๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

โ–5. REST API์˜ ๊ฐ€์šฉ์„ฑ

Jenkins๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์›๊ฒฉ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ API๋Š” XML, JSONP๋ฅผ ์ง€์›ํ•˜๋Š” JSON, Python์˜ ์„ธ ๊ฐ€์ง€ ๋ฒ„์ „์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— Jenkins REST API ์ž‘์—…์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์„ค๋ช…์„œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

โ–6. ์ž‘์—…์˜ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ง€์›

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

โ–7. ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ž‘์—… ์ง€์›

Jenkins๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ ๋นŒ๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ Jenkins ์„œ๋ฒ„์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์‹œ์Šคํ…œ์ด ์žˆ๋Š” ์ž‘์—… ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ ˆ์ด๋ธŒ ๋จธ์‹ ์€ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ Jenkins๋ฅผ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ํ”„๋กœ์ ํŠธ์™€ ์ฐจ๋ณ„ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊นƒ๋žฉ ์†Œ๊ฐœ

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ
GitLab CI / CD ๊ฐ€์žฅ ์‚ฌ๋ž‘๋ฐ›๋Š” ์ตœ์‹  DevOps ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌด๋ฃŒ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ๋Š” GitLab ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. GitLab ํ”Œ๋žซํผ์—๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฒ„์ „์ด ์žˆ์œผ๋ฉฐ ์ €์žฅ์†Œ ๊ด€๋ฆฌ, ๋ฌธ์ œ ์ถ”์  ๋„๊ตฌ, ์ฝ”๋“œ ๊ฒ€ํ†  ์กฐ์ง, ๋ฌธ์„œ ์ง€ํ–ฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์‚ฌ๋Š” ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์ธ์ฆ์„ ์œ„ํ•ด GitLab์„ ๋กœ์ปฌ์— ์„ค์น˜ํ•˜์—ฌ Active Directory ๋ฐ LDAP ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— GitLab CI/CD ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋น„๋””์˜ค ์ž์Šต์„œ์ž…๋‹ˆ๋‹ค.

GitLab CI/CD๋Š” ์›๋ž˜ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ์ ํŠธ๋กœ ์ถœ์‹œ๋˜์—ˆ์ง€๋งŒ 2015๋…„์— ์ด ๋„๊ตฌ ์„ธํŠธ๊ฐ€ GitLab 8.0์— ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ GitLab CI/CD ์„œ๋ฒ„๋Š” 25000๋ช… ์ด์ƒ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„œ๋ฒ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์šฉ์„ฑ์ด ๋†’์€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitLab CI/CD ๋ฐ ์ฃผ์š” GitLab ํ”„๋กœ์ ํŠธ๋Š” Ruby ๋ฐ Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. GitLab CI/CD๋Š” CI/CD ๋„๊ตฌ์˜ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ ์™ธ์—๋„ ์ž‘์—… ์ผ์ •๊ณผ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

GitLab CI/CD๋ฅผ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. GitLab CI/CD๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜๋ฉฐ ๊ฐ ๋‹จ๊ณ„๋Š” ํŠน์ • ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์„ ๋ฏธ์„ธ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ๊ณ„ ๋ฐ ์ž‘์—… ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚˜๋ฉด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—… ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ GitLab CI / CD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋ฉฐ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ณด๋‹ค ๋” ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GitLab CI/CD ๋ฐ GitLab์˜ ๊ธฐ๋Šฅ

GitLab CI/CD๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” DevOps ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ณ ํ’ˆ์งˆ ๋ฌธ์„œ๋กœ ๊ตฌ๋ณ„๋˜๋ฉฐ ๊ทธ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„์ง GitLab CI/CD์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ์ด ๋„๊ตฌ ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ํ†ตํ•ด ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์ด GitLab CI/CD๊ฐ€ ํ†ตํ•ฉ๋œ GitLab ํ”Œ๋žซํผ ์ž์ฒด์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ–1. ์ธ๊ธฐ

GitLab CI/CD๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋น„๊ต์  ์ƒˆ๋กœ์šด ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. GitLab CI/CD๋Š” ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ์— ์‚ฌ์šฉ๋˜๋Š” ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” CI/CD ๋„๊ตฌ๊ฐ€ ์ฒœ์ฒœํžˆ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ GitLab ํ”Œ๋žซํผ์— ๋‚ด์žฅ๋œ ๋ฌด๋ฃŒ CI/CD ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

โ–2. GitLab Pages ๋ฐ Jekyll ์ง€์›

Jekyll์€ GitLab ํŽ˜์ด์ง€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ GitLab ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์†Œ์Šค ์ž๋ฃŒ๋ฅผ ๊ฐ€์ ธ์™€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ์„ฑํ’ˆ ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‚ฌ์ดํŠธ์˜ ๋ชจ์–‘๊ณผ ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. _config.yml, ์ง€ํ‚ฌ์—์„œ ์‚ฌ์šฉ.

โ–3. ํ”„๋กœ์ ํŠธ ๊ณ„ํš ๊ธฐ๋Šฅ

ํ”„๋กœ์ ํŠธ ๋‹จ๊ณ„๋ฅผ ๊ณ„ํšํ•˜๋Š” ๊ธฐ๋Šฅ ๋•๋ถ„์— ๋ฌธ์ œ ๋ฐ ๊ทธ๋ฃน ์ถ”์ ์˜ ํŽธ์˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์ž‘์—… ๊ตฌ์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŠน์ • ๋‚ ์งœ์— ๊ตฌํ˜„์„ ๊ณ„ํšํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–4. CI ๋Ÿฌ๋„ˆ์˜ ์ž๋™ ์Šค์ผ€์ผ๋ง

ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Ÿฌ๋„ˆ์˜ ์ž๋™ ํ™•์žฅ ๋•๋ถ„์— ์„œ๋ฒ„ ์šฉ๋Ÿ‰์„ ์ž„๋Œ€ํ•˜๋Š” ๋น„์šฉ์„ ํฌ๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ‘๋ ฌ๋กœ ํ…Œ์ŠคํŠธ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Š” ์—ฌ๋Ÿฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

โ–5. ๋ฌธ์ œ ์ถ”์  ๋„๊ตฌ

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

โ–6. ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œํ•œ

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

โ–7. ์ ๊ทน์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›

์ด ํ”Œ๋žซํผ๊ณผ ๋„๊ตฌ, ํŠนํžˆ GitLab CI/CD์˜ ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜๋Š” GitLab์„ ์ค‘์‹ฌ์œผ๋กœ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ GitLab CI/CD์™€ GitLab์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ ๋•๋ถ„์— GitLab CI/CD๋กœ ์ž‘์—…ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–8. ๋‹ค์–‘ํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์ง€์›

GitLab CI/CD๋Š” GitLab ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ˜ธ์ŠคํŒ…๋œ ์ฝ”๋“œ ์ด์ƒ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ GitLab CI/CD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitLab ๊ธฐ๋ฐ˜์œผ๋กœ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Jenkins์™€ GitLab CI/CD ๋น„๊ต

Jenkins์™€ GitLab CI/CD๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์›ํ™œํ•˜๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ข‹์€ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์„ ๋น„๊ตํ•ด๋ณด๋ฉด ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์œ ์‚ฌํ•˜์ง€๋งŒ ์–ด๋–ค ๋ฉด์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

ํŠน์„ฑ
์  ํ‚จ์Šค
GitLab CI / CD

์˜คํ”ˆ ์†Œ์Šค ๋˜๋Š” ํ์‡„ ์†Œ์Šค
์˜คํ”ˆ ์†Œ์Šค
์˜คํ”ˆ ์†Œ์Šค

์„ค์น˜
ํ•„์ˆ˜์˜.
์ด๊ฒƒ์€ GitLab ํ”Œ๋žซํผ์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…ํŠนํ•œ ๊ธฐ๋Šฅ
ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›.
๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ.

์ง€์›
๊ฒฐ์„.
์‚ฌ์šฉ ๊ฐ€๋Šฅ.

์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ
์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์–ด๋ ค์›€์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์‹œ์Šคํ…œ ์ž์ฒด ๋ฐฐํฌ
์ด๊ฒƒ์ด ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ง€์›๋ฉ๋‹ˆ๋‹ค.

CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋งŒ๋“ค๊ธฐ
Jenkins ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
์ง€์›๋ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง
๊ฒฐ์„.
์‚ฌ์šฉ ๊ฐ€๋Šฅ.

์ƒํƒœ๊ณ„
1000๊ฐœ๊ฐ€ ๋„˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์‹œ์Šคํ…œ์€ GitLab ๋‚ด์—์„œ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

API
๊ณ ๊ธ‰ API ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ์— ๋” ๊นŠ์ด ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ง€์›
์‚ฌ์šฉ ๊ฐ€๋Šฅ.
์‚ฌ์šฉ ๊ฐ€๋Šฅ.

๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ†ตํ•ฉ
๋‹ค๋ฅธ ๋„๊ตฌ ๋ฐ ํ”Œ๋žซํผ๊ณผ์˜ ํ†ตํ•ฉ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค(Slack, GitHub).
ํƒ€์‚ฌ ์‹œ์Šคํ…œ, ํŠนํžˆ GitHub ๋ฐ Kubernetes์™€์˜ ํ†ตํ•ฉ์„ ์œ„ํ•œ ๋งŽ์€ ๋„๊ตฌ.

์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ
์ง€์›๋จ - SonarQube ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ๊ธฐํƒ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ.
์ง€์›๋ฉ๋‹ˆ๋‹ค.

Jenkins์™€ GitLab CI/CD์˜ ์ฐจ์ด์ 

Jenkins์™€ GitLab CI/CD๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋น„๊ตํ•œ ํ›„ ์ด๋Ÿฌํ•œ DevOps ๋„๊ตฌ ๊ฐ„์˜ ์ฐจ์ด์ ์— ์ดˆ์ ์„ ๋งž์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์„ ์•Œ๋ฉด ์ด๋Ÿฌํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ๋„๊ตฌ๋ณด๋‹ค ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

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

Jenkins ๋ฐ GitLab CI/CD: ๊ฐ•์  ๋ฐ ์•ฝ์ 

์ด์ œ Jenkins์™€ GitLab CI/CD์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๋Ÿฌํ•œ ๋„๊ตฌ์— ๋Œ€ํ•ด ๋” ์ž˜ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋„๊ตฌ์˜ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์ด๋ฏธ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์„ ํ†ตํ•ด ์ž์‹ ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

โ–์  ํ‚จ์Šค์˜ ๊ฐ•์ 

  • ๋งŽ์€ ์ˆ˜์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ.
  • ๋„๊ตฌ ์„ค์น˜๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ๋Ÿฌ๋„ˆ์˜ ๊ฐ„๋‹จํ•œ ๋””๋ฒ„๊น….
  • ์‰ฌ์šด ๋…ธ๋“œ ์„ค์ •.
  • ์‰ฌ์šด ์ฝ”๋“œ ๋ฐฐํฌ.
  • ์•„์ฃผ ์ข‹์€ ์ž๊ฒฉ ์ฆ๋ช… ๊ด€๋ฆฌ ์‹œ์Šคํ…œ.
  • ์œ ์—ฐ์„ฑ๊ณผ ๋‹ค์–‘์„ฑ.
  • ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์€ ์ง๊ด€์ ์ธ ์ˆ˜์ค€์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ–์  ํ‚จ์Šค์˜ ์•ฝ์ 

  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‚ฌ์šฉํ•˜๊ธฐ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ Jenkins๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง์ ‘ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CI/CD ์ฒด์ธ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ถ„์„ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

โ–GitLab CI/CD์˜ ์žฅ์ 

  • Docker์™€ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋Ÿฌ๋„ˆ์˜ ๊ฐ„๋‹จํ•œ ์Šค์ผ€์ผ๋ง.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„์˜ ์ผ๋ถ€์ธ ์ž‘์—…์˜ ๋ณ‘๋ ฌ ์‹คํ–‰.
  • ์ž‘์—… ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋Ÿฌ๋„ˆ์˜ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์ธํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ํ™•์žฅ์„ฑ.
  • ์ž‘์—… ์ถ”๊ฐ€ ์šฉ์ด์„ฑ.
  • ๊ฐ„๋‹จํ•œ ์ถฉ๋Œ ํ•ด๊ฒฐ.
  • ์•ˆ์ •์ ์ธ ๋ณด์•ˆ ์‹œ์Šคํ…œ.

โ–GitLab CI/CD์˜ ๋‹จ์ 

  • ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ๊ฐœ๋ณ„ ๋‹จ๊ณ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

Jenkins์™€ GitLab CI/CD ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋‹ต์€ ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ํ•„์š”์™€ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๊ฒ€ํ† ํ•œ ๊ฐ CI/CD ๋„๊ตฌ๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— Jenkins๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋„๊ตฌ์ด๋ฉฐ GitLab CI/CD๋Š” ์ฝ”๋“œ ํ˜‘์—…์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ํ”Œ๋žซํผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

CI / CD ์‹œ์Šคํ…œ์„ ์„ ํƒํ•  ๋•Œ ๊ทธ ๊ธฐ๋Šฅ ์™ธ์—๋„ ๊ด€๋ จ ๋น„์šฉ๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” DevOps ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋ฐ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค CI/CD ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ?

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ

Jenkins์™€ GitLab CI/CD์˜ ์ „ํˆฌ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€