ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

์šฐ๋ฆฌ ๊ฐœ๋ฐœ ํŒ€ ์ค‘ ํ•œ ํŒ€์˜ ํŒ€์žฅ์ด ์ „๋‚  ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์„ ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฒŒ์‹œํ–ˆ๋‹ค. ์•ฝ 20๋ถ„ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋ฐ์ดํŠธ ์š”์ฒญ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๊ผญ ํ•„์š”ํ•œ ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐฑ์‹ ํ–ˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„์ด ๋” ์ง€๋‚˜๋ฉด... ์Œ, ๋‹ค์Œ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”์ง€ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๋‚˜๋Š” ๊ฝค ๊ฒŒ์œผ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ด์ „์— ์ด๊ฒƒ์„ ์ธ์ •ํ•˜์ง€ ์•Š์•˜๋‚˜์š”? ์•„๋‹ˆ์š”?) ํŒ€ ๋ฆฌ๋”๊ฐ€ ๋ชจ๋“  CI/CD๊ฐ€ ์žˆ๋Š” Jenkins์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•˜์—ฌ ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ! ๋‚˜๋Š” ๋†๋‹ด์„ ๊ธฐ์–ตํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฃผ๋ฉด ํ•˜๋ฃจ ๋™์•ˆ ๋จน์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์—๊ฒŒ Fed๋ฅผ ๋ถ€๋ฅด๋ฉด ๊ทธ๋Š” ํ‰์ƒ Fed๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ”๋‹ค ์ง์žฅ์—์„œ ์žฅ๋‚œ์„ ์น˜๋‹ค, ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ์ถ•๋œ ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํฌํ•จ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ Kuber์— ๋ฐฐํฌํ•˜๊ณ  ๋ชจ๋“  ๊ฐ’์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ENV (๊ณผ๊ฑฐ์— ์˜์–ด ๊ต์‚ฌ์˜€๋˜ ๋ฌธํ—Œํ•™์ž์˜€๋˜ ๋‚˜์˜ ํ• ์•„๋ฒ„์ง€๋Š” ์ด์ œ ์ด ๋ฌธ์žฅ์„ ์ฝ์€ ํ›„ ๊ด€์ž๋†€์ด์—์„œ ์†๊ฐ€๋ฝ์„ ๋Œ๋ฆฌ๋ฉฐ ๋‚˜๋ฅผ ๋งค์šฐ ํ‘œ์ •์žˆ๊ฒŒ ๋ฐ”๋ผ๋ณด๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค).

๊ทธ๋ž˜์„œ ์ด ๋…ธํŠธ์—์„œ๋Š” ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐฐ์› ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ž‘์—… ์ž์ฒด ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…์—์„œ Jenkins์˜ ์ž‘์—…์„ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  2. Jenkins ์—์ด์ „ํŠธ๊ฐ€ ์„ค์น˜๋œ ๋…ธ๋“œ์—์„œ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”(Cloud Shell)์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. Google Kubernetes Engine์— ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.


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

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

๋ถ€์ธ ์„ฑ๋ช…: 1. ๋ฉ”๋ชจ๋Š” ์—ญํ• ์— ๋Œ€ํ•ด "๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด" ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ• ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€์—์„œ "์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋” ์ข‹์•˜์„ ํ…๋ฐ"๋ผ๋Š” ์˜ต์…˜์„ ์ฝ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.
2. ๋…ธํŠธ์˜ ์ ์šฉ๋œ ๋ถ€๋ถ„์ด ์†Œ๊ธˆ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋ฉด ์ด์ „ ๋…ธํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๋…ธํŠธ๋„ ์•ฝํ•œ ์†Œ๊ธˆ ์šฉ์•ก์ž…๋‹ˆ๋‹ค.

Jenkins์—์„œ ์ž‘์—… ์„ค์ •์„ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ

๊ท€ํ•˜์˜ ์งˆ๋ฌธ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋™์  ์ž‘์—… ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ทธ๊ฒƒ๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

์ €๋Š” ์ •๋ง ๊ฒŒ์œผ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Misha, ๋ฐฐํฌ๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค! ์‚ดํŽด๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์ผ๋ถ€ ์ž‘์—… ์‹œ์ž‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‚˜๋Š” ๋ชจ๋“  ์ผ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์„ ํƒํ•  ๊ฐ’ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ ํƒ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Jenkins์—์„œ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ชฉ๋ก์—์„œ ๋ฒ„์ „์„ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ENV, ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ Container Registry์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฑฐ๊ธฐ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Cuber์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…๋Ÿ‰ ์ž‘์—…์— ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์˜ต์…˜์ด ๊ทธ๋ฆฌ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰์‹œ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

  • Jenkins๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์›๊ฒฉ ์•ก์„ธ์Šค API๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์›๊ฒฉ ์ €์žฅ์†Œ ํด๋”์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ JFrog Artifactory์ด๋ฉฐ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์  ํ‚จ์Šค ์›๊ฒฉ ์•ก์„ธ์Šค API

ํ™•๋ฆฝ๋œ ์šฐ์ˆ˜ํ•œ ์ „ํ†ต์— ๋”ฐ๋ฅด๋ฉด, ๊ธด ์„ค๋ช…์€ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๋ฝ์˜ ์ผ๋ถ€๋งŒ ๋ฌด๋ฃŒ๋กœ ๋ฒˆ์—ญํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ์˜ ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€:

Jenkins๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์›๊ฒฉ ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. <โ€ฆ> ์›๊ฒฉ ์•ก์„ธ์Šค๋Š” REST์™€ ์œ ์‚ฌํ•œ ์Šคํƒ€์ผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹จ์ผ ์ง„์ž…์ ์ด ์—†๊ณ  ๋Œ€์‹  '.../api/", ์–ด๋”” "..."๋Š” API ๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๋ฐฐํฌ ์ž‘์—…์ด ๋‹ค์Œ ์œ„์น˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, ์ด ์ž‘์—…์— ๋Œ€ํ•œ API ํœ˜ํŒŒ๋žŒ์„ ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

๋‹ค์Œ์œผ๋กœ, ์ถœ๋ ฅ์„ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ๋ฐ›์„์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ API๋Š” ํ•„ํ„ฐ๋ง๋งŒ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ XML์— ์ค‘์ ์„ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ž‘์—… ์‹คํ–‰ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์ด๋ฆ„(์ด๋ฆ„ ํ‘œ์‹œํ•˜๊ธฐ) ๋ฐ ๊ทธ ๊ฒฐ๊ณผ(๊ฒฐ๊ณผ):

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]

๊ทธ๊ฒƒ์€ ๋ฐํ˜€์กŒ๋‹ค?

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

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']

์„ฑ๊ณต ๋ชฉ๋ก ์Šคํฌ๋ฆฐ์ƒท
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

๊ธ€์Ž„, ์žฌ๋ฏธ๋กœ ํ•„ํ„ฐ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ์†์ด์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ (ํ•„ํ„ฐ๋Š” ๊ฑฐ์ง“๋ง์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!) "์‹คํŒจํ•œ" ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']

์‹คํŒจํ•œ ๋ชฉ๋ก์˜ ์Šคํฌ๋ฆฐ์ƒท
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

์›๊ฒฉ ์„œ๋ฒ„์— ์žˆ๋Š” ํด๋”์˜ ๋ฒ„์ „ ๋ชฉ๋ก

๋ฒ„์ „ ๋ชฉ๋ก์„ ์–ป๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Jenkins API์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋นŒ๋“œ๋˜๋ฉด ํ•ด๋‹น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํŒจํ‚ค์ง€๋˜์–ด ์ €์žฅ์†Œ์˜ ์ ์ ˆํ•œ ํด๋”์— ๋ฐฐ์น˜๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ €์žฅ์†Œ๋Š” ์ž‘์—… ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ข‹๋‹ค. ๊ทธ๋Ÿผ, ๊ทธ์—๊ฒŒ ์–ด๋–ค ๋ฒ„์ „์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ๋ฌผ์–ด๋ด…์‹œ๋‹ค. ์›๊ฒฉ ํด๋”๋ฅผ ์ปฌ๋งํ•˜๊ณ , grepํ•˜๊ณ , awkํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ oneliner์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ์ค„ ๋ช…๋ น
๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ํ—ค๋”์— ์—ฐ๊ฒฐ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ ํด๋”์˜ ๋ชจ๋“  ๋ฒ„์ „์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•œ ๋‹ฌ ์ด๋‚ด์— ์ƒ์„ฑ๋œ ๋ฒ„์ „๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ํ˜„์‹ค๊ณผ ํ•„์š”์— ๋งž๊ฒŒ ๋ช…๋ น์„ ํŽธ์ง‘ํ•˜์‹ญ์‹œ์˜ค.

curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

Jenkins์—์„œ ์ž‘์—… ๋ฐ ์ž‘์—… ๊ตฌ์„ฑ ํŒŒ์ผ ์„ค์ •

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

์กฐ๋ฆฝ ์ž‘์—… ์„ค์ •์„ ์—ด๊ณ  ๋งจ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์‹ญ์‹œ์˜ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”: ๋นŒ๋“œ ๋‹จ๊ณ„ ์ถ”๊ฐ€ -> ์กฐ๊ฑด๋ถ€ ๋‹จ๊ณ„(๋‹จ์ผ). ๋‹จ๊ณ„ ์„ค์ •์—์„œ ์กฐ๊ฑด์„ ์„ ํƒํ•˜์„ธ์š”. ํ˜„์žฌ ๋นŒ๋“œ ์ƒํƒœ, ๊ฐ’์„ ์„ค์ • ์„ฑ๊ณต, ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์‰˜ ๋ช…๋ น ์‹คํ–‰.

์ด์ œ ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Jenkins๋Š” ์ž‘์—… ๊ตฌ์„ฑ์„ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. XML ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๊ธธ์„ ๋”ฐ๋ผ http://ะฟัƒั‚ัŒ-ะดะพ-ะทะฐะดะฐะฝะธั/config.xml ๋”ฐ๋ผ์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํŽธ์ง‘ํ•œ ํ›„ ์›๋ž˜ ์œ„์น˜์— ๋‹ค์‹œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ๋ชฉ๋ก์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋กœ ์œ„์—์„œ ๋™์˜ํ–ˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. BUILD_VERSION?

๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๊ทธ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ์ž๋ฆฌ์— ์žˆ๊ณ  ์›ํ•˜๋Š” ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท.

config.xml ์กฐ๊ฐ์€ ๋™์ผํ•˜๊ฒŒ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Choices ์š”์†Œ์˜ ๋‚ด์šฉ์ด ์•„์ง ๋ˆ„๋ฝ๋œ ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ 
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? ์ด์ œ ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ์‹คํ–‰๋  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฒ„์ „ ๋ชฉ๋ก์„ ์ˆ˜์‹ ํ•˜๊ณ , ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ํ•„์š”ํ•œ ์œ„์น˜์— ๋ฒ„์ „ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์˜ˆ. ์ข‹์•„์š”. ๋ฒ„์ „ ๋ชฉ๋ก์ด ์ด๋ฏธ ์žˆ๋Š” ๊ณณ์— XML๋กœ ๋ฒ„์ „ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(ํ–ฅํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•œ ํ›„ ์ž‘์„ฑ ์˜ˆ์ •). ๋‚˜๋Š” ์„ธ์ƒ์— ์•„์ง๋„ ์ •๊ทœ์‹์„ ์—ด๊ด‘์ ์œผ๋กœ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์—๊ฒŒ ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜ํ•ด์ฃผ์„ธ์š” xmlstarler ๊ตฌ์„ฑ์ด ํŽธ์ง‘๋  ๋จธ์‹ ์—. sed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XML์„ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผ ํ•  ํฐ ๋Œ€๊ฐ€๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜์—๋Š” ์œ„์˜ ์‹œํ€€์Šค๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์›๊ฒฉ ์„œ๋ฒ„์˜ ํด๋”์— ์žˆ๋Š” ๋ฒ„์ „ ๋ชฉ๋ก์„ ๊ตฌ์„ฑ์— ์”๋‹ˆ๋‹ค.

#!/bin/bash
############## ะกะบะฐั‡ะธะฒะฐะตะผ ะบะพะฝั„ะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั‚ ะดะปั ัะฟะธัะบะฐ ะฒะตั€ัะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ะงะธั‚ะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท ั€ะตะฟะพะทะธั‚ะพั€ะธั
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

############## ะŸะธัˆะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั‚ ะทะฐ ัะปะตะผะตะฝั‚ะพะผ ะฒ ะบะพะฝั„ะธะณ
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ะšะปะฐะดะตะผ ะบะพะฝั„ะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ะŸั€ะธะฒะพะดะธะผ ั€ะฐะฑะพั‡ะตะต ะผะตัั‚ะพ ะฒ ะฟะพั€ัะดะพะบ
rm -f appConfig.xml

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

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

#!/bin/bash
############## ะกะบะฐั‡ะธะฒะฐะตะผ ะบะพะฝั„ะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั‚ ะดะปั ัะฟะธัะบะฐ ะฒะตั€ัะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ะŸะธัˆะตะผ ะฒ ั„ะฐะนะป ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml

############## ะงะธั‚ะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')

############## ะŸะธัˆะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั‚ ะทะฐ ัะปะตะผะตะฝั‚ะพะผ ะฒ ะบะพะฝั„ะธะณ
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ะšะปะฐะดะตะผ ะบะพะฝั„ะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ะŸั€ะธะฒะพะดะธะผ ั€ะฐะฑะพั‡ะตะต ะผะตัั‚ะพ ะฒ ะฟะพั€ัะดะพะบ
rm -f appConfig.xml

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

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์™„๋ฃŒ๋œ ๋ฒ„์ „ ๋ชฉ๋ก
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ๋‹ค๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์œผ์‹ญ์‹œ์˜ค. ์‰˜ ๋ช…๋ น ์‹คํ–‰ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell์— ์—ฐ๊ฒฐ

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

์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. "์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ" ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ตณ์ด ๊ท€์ฐฎ๊ฒŒ ํ•  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”? ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”, ๊ทธ๋ ‡์ฃ ? ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์—์„œ Jenkins ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ ๊ฑฐ๊ธฐ์—์„œ ํ๋ธŒ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Google์€ ์ธํ”„๋ผ ๋‚ด์— ๋งค์šฐ ํ’๋ถ€ํ•œ ์ฑ„๋„์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์–ด ๋ฐฐํฌ ์†๋„์— ์œ ์ตํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€ํด๋ผ์šฐ๋“œ ๋ฐ ์•ก์„ธ์Šค ๊ถŒํ•œ Google ํด๋ผ์šฐ๋“œ API ์ด์™€ ๋™์ผํ•œ ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์งˆ VM ์ธ์Šคํ„ด์Šค์˜ ๊ฒฝ์šฐ.

Google Cloud๊ฐ€ ์•„๋‹Œ ์—ฐ๊ฒฐ์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด
Google์€ ์„œ๋น„์Šค์—์„œ ๋Œ€ํ™”ํ˜• ์ธ์ฆ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด *nix๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  ์ฝ˜์†” ์ž์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปคํ”ผ ๋จธ์‹ ์—์„œ๋„ ์ฝ˜์†”์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋…ธํŠธ์˜ ํ‹€ ๋‚ด์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜๊ฒฌ์„ ์ ์–ด์ฃผ์„ธ์š”. ์ถฉ๋ถ„ํ•œ ํ‘œ๋ฅผ ์–ป์œผ๋ฉด ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์ดํ›„์— ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ์—ฐ๊ฒฐํ•  VM ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์Šคํ„ด์Šค ์„ธ๋ถ€์ •๋ณด๋ฅผ ์—ด๊ณ  ํด๋ฆญํ•˜์„ธ์š”. ์ˆ˜์ •.
  3. ํŽ˜์ด์ง€ ๋งจ ์•„๋ž˜์—์„œ ์ธ์Šคํ„ด์Šค ์•ก์„ธ์Šค ๋ฒ”์œ„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  Cloud API์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค ๊ถŒํ•œ.

    ์Šคํฌ๋ฆฐ ์ƒท
    ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

  4. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

VM ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด SSH๋ฅผ ํ†ตํ•ด VM์— ์—ฐ๊ฒฐํ•˜๊ณ  ์˜ค๋ฅ˜ ์—†์ด ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

gcloud alpha cloud-shell ssh

์„ฑ๊ณต์ ์ธ ์—ฐ๊ฒฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

GKE์— ๋ฐฐํฌ

์šฐ๋ฆฌ๋Š” IaC(Infrastucture as a Code)๋กœ ์™„์ „ํžˆ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์œผ๋ฏ€๋กœ docker ํŒŒ์ผ์€ Git์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•œํŽธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ์˜ ๋ฐฐํฌ๋Š” ์ด ์ž‘์—…์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” yaml ํŒŒ์ผ๋กœ ์„ค๋ช…๋˜๋ฉฐ, ๊ทธ ์ž์ฒด๋„ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ˜๋Œ€ํŽธ์—์„œ ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ทจํ•ฉ๋‹ˆ๋‹ค BUILD_VERSION ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌ๋  ๋ณ€์ˆ˜์˜ ๊ฐ’ ENV.
  2. Git์—์„œ dockerfile์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐฐํฌ์šฉ yaml์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. scp๋ฅผ ํ†ตํ•ด ์ด ๋‘ ํŒŒ์ผ์„ ๋ชจ๋‘ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฑฐ๊ธฐ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  6. ๋กœ๋“œ ๋ฐฐํฌ ํŒŒ์ผ์„ ํ๋ธŒ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด์ž. ์ผ๋‹จ ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜์ž ENV, ๋‹ค์Œ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜1 ะธ ๋งค๊ฐœ๋ณ€์ˆ˜2. ๋ฐฐํฌ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜.

์Šคํฌ๋ฆฐ ์ƒท
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

๊ฐ„๋‹จํ•œ ๋ฆฌ๋””๋ ‰์…˜์œผ๋กœ yaml์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—์ฝ” ํŒŒ์ผ๋กœ. ๋ฌผ๋ก  dockerfile์— ๋‹ค์Œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜1 ะธ ๋งค๊ฐœ๋ณ€์ˆ˜2๋กœ๋“œ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ต‰์žฅํ•œ ์•ฑ, ์ง€์ •๋œ ๋ฒ„์ „์„ ์ ์šฉํ•œ ์กฐ๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋„์ค‘์— gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION์–ด๋””์—์„œ $BUILD_VERSION ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ์ด(๊ฐ€) ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ๋ชฉ๋ก

touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo "  name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo "  replicas: 1" >> deploy.yaml
echo "  selector:" >> deploy.yaml
echo "    matchLabels:" >> deploy.yaml
echo "      run: awesomeapp" >> deploy.yaml
echo "  template:" >> deploy.yaml
echo "    metadata:" >> deploy.yaml
echo "      labels:" >> deploy.yaml
echo "        run: awesomeapp" >> deploy.yaml
echo "    spec:" >> deploy.yaml
echo "      containers:" >> deploy.yaml
echo "      - name: awesomeapp" >> deploy.yaml
echo "        image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo "        env:" >> deploy.yaml
echo "        - name: PARAM1" >> deploy.yaml
echo "          value: $PARAM1" >> deploy.yaml
echo "        - name: PARAM2" >> deploy.yaml
echo "          value: $PARAM2" >> deploy.yaml

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•œ ํ›„ Jenkins ์—์ด์ „ํŠธ gcloud ์•ŒํŒŒ cloud-shell SSH ๋Œ€ํ™”ํ˜• ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. --๋ช…๋ น.

์ด์ „ dockerfile์—์„œ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์˜ ํ™ˆ ํด๋”๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"

scp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ dockerfile์„ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์˜ ํ™ˆ ํด๋”์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ , Container Registry์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"

๋ฐฐํฌ ํŒŒ์ผ์—์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์€ ๋ฐฐํฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์ƒ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(awsm-ํด๋Ÿฌ์Šคํ„ฐ) ๋ฐ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„(๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ), ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค.

gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project && 
kubectl apply -f deploy.yaml"

์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์ฝ˜์†” ์ถœ๋ ฅ์„ ์—ด๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์กฐ๋ฆฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ ์ƒท
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

๊ทธ๋ฆฌ๊ณ  ์กฐ๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์„ฑ๊ณต์ ์ธ ๋ฐฐํฌ

์Šคํฌ๋ฆฐ ์ƒท
ํ”Œ๋Ÿฌ๊ทธ์ธ, SMS, ๋“ฑ๋ก ์—†์ด GKE์—์„œ ๋ฐฐํฌ ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์  ํ‚จ์Šค์˜ ์žฌํ‚ท ์†์„ ๋“ค์—ฌ๋‹ค๋ณด์ž

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

๊ฒฐ๋ก  ๋Œ€์‹ 

์œ„์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜๋Š” ์—†์—ˆ์ง€๋งŒ Jenkins์˜ muuulion์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ๋‚˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋‚˜๋Š” ์ ˆ๋ง ๋•Œ๋ฌธ์— ๊ทธ๋“ค์—๊ฒŒ ์˜์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์ถœ์ฒ˜ : habr.com

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