๋ฒ„์ „์ด ์ง€์ •๋œ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Werf๋ฅผ ์‚ฌ์šฉํ•œ Docker ์ด๋ฏธ์ง€์˜ ๋™์  ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ ๋ฐฐํฌ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ GitOps ๋„๊ตฌ์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ ์ด์ƒ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์›Œํ”„, ์ด๋ฒˆ์—๋Š” ํ”„๋กœ์ ํŠธ ์ž์ฒด์˜ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. werf.io (๋Ÿฌ์‹œ์•„์–ด ๋ฒ„์ „์€ en.werf.io). ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ •์  ์‚ฌ์ดํŠธ์ด์ง€๋งŒ ๋™์  ์ˆ˜์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ถ•๋œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „์ด ์ง€์ •๋œ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Werf๋ฅผ ์‚ฌ์šฉํ•œ Docker ์ด๋ฏธ์ง€์˜ ๋™์  ์–ด์…ˆ๋ธ”๋ฆฌ ๋ฐ ๋ฐฐํฌ

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

์†Œ๊ฐœ: ์‚ฌ์ดํŠธ ์ž‘๋™ ๋ฐฉ์‹

์šฐ์„  werf ๋ฌธ์„œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ธฐ์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ํŠน์ • ๊ฐœ๋ฐœ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ถ€๊ณผํ•˜์ง€๋งŒ ์ตœ์†Œํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ชจ๋“  "๋‚ด๋ถ€ ์ฃผ๋ฐฉ"์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆจ๊ธฐ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ "์ž‘๋™ํ•˜๋Š”" ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ werf ์„ค์น˜ ๋ฐ ์—…๋ฐ์ดํŠธ ๋„๊ตฌ -๊ฐ€์š” ๋‹ค์ธ์ข…. ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ์™€ ์•ˆ์ •์„ฑ ์ฑ„๋„์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด multiwerf๊ฐ€ ์ฑ„๋„์— ์ƒˆ ๋ฒ„์ „์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

ํ™ˆํŽ˜์ด์ง€ ๋ฒ„์ „ ์„ ํƒ ๋ฉ”๋‰ด์—์„œ๋Š” ๊ฐ ์ฑ„๋„๋ณ„ ์ตœ์‹  ๋ฒ„์ „์˜ werf๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์†Œ๋กœ werf.io/documentation ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์•ˆ์ •์ ์ธ ์ฑ„๋„ ๋ฒ„์ „์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ๋„ ์ƒ‰์ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ๋ณ„๋„์˜ ์ฃผ์†Œ(์˜ˆ: werf.io/v1.0-beta/documentation ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค 1.0์˜ ๊ฒฝ์šฐ).

์ „์ฒด์ ์œผ๋กœ ์‚ฌ์ดํŠธ์—๋Š” ๋‹ค์Œ ๋ฒ„์ „์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  1. ๋ฃจํŠธ(๊ธฐ๋ณธ์ ์œผ๋กœ ์—ด๋ฆผ),
  2. ๊ฐ ๋ฆด๋ฆฌ์Šค์˜ ๊ฐ ํ™œ์„ฑ ์—…๋ฐ์ดํŠธ ์ฑ„๋„์— ๋Œ€ํ•ด(์˜ˆ: werf.io/v1.0-beta).

ํŠน์ • ๋ฒ„์ „์˜ ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ง€ํ‚ฌ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰ํ•˜์—ฌ /docs werf ์ €์žฅ์†Œ ํ•ด๋‹น ๋ช…๋ น(jekyll build), ํ•„์š”ํ•œ ๋ฒ„์ „์˜ Git ํƒœ๊ทธ๋กœ ์ „ํ™˜ํ•œ ํ›„.

๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

  • ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ž์ฒด(werf)๊ฐ€ ์กฐ๋ฆฝ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • CI/CD ํ”„๋กœ์„ธ์Šค๋Š” GitLab CI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ์ด ๋ชจ๋“  ๊ฒƒ์€ Kubernetes์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ž‘์—…

์ด์ œ ์„ค๋ช…๋œ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜๋Š” ์ž‘์—…์„ ๊ณต์‹ํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์—…๋ฐ์ดํŠธ ์ฑ„๋„์—์„œ werf ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•œ ํ›„ ์‚ฌ์ดํŠธ์˜ ๋ฌธ์„œ๋Š” ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค..
  2. ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ๋•Œ๋•Œ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฒ„์ „ ๋ณด๊ธฐ.

ํ•ด๋‹น Git ํƒœ๊ทธ์—์„œ ์ฑ„๋„์˜ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•œ ํ›„ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์€ ๋ฐํ˜€ ๊ทธ ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค..

ะ ะตะฐะปะธะทะฐั†ะธั

์ ‘๊ทผ๋ฒ• ์„ ํƒ

๋˜๋Š” ํ•„์š”ํ•œ ๊ฐ ๋ฒ„์ „์„ Kubernetes์—์„œ ๋ณ„๋„์˜ Pod๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์•ˆ์ •์ ์ธ Werf ๋ฆด๋ฆฌ์Šค ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐœ์ฒด ์ˆ˜๊ฐ€ ๋” ๋งŽ์•„์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฐ๊ตญ ๋” ๋ณต์žกํ•œ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฒ„์ „์—๋Š” ์ž์ฒด HTTP ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ  ๋กœ๋“œ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ๋” ๋งŽ์€ ์ž์› ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๊ธธ์„ ํƒํ–ˆ์–ด์š” ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฒ„์ „์„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋ชจ์œผ๊ธฐ. ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ๋ฒ„์ „์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ ํ†ต๊ณ„๋Š” NGINX๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์— ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฐฐํฌ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์€ NGINX Ingress๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋น„์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด Kubernetes ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ(๋กœ๋“œ์— ๋”ฐ๋ผ)๋ฅผ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

werf ๋Œ€ git ํด๋ก  ๋ฐ ์•„ํ‹ฐํŒฉํŠธ

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

์—ฌ๊ธฐ์„œ๋Š” werf ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ž์ฒด๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋„์™€์„œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์Šค๋งˆํŠธ ์บ์‹ฑ ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์™ธ๋ถ€ ์ €์žฅ์†Œ. Werf๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ์†Œ์—์„œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋นŒ๋“œ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. werf๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €์žฅ์†Œ๋ฅผ ํ•œ ๋ฒˆ ๋ณต์ œํ•œ ๋‹ค์Œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ fetch ํ•„์š”ํ•˜๋‹ค๋ฉด. ๋˜ํ•œ ์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ํ•„์š”ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. docs), ์ถ”๊ฐ€๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

Jekyll์€ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋„๊ตฌ์ด๊ณ  ์ตœ์ข… ์ด๋ฏธ์ง€์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Jekyll์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์›Œํ”„ ์ธ๊ณต๋ฌผ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ์ด๋ฏธ์ง€์— ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ.

์šฐ๋ฆฌ๋Š” werf.yaml์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค

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

werf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ์ด๋™ ๊ตฌ์„ฑ ํŒŒ์ผ(werf.yaml) ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ฆ‰์‹œ ๊ตฌ์„ฑ ์ƒ์„ฑ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ(ํ•„์š”ํ•œ ๊ฒƒ!) ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„์ „ ๋ฐ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์ •๋ณด์ด๋ฉฐ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ ์ˆ˜์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. werf-doc ะธ werf-dev ๋‹ค๋ฅธ ํšŒ๋กœ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • RELEASES โ€” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ’ ๋ชฉ๋ก ํ˜•์‹์˜ ๋ฆด๋ฆฌ์Šค ๋ชฉ๋ก๊ณผ ํ•ด๋‹น ํ˜„์žฌ Werf ๋ฒ„์ „์ด ํฌํ•จ๋œ ์ค„ <ะะžะœะ•ะ _ะ ะ•ะ›ะ˜ะ—ะ>%<ะะžะœะ•ะ _ะ’ะ•ะ ะกะ˜ะ˜>. ์˜ˆ: 1.0%v1.0.4-beta.20
  • CHANNELS โ€” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ˜•์‹์˜ ๊ฐ’ ๋ชฉ๋ก ํ˜•์‹์œผ๋กœ ์ฑ„๋„ ๋ชฉ๋ก๊ณผ ํ•ด๋‹น ํ˜„์žฌ ๋ฒ„์ „์˜ werf๊ฐ€ ํฌํ•จ๋œ ์ค„ <ะšะะะะ›>%<ะะžะœะ•ะ _ะ’ะ•ะ ะกะ˜ะ˜>. ์˜ˆ: 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION โ€” ์‚ฌ์ดํŠธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ werf ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(ํ•ญ์ƒ ๊ฐ€์žฅ ๋†’์€ ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ๋กœ ๋ฌธ์„œ๋ฅผ ํ‘œ์‹œํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์˜ˆ: v1.0.4-beta.20
  • REVIEW_SHA โ€” ํ…Œ์ŠคํŠธ ๋ฃจํ”„์šฉ ๋ฒ„์ „์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒ€ํ†  ์ปค๋ฐ‹์˜ ํ•ด์‹œ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” GitLab CI ํŒŒ์ดํ”„๋ผ์ธ์— ์ฑ„์›Œ์ง€๋ฉฐ, ์•„๋ž˜์—๋Š” ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ํŽธ์˜์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค. werf.yaml ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋กœ ์ด๋™ํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }}

์‚ฌ์ดํŠธ์˜ ์ •์  ๋ฒ„์ „์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‹ฐํŒฉํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ(๋ฃจํŠธ ๋ฒ„์ „ ์ƒ์„ฑ ๋ฐ ๊ฐœ๋ฐœ ํšŒ๋กœ์šฉ ๋ฒ„์ „ ํฌํ•จ)์— ๋Œ€ํ•ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„์˜ ๋ธ”๋ก์œผ๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. define - ํ›„์† ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด include. ํ…œํ”Œ๋ฆฟ์— ๋‹ค์Œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • Version โ€” ์ƒ์„ฑ๋œ ๋ฒ„์ „(ํƒœ๊ทธ ์ด๋ฆ„)
  • Channel โ€” ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์—…๋ฐ์ดํŠธ ์ฑ„๋„์˜ ์ด๋ฆ„
  • Commit โ€” ๊ฒ€ํ†  ์ปค๋ฐ‹์„ ์œ„ํ•ด ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ์ปค๋ฐ‹ ํ•ด์‹œ์ž…๋‹ˆ๋‹ค.
  • ๋ฌธ๋งฅ.

์•„ํ‹ฐํŒฉํŠธ ํ…œํ”Œ๋ฆฟ ์„ค๋ช…

{{- define "doc_artifact" -}}
{{- $Root := index . "Root" -}}
artifact: doc-{{ .Channel }}
from: jekyll/builder:3
mount:
- from: build_dir
  to: /usr/local/bundle
