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

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

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

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

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

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

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

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

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

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

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

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์ดํŠธ์˜ ํŠน์ • ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ง€ํ‚ฌ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰ ์ค‘ /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์€ ์ •์  ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋„๊ตฌ์ด๋ฉฐ ์ตœ์ข… ์ด๋ฏธ์ง€์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์•„ํ‹ฐํŒฉํŠธ ์›Œํ”„, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ์ด๋ฏธ์ง€์—์„œ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ.

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

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

werf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ (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 ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ Go ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

{{ $_ := 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 Go ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ {{ $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 Registry ํ”„๋กœ์ ํŠธ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€์—์„œ ๊ณ„์† ์ปค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ฒฐ๊ณผ

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

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

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

PS

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

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster