Werf ์ˆ˜์ง‘๊ธฐ์˜ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊น…: ์™œ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

Werf ์ˆ˜์ง‘๊ธฐ์˜ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊น…: ์™œ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์›Œํ”„ Kubernetes์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค GitOps CLI ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. ์•ˆ์— ๋ฆด๋ฆฌ์Šค v1.1 ์ด๋ฏธ์ง€ ์ˆ˜์ง‘๊ธฐ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋ณ„๋กœ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊ทธ ์ง€์ •. ์ง€๊ธˆ๊นŒ์ง€ werf์˜ ์ผ๋ฐ˜์ ์ธ ํƒœ๊น… ๋ฐฉ์‹์—๋Š” Git ํƒœ๊ทธ, Git ๋ธŒ๋žœ์น˜ ๋˜๋Š” Git ์ปค๋ฐ‹์„ ํ†ตํ•ด Docker ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฐฉ์‹์—๋Š” ์ƒˆ๋กœ์šด ํƒœ๊ทธ ์ง€์ • ์ „๋žต์œผ๋กœ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์ด๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ข‹์€์ง€๋Š” ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ Git ์ €์žฅ์†Œ์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์„ธํŠธ ๋กค์•„์›ƒ

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

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

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

Git ๋ธŒ๋žœ์น˜ ๋ฐ Git ํƒœ๊ทธ๋กœ ํƒœ๊ทธ ์ง€์ •

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํƒœ๊ทธ ์ง€์ • ์ „๋žต์ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธ ๋˜๋Š” ๋ถ„๊ธฐ. Git ๋ธŒ๋žœ์น˜์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€์—๋Š” ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์œผ๋กœ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—๋Š” ํ•ด๋‹น ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์œผ๋กœ ๊ฒŒ์‹œ๋œ ์ด๋ฏธ์ง€๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. Git ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ ํƒœ๊ทธ ์ด๋ฆ„์— ๋”ฐ๋ผ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜๋Š” ๋“ฑ ์ƒˆ Git ํƒœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ƒˆ Docker ํƒœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • myregistry.org/myproject/frontend:v1.1.10
  • myregistry.org/myproject/myservice1:v1.1.10
  • myregistry.org/myproject/myservice2:v1.1.10
  • myregistry.org/myproject/myservice3:v1.1.10
  • myregistry.org/myproject/myservice4:v1.1.10
  • myregistry.org/myproject/myservice5:v1.1.10
  • myregistry.org/myproject/database:v1.1.10

์ด๋Ÿฌํ•œ ์ƒˆ ์ด๋ฏธ์ง€ ์ด๋ฆ„์€ Helm ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด Kubernetes ๊ตฌ์„ฑ์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ werf deploy ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. image Kubernetes ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ๋ณ€๊ฒฝ๋œ ์ด๋ฏธ์ง€ ์ด๋ฆ„์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ: ์‹ค์ œ๋กœ ์ด์ „ ๋กค์•„์›ƒ(Git ํƒœ๊ทธ) ์ดํ›„ ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  Docker ํƒœ๊ทธ๋งŒ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์— ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•œ ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฌ์‹œ์ž‘์„ ์ˆ˜ํ–‰ํ•  ์‹ค์ œ ์ด์œ ๋Š” ์—†์—ˆ์ง€๋งŒ.

๊ฒฐ๊ณผ์ ์œผ๋กœ, ํ˜„์žฌ ํƒœ๊ทธ ์ง€์ • ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐœ๋ณ„ Git ์ €์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ์˜ ๋กค์•„์›ƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ณ„ํš์€ ๊ณผ๋ถ€ํ•˜๋˜๊ณ  ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์žฌ์‹œ์ž‘์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋งŽ์€ ์„œ๋น„์Šค๋ฅผ ๋‹จ์ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๊ฒฐํ•ฉํ•˜๊ณ  Docker ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Git ์ปค๋ฐ‹์œผ๋กœ ํƒœ๊ทธ ์ง€์ •

werf์—๋Š” Git ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ๋œ ํƒœ๊ทธ ์ง€์ • ์ „๋žต๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ Git ์ปค๋ฐ‹์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ Git ๋ธŒ๋žœ์น˜๋‚˜ Git ํƒœ๊ทธ๋กœ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋นˆ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ์ง€์˜ Docker ํƒœ๊ทธ๋Š” ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ์ง€์˜ Docker ํƒœ๊ทธ๋Š” ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์€ Git์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ปค๋ฐ‹์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€์˜ Docker ํƒœ๊ทธ๊ฐ€ ๋‹ค์‹œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ ์ง€์ • Git ๋ถ„๊ธฐ ์ด๋ฆ„์— ์ด๋ฏธ์ง€ ๋ฒ„์ „์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Git ๋ธŒ๋žœ์น˜์˜ ํƒœ๊ทธ ์ง€์ • ์ „๋žต๊ณผ ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹์ด ์‹œ๊ฐ„์ˆœ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜์ง‘๋˜๋Š” ํ•œ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๋ณ„ ํƒœ๊ทธ ์ง€์ •์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์— ์—ฐ์†์ ์œผ๋กœ ํ‘ธ์‹œํ•˜๋ฉด ์ด์ „ ์ปค๋ฐ‹์ด ์ƒˆ ์ปค๋ฐ‹๋ณด๋‹ค ๋Šฆ๊ฒŒ ์ปดํŒŒ์ผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๋Š” Git ๋ธŒ๋žœ์น˜ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ฒ„์ „์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” CI/CD ์‹œ์Šคํ…œ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด GitLab CI์—์„œ๋Š” ํ›„์ž์˜ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ผ๋ จ์˜ ์ปค๋ฐ‹์„ ์œ„ํ•ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์‹œ์Šคํ…œ์ด ์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด๋‹ค ์•ˆ์ •์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊ทธ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊ทธ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฝ˜ํ…์ธ ๋ณ„๋กœ ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Docker ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ Git ๊ธฐ๋ณธ ์š”์†Œ(Git ๋ถ„๊ธฐ, Git ํƒœ๊ทธ...)๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ด€๋ จ๋œ ์ฒดํฌ์„ฌ์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€์˜ ๋‚ด์šฉ. ์ด๋ฏธ์ง€ ID ํƒœ๊ทธ๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์„ ๋นŒ๋“œํ•  ๋•Œ ์ด๋ฏธ์ง€์˜ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ์‹๋ณ„์ž๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Git์—์„œ ์ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋‚ด์—ญ. Werf๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ Git ๋ธŒ๋žœ์น˜ ๋ฐ ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ๊ธฐ๋ก๊ณผ ์—ฐ๊ฒฐ๋œ ์ด๋ฏธ์ง€์—๋Š” ๋‹ค์–‘ํ•œ ID ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹๋ณ„์ž ํƒœ๊ทธ๋Š” ์†Œ์œ„ ์ด๋ฏธ์ง€์Šคํ…Œ์ด์ง€ ์‚ฌ์ธ.

๊ฐ ์ด๋ฏธ์ง€๋Š” ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. from, before-install, git-archive, install, imports-after-install, before-setup, ... git-latest-patch ๋“ฑ. ๊ฐ ๋‹จ๊ณ„์—๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๋Š” ์‹๋ณ„์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๋Œ€ ์„œ๋ช… (๋ฌด๋Œ€ ์‚ฌ์ธ).

์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ ์ตœ์ข… ์ด๋ฏธ์ง€์—๋Š” ์†Œ์œ„ ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„ ์„ธํŠธ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ผ๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋ฌด๋Œ€ ์„œ๋ช…, - ์ด๋Š” ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์ผ๋ฐ˜ํ™”๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์˜ ๊ฐ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด werf.yaml ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์ฒด ์„œ๋ช…๊ณผ ์ด์— ๋”ฐ๋ฅธ Docker ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด๋Œ€ ์„œ๋ช…์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋Š” ์ด์ œ ๊ถŒ์žฅ๋˜๋Š” ํƒœ๊ทธ ์ง€์ • ์ „๋žต์ด๋ฉฐ ๋ชจ๋“  CI ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ werf์˜ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

werf์—์„œ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด์ œ ๋ช…๋ น์— ํ•ด๋‹น ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. werf publish: --tag-by-stages-signature=true|false

CI ์‹œ์Šคํ…œ์—์„œ ํƒœ๊ทธ ์ง€์ • ์ „๋žต์€ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. werf ci-env. ์ด์ „์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. werf ci-env --tagging-strategy=tag-or-branch. ์ด์ œ ์ง€์ •ํ•˜๋ฉด werf ci-env --tagging-strategy=stages-signature ๋˜๋Š” ์ด ์˜ต์…˜์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด werf๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒœ๊ทธ ์ง€์ • ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. stages-signature. ํŒ€ werf ci-env ๋ช…๋ น์— ํ•„์š”ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. werf build-and-publish (๋˜๋Š” werf publish)์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ช…๋ น์—๋Š” ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature

...๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

์—ฌ๊ธฐ์— 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d ์ด๋ฏธ์ง€ ๋‹จ๊ณ„์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์ž…๋‹ˆ๋‹ค. backend๊ณผ f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - ์ด๋ฏธ์ง€ ๋‹จ๊ณ„์˜ ์„œ๋ช… frontend.

ํŠน์ˆ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ werf_container_image ะธ werf_container_env Helm ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ์ž๋™์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CI ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ ์˜ˆ:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด๋กœ

  • ์ƒˆ๋กœ์šด ์˜ต์…˜ werf publish --tag-by-stages-signature=true|false.
  • ์ƒˆ๋กœ์šด ์˜ต์…˜ ๊ฐ’ werf ci-env --tagging-strategy=stages-signature|tag-or-branch (์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ stages-signature).
  • ์ด์ „์— Git ์ปค๋ฐ‹์— ํƒœ๊ทธ ์ง€์ • ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ(WERF_TAG_GIT_COMMIT ๋˜๋Š” ์˜ต์…˜ werf publish --tag-git-commit COMMIT) ๊ทธ๋Ÿฐ ๋‹ค์Œ ํƒœ๊ทธ ์ง€์ • ์ „๋žต์œผ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”. ์Šคํ…Œ์ด์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜.
  • ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ ํƒœ๊ทธ ์ง€์ • ์ฒด๊ณ„๋กœ ์ฆ‰์‹œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • werf 1.1๋กœ ์ด์ „ํ•  ๋•Œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ์šด ํƒœ๊ทธ ์ง€์ • ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธ ๋˜๋Š” ๋ถ„๊ธฐ ์—ฌ์ „ํžˆ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ๊ธฐ๋ฐ˜ ํƒœ๊ทธ ์ง€์ •์€ ๊ธฐ์‚ฌ์—์„œ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋นˆ Git ์ปค๋ฐ‹์— ๋Œ€ํ•œ Docker ํƒœ๊ทธ ์ด๋ฆ„ ์ €ํ•ญ์ž…๋‹ˆ๋‹ค.
  • Git ์ปค๋ฐ‹์— ๋Œ€ํ•œ Docker ํƒœ๊ทธ ์ด๋ฆ„์˜ ๋ณต์›๋ ฅ์€ ์ด๋ฏธ์ง€์™€ ๊ด€๋ จ ์—†๋Š” ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • Git ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์ด์ „ Git ์ปค๋ฐ‹์— ๋Œ€ํ•œ ๋นŒ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ ์ด๋ฏธ์ง€์˜ ํ˜„์žฌ ๋ฒ„์ „์„ ์ •๋ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑธ ์จ! ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š” GitHub์˜์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ด์Šˆ๋ฅผ ์ฐพ๊ณ , ํ”Œ๋Ÿฌ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , PR์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ๋‹จ์ˆœํžˆ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ง€์ผœ๋ณด์„ธ์š”.

PS

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

์ถœ์ฒ˜ : habr.com

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