ansible:
  install:
  - shell: |
      export PATH=/usr/jekyll/bin/:$PATH
  - name: "Install Dependencies"
    shell: bundle install
    args:
      executable: /bin/bash
      chdir: /app/docs
  beforeSetup:
{{- if .Commit }}
  - shell: echo "Review SHA - {{ .Commit }}."
{{- end }}
{{- if eq .Channel "root" }}
  - name: "releases.yml HASH: {{ $Root.Files.Get "releases.yml" | sha256sum }}"
    copy:
      content: |
{{ $Root.Files.Get "releases.yml" | indent 8 }}
      dest:  /app/docs/_data/releases.yml
{{- else }}
  - file:
      path: /app/docs/_data/releases.yml
      state: touch
{{- end }}
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/
    - /app/ru_site/
  - file:
      dest: /app/docs/pages_ru/cli
      state: link
      src: /app/docs/pages/cli
  - shell: |
      echo -e "werfVersion: {{ .Version }}nwerfChannel: {{ .Channel }}" > /tmp/_config_additional.yml
      export PATH=/usr/jekyll/bin/:$PATH
{{- if and (ne .Version "review") (ne .Channel "root") }}
{{- $_ := set . "BaseURL" ( printf "v%s" .Channel ) }}
{{- else if ne .Channel "root" }}
{{- $_ := set . "BaseURL" .Channel }}
{{- end }}
      jekyll build -s /app/docs  -d /app/_main_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/tmp/_config_additional.yml
      jekyll build -s /app/docs  -d /app/_ru_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/app/docs/_config_ru.yml,/tmp/_config_additional.yml
    args:
      executable: /bin/bash
      chdir: /app/docs
git:
- url: https://github.com/flant/werf.git
  to: /app/
  owner: jekyll
  group: jekyll
{{- if .Commit }}
  commit: {{ .Commit }}
{{- else }}
  tag: {{ .Version }}
{{- end }}
  stageDependencies:
    install: ['docs/Gemfile','docs/Gemfile.lock']
    beforeSetup: '**/*'
  includePaths: 'docs'
  excludePaths: '**/*.sh'
{{- end }}

์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฑ„๋„ ์ด๋ฆ„(๋ณ€์ˆ˜ ๊ฐ’)์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .Channel)๋ฅผ ์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„์˜ ์ ‘๋ฏธ์‚ฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. artifact: doc-{{ .Channel }}. ํ•˜์ง€๋งŒ ์•„ํ‹ฐํŒฉํŠธ์—์„œ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์„ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ๋‹ค์Œ werf ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„ค์น˜. ์„œ๋น„์Šค ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋งˆ์šดํŠธ build_dir ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์‚ฌ์ด์— Jekyll ์บ์‹œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์กฐ๋ฆฝ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค..

ํŒŒ์ผ์˜ ์‚ฌ์šฉ์„ ์•Œ์•„์ฐจ๋ ธ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. releases.yml ๋‹ค์Œ์—์„œ ์š”์ฒญํ•œ ๋ฆด๋ฆฌ์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ YAML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. github.com (ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•  ๋•Œ ์–ป์€ ์•„ํ‹ฐํŒฉํŠธ) ์‚ฌ์ดํŠธ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ํ•„์š”ํ•˜์ง€๋งŒ ๊ธฐ์‚ฌ์˜ ๋งฅ๋ฝ์—์„œ๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋‹จ ํ•˜๋‚˜์˜ ์œ ๋ฌผ์„ ์žฌ์กฐ๋ฆฝ โ€” ์‚ฌ์ดํŠธ ๋ฃจํŠธ ๋ฒ„์ „์˜ ์•„ํ‹ฐํŒฉํŠธ(๋‹ค๋ฅธ ์•„ํ‹ฐํŒฉํŠธ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Œ)

์ด๋Š” ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. if ํ…œํ”Œ๋ฆฟ ๋ฐ ๋””์ž์ธ ์ด๋™ {{ $Root.Files.Get "releases.yml" | sha256sum }} ๋ฌด๋Œ€์—์„œ ๋‹จ๊ณ„. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค: ๋ฃจํŠธ ๋ฒ„์ „์— ๋Œ€ํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ(๋ณ€์ˆ˜ .Channel ๊ฐ™๋‹ค root) ํŒŒ์ผ ํ•ด์‹œ releases.yml Ansible ์ž‘์—… ์ด๋ฆ„์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ์ „์ฒด ๋‹จ๊ณ„์˜ ์„œ๋ช…์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค(๋งค๊ฐœ๋ณ€์ˆ˜ name). ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฝ˜ํ…์ธ  ํŒŒ์ผ releases.yml ํ•ด๋‹น ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์žฌ์กฐ๋ฆฝ๋ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์ €์žฅ์†Œ ์ž‘์—…์—๋„ ์ฃผ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์œ ๋ฌผ์˜ ์ด๋ฏธ์ง€์—์„œ werf ์ €์žฅ์†Œ, ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค /docs, ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ํ•„์ˆ˜ ํƒœ๊ทธ ๋˜๋Š” ๋ฆฌ๋ทฐ ์ปค๋ฐ‹์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ‰์‹œ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ด์Šˆ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋œ ์ฑ„๋„ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์˜ ์ด์Šˆ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฃจํ”„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. .WerfVersions ะฒ werf.yaml:

{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}

์™œ๋ƒํ•˜๋ฉด ๋ฃจํ”„๋Š” ์—ฌ๋Ÿฌ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ ‡๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค). ์ด๋“ค ์‚ฌ์ด์˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ(์‹œํ€€์Šค)๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --- (๊ตฌ์„ฑ ํŒŒ์ผ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜). ์•ž์„œ ์ •์˜ํ•œ ๋Œ€๋กœ ๋ฃจํ”„์—์„œ ํ…œํ”Œ๋ฆฟ์„ ํ˜ธ์ถœํ•  ๋•Œ ๋ฒ„์ „ ๋งค๊ฐœ๋ณ€์ˆ˜, URL ๋ฐ ๋ฃจํŠธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์œ ์‚ฌํ•˜์ง€๋งŒ ๋ฃจํ”„ ์—†์ด "ํŠน์ˆ˜ ์‚ฌ๋ก€"(๋ฃจํŠธ ๋ฒ„์ „ ๋ฐ ๊ฒ€ํ†  ์ปค๋ฐ‹์˜ ๋ฒ„์ „)์— ๋Œ€ํ•œ ์•„ํ‹ฐํŒฉํŠธ ํ…œํ”Œ๋ฆฟ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root  | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root  | include "doc_artifact" }}
{{- end }}

๋ฆฌ๋ทฐ ์ปค๋ฐ‹์„ ์œ„ํ•œ ์•„ํ‹ฐํŒฉํŠธ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. .WerfReviewCommit.

์œ ๋ฌผ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

Kubernetes์—์„œ ์‹คํ–‰๋˜๋„๋ก ์„ค๊ณ„๋œ ์ตœ์ข… ์ด๋ฏธ์ง€๋Š” ์„œ๋ฒ„ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์ถ”๊ฐ€๋œ ์ผ๋ฐ˜ NGINX์ž…๋‹ˆ๋‹ค. nginx.conf ๊ทธ๋ฆฌ๊ณ  ์ธ๊ณต๋ฌผ๋กœ๋ถ€ํ„ฐ์˜ ์ •์ . ์‚ฌ์ดํŠธ ๋ฃจํŠธ ๋ฒ„์ „์˜ ์•„ํ‹ฐํŒฉํŠธ ์™ธ์—๋„ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .WerfVersions ์ฑ„๋„ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด + ์ด์ „์— ์ฑ„ํƒํ•œ ์•„ํ‹ฐํŒฉํŠธ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ ์•„ํ‹ฐํŒฉํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ์–ธ์–ด๋กœ ์‚ฌ์ดํŠธ ๋ฒ„์ „์„ ์ €์žฅํ•˜๋ฏ€๋กœ ๊ตฌ์„ฑ์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ„์น˜๋กœ ์ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ตœ์ข… ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์„ค๋ช… werf-doc

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Setup /etc/nginx/nginx.conf"
    copy:
      content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/assets
    - /app/ru_site/assets
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_main_site
  to: /app/main_site/v{{ $Channel }}
  before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_ru_site
  to: /app/ru_site/v{{ $Channel }}
  before: setup
{{ end -}}

๊ธฐ๋ณธ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœ ํšŒ๋กœ์—์„œ ์‹คํ–‰๋˜๋Š” ์ถ”๊ฐ€ ์ด๋ฏธ์ง€์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์˜ ์‚ฌ์ดํŠธ๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฒ€ํ†  ์ปค๋ฐ‹์˜ ๋ฒ„์ „๊ณผ ์‚ฌ์ดํŠธ์˜ ๋ฃจํŠธ ๋ฒ„์ „(์ผ๋ฐ˜ ์ž์‚ฐ์ด ์žˆ์œผ๋ฉฐ ๊ธฐ์–ตํ•˜๋Š” ๊ฒฝ์šฐ) , ๋ฆด๋ฆฌ์Šค ๋ฐ์ดํ„ฐ). ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€ ์ด๋ฏธ์ง€๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์„น์…˜(๋ฐ ์ด๋ฆ„)์—์„œ๋งŒ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

image: werf-dev
...
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{- if .WerfReviewCommit  }}
- artifact: doc-review
  add: /app/_main_site
  to: /app/main_site/review
  before: setup
- artifact: doc-review
  add: /app/_ru_site
  to: /app/ru_site/review
  before: setup
{{- end }}

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋ฆฌ๋ทฐ ์ปค๋ฐ‹์„ ์œ„ํ•œ ์•„ํ‹ฐํŒฉํŠธ๋Š” ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. REVIEW_SHA. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด werf-dev ์ด๋ฏธ์ง€๊ฐ€ ์ „ํ˜€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. REVIEW_SHA, ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ •์ฑ…์— ๋”ฐ๋ฅธ ์ฒญ์†Œ werf์˜ Docker ์ด๋ฏธ์ง€๋Š” werf-dev ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ๋ฒ„์ „ ์•„ํ‹ฐํŒฉํŠธ(์–ด์จŒ๋“  ์ด๋ฏธ ๋นŒ๋“œ๋จ)๋กœ๋งŒ ๋นŒ๋“œ๋˜๋„๋ก ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

์กฐ๋ฆฝ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค! CI/CD์™€ ์ค‘์š”ํ•œ ๋‰˜์•™์Šค๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

GitLab CI์˜ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๋™์  ๋นŒ๋“œ ๊ธฐ๋Šฅ

๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. werf.yaml. ์ด๋Š” GitHub ํ›„ํฌ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ˜ธ์ถœํ•  ๋•Œ ์„ค์ •ํ•˜๊ฒŒ ๋  REVIEW_SHA ๋ณ€์ˆ˜์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Bash ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•„์š”ํ•œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. generate_artifacts, ๋‘ ๊ฐœ์˜ GitLab ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ั„ะฐะนะป releases.yml ๋ฆด๋ฆฌ์Šค ๋ฐ์ดํ„ฐ๋กœ,
  • ั„ะฐะนะป common_envs.sh, ๋‚ด๋ณด๋‚ผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋‚ด์šฉ generate_artifacts ๋‹น์‹ ์€ ์šฐ๋ฆฌ์˜์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์˜ˆ์ œ๊ฐ€ ์žˆ๋Š” ์ €์žฅ์†Œ. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๊ธฐ์‚ฌ์˜ ์ฃผ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. common_envs.sh ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— werf์˜ ์ž‘์—…์€ ๊ทธ๊ฒƒ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ์˜ ์˜ˆ:

export RELEASES='1.0%v1.0.6-4'
export CHANNELS='1.0-alpha%v1.0.7-1 1.0-beta%v1.0.7-1 1.0-ea%v1.0.6-4 1.0-stable%v1.0.6-4 1.0-rock-solid%v1.0.6-4'
export ROOT_VERSION='v1.0.6-4'

์˜ˆ๋ฅผ ๋“ค์–ด Bash ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ์˜ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. source.

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

์ฆ‰, ์‚ฌ์ดํŠธ ์ด๋ฏธ์ง€๋ฅผ ์กฐ๋ฆฝํ•˜๋Š” ๋™์•ˆ ๋ฆด๋ฆฌ์Šค์™€ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋™์ผํ•˜๊ณ  ๋ฐฐํฌ ์‹œ ์ƒˆ ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค๋˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ƒˆ ๋ฒ„์ „์˜ ๊ฒฐ๊ณผ๋ฌผ์€ ์•„์ง ๊ตฌ์ถ•๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์„ธ๋Œ€๋ผ๋ฉด werf.yaml ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ(์˜ˆ: ํ˜„์žฌ ๋ฒ„์ „ ๋ชฉ๋ก)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์„ฑ๊ณผ ๊ฐ’์€ ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์— ๊ธฐ๋ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์™ธ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋ฐ ๊ธฐ๋ก GitLab ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ(์‚ฌ์ „ ๋นŒ๋“œ) ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์ถ”๊ฐ€๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. GitLab CI ์•„ํ‹ฐํŒฉํŠธ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋™์ผํ•œ ๊ตฌ์„ฑ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…(๋นŒ๋“œ, ๋ฐฐํฌ, ์ •๋ฆฌ)์„ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. werf.yaml.

๋ฌด๋Œ€์˜ ๋‚ด์šฉ ์‚ฌ์ „ ๋นŒ๋“œ ํŒŒ์ผ .gitlab-ci.yml:

Prebuild:
  stage: prebuild
  script:
    - bash ./generate_artifacts 1> common_envs.sh
    - cat ./common_envs.sh
  artifacts:
    paths:
      - releases.yml
      - common_envs.sh
    expire_in: 2 week

์•„ํ‹ฐํŒฉํŠธ์˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•œ ํ›„์—๋Š” ํ‘œ์ค€ GitLab CI ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„์ธ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. werf GitHub ์ €์žฅ์†Œ์˜ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ์ž์ฒด๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, GitHub ์ €์žฅ์†Œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ). ์ด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์„น์…˜์˜ GitLab ํ”„๋กœ์ ํŠธ ์†์„ฑ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CI/CD ์„ค์ • -> ํŒŒ์ดํ”„๋ผ์ธ ํŠธ๋ฆฌ๊ฑฐ์„ ํด๋ฆญํ•œ ๋‹ค์Œ GitHub์—์„œ ํ•ด๋‹น Webhook๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์„ค์ • -> ์›นํ›…).

๋นŒ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Build:
  stage: build
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf build-and-publish --stages-storage :local
  except:
    refs:
      - schedules
  dependencies:
    - Prebuild

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

๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ๋Š” YAML ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํšŒ๋กœ์™€ ๊ฐœ๋ฐœ ํšŒ๋กœ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

.base_deploy: &base_deploy
  stage: deploy
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf deploy --stages-storage :local
  dependencies:
    - Prebuild
  except:
    refs:
      - schedules

Deploy to Production:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: prod
  environment:
    name: production
    url: werf.io
  only:
    refs:
      - master
  except:
    variables:
      - $REVIEW_SHA
    refs:
      - schedules

Deploy to Test:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: dev
  environment:
    name: test
    url: werf.test.flant.com
  except:
    refs:
      - schedules
  only:
    variables:
      - $REVIEW_SHA

์ž‘์—…์€ ๋ณธ์งˆ์ ์œผ๋กœ werf๊ฐ€ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ ์—์„œ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(WERF_KUBE_CONTEXT), ๋ฃจํ”„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •(environment.name ะธ environment.url), ์ด๋Š” Helm ์ฐจํŠธ ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ…œํ”Œ๋ฆฟ์˜ ๋‚ด์šฉ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๋ฌธ์ œ์˜ ์ฃผ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ์ด ์—†์ง€๋งŒ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ ์ €์žฅ์†Œ.

์ตœ์ข… ํ„ฐ์น˜

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

๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฒญ์†Œ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. .gitlab-ci.yml;
  • ์ฒญ์†Œ ์ž‘์—…์˜ ์ฃผ๊ธฐ์  ์‹คํ–‰์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์“ฐ๊ธฐ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒญ์†Œ ๋‹จ๊ณ„ ์ถ”๊ฐ€ .gitlab-ci.yml:

Cleanup:
  stage: cleanup
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - docker login -u nobody -p ${WERF_IMAGES_CLEANUP_PASSWORD} ${WERF_IMAGES_REPO}
    - werf cleanup --stages-storage :local
  only:
    refs:
      - schedules

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์กฐ๊ธˆ ๋” ๋†’๊ฒŒ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌํ•˜๋ ค๋ฉด ๋จผ์ € Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ž๋™์œผ๋กœ ๋ฐœํ–‰๋œ GitLab CI ์ž‘์—… ํ† ํฐ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌํ•œ ๊ถŒ๋ฆฌ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค). ํ† ํฐ์€ GitLab์—์„œ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๊ทธ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. WERF_IMAGES_CLEANUP_PASSWORD ๊ณ„ํš (CI/CD ์„ค์ • -> ๋ณ€์ˆ˜).

ํ•„์š”ํ•œ ์ผ์ •์— ๋”ฐ๋ผ ์ฒญ์†Œ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. CI/CD ->
์ผ์ •
.

๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค. Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋กœ ์ธํ•ด ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋ถ€๋ถ„์ด ๋๋‚˜๋ฉด ๊ธฐ์‚ฌ์˜ ์ „์ฒด ๋ชฉ๋ก์ด ๋‹ค์Œ์—์„œ ์ œ๊ณต๋œ๋‹ค๋Š” ์ ์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํž˜๋‚ด:

๊ฒฐ๊ณผ

  1. ๋ฒ„์ „๋‹น ํ•˜๋‚˜์˜ ์•„ํ‹ฐํŒฉํŠธ์ธ ๋…ผ๋ฆฌ์  ์–ด์…ˆ๋ธ”๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  2. ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ๋ณดํŽธ์ ์ด๋ฉฐ werf์˜ ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋  ๋•Œ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์›น ์‚ฌ์ดํŠธ์˜ ๋ฌธ์„œ๋Š” ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋กœ ๋‹ค๋ฅธ ์œค๊ณฝ์„ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ์กฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  4. ํšจ๊ณผ๊ฐ€ ๋นจ๋ฆฌ ๋‚˜์˜ค๊ฑฐ๋“ ์š”. ์บ์‹ฑ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. werf์˜ ์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜๊ฑฐ๋‚˜ ๊ฒ€ํ†  ์ปค๋ฐ‹์„ ์œ„ํ•ด GitHub ํ›„ํฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ๋ฒ„์ „์ด ์žˆ๋Š” ํ•ด๋‹น ์•„ํ‹ฐํŒฉํŠธ๋งŒ ๋‹ค์‹œ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
  5. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ์‚ญ์ œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. werf ์ •์ฑ…์— ๋”ฐ๋ผ ์ •๋ฆฌํ•˜๋ฉด Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

  • werf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด์…ˆ๋ธ”๋ฆฌ ์ž์ฒด์˜ ์บ์‹ฑ๊ณผ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋กœ ์ž‘์—…ํ•  ๋•Œ์˜ ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ ์ „์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๊นŒ๋‹ค๋กœ์šด ์ตœ์ ํ™” ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. werf๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณต์ œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. fetch ํ•„์š”ํ•  ๋•Œ๋งŒ.
  • ๋นŒ๋“œ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ Go ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ werf.yaml ๊ฒฐ๊ณผ๊ฐ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • mount in werf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํŒŒ์ดํ”„๋ผ์ธ์— ๊ณตํ†ต์ ์ธ ์บ์‹œ๋กœ ์ธํ•ด ์•„ํ‹ฐํŒฉํŠธ ์ˆ˜์ง‘ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • werf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋™์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ๋•Œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

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