์ฐ๋ฆฌ๋ ์ด๋ฏธ GitOps ๋๊ตฌ์ ๋ํด ์ฌ๋ฌ ๋ฒ ์ด์ผ๊ธฐํ์ต๋๋ค. , ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ ํ๋ก์ ํธ ์์ฒด์ ๋ฌธ์์ ํจ๊ป ์น์ฌ์ดํธ๋ฅผ ์กฐ๋ฆฝํ๋ ๊ฒฝํ์ ๊ณต์ ํ๊ณ ์ถ์ต๋๋ค. (๋ฌ์์์ด ๋ฒ์ ์ ). ์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ์ ์ ์ฌ์ดํธ์ด์ง๋ง, ๋ค์ํ ์์ ์ํฐํฉํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์๋ค๋ ์ ์์ ํฅ๋ฏธ๋กญ์ต๋๋ค.

์ฌ์ดํธ ๊ตฌ์กฐ์ ๋ฏธ๋ฌํ ๋ถ๋ถ์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋ฒ์ ์ ๋ํ ๊ณตํต ๋ฉ๋ด ์์ฑ, ๋ฆด๋ฆฌ์ค์ ๋ํ ์ ๋ณด๊ฐ ์๋ ํ์ด์ง ๋ฑ. ์์ธํ ๋ด์ฉ์ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค. ๋์ , ๋์ ๋น๋์ ๋ฌธ์ ์ ๊ณผ ์ธ๋ถ ์ฌํญ, ๊ทธ๋ฆฌ๊ณ ๊ด๋ จ CI/CD ํ๋ก์ธ์ค์ ๋ํด ๊ฐ๋ตํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๊ฐ: ์ฌ์ดํธ ์๋ ๋ฐฉ์
๋จผ์ , werf์ ๋ํ ์ค๋ช ์๊ฐ ์ฝ๋์ ํจ๊ป ์ ์ฅ๋์ด ์๋ค๋ ์ฌ์ค๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ด ๊ธฐ์ฌ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ํน์ ๋์์ธ ์๊ตฌ ์ฌํญ์ด ์ ์๋์ง๋ง ์ต์ํ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค.
- ์๋ก์ด werf ๊ธฐ๋ฅ์ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ง ์๊ณ ๋ ์ถ์๋์ด์๋ ์ ๋๋ฉฐ, ๋ฐ๋๋ก ๋ฌธ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ก์ด ๋ฒ์ ์ werf๊ฐ ์ถ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์ด ํ๋ก์ ํธ๋ ๋งค์ฐ ์ง์ค์ ์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค. ํ๋ฃจ์ ์ฌ๋ฌ ๋ฒ ์๋ก์ด ๋ฒ์ ์ด ์ถ์๋ ์ ์์ต๋๋ค.
- ์๋ก์ด ๋ฒ์ ์ ๋ฌธ์๋ฅผ ์ฌ์ดํธ์ ๋ฐฐํฌํ๊ธฐ ์ํ ์๋ ์์ ์ ์ ์ด๋ ์ง๋ฃจํ ์์ ์ ๋๋ค.
- ์ด ํ๋ก์ ํธ๋ ์๋ฏธ๋ก ์ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํฉ๋๋ค. , 5๊ฐ์ ์์ ์ฑ ์ฑ๋์ด ์์ต๋๋ค. ๋ฐฉ์ถ ๊ณผ์ ์๋ ์์ ์ฑ์ด ๋์์ง๋ ์์๋๋ก ์ฑ๋์ ํตํด ๋ฒ์ ์ ์์ฐจ์ ์ผ๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค. ์ํ์์ ์์์ฒ๋ผ ๋จ๋จํ ๊ฒ๊น์ง.
- ์ด ์ฌ์ดํธ์๋ ๋ฌ์์์ด ๋ฒ์ ์ด ์๋๋ฐ, ์ด ๋ฒ์ ์ ์ฃผ ๋ฒ์ (์ฆ, ์์ด)๊ณผ ๋์์ "์์กดํ๊ณ ๋ฐ์ "(์ฆ, ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ)ํฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ์ด ๋ชจ๋ "๋ด๋ถ ์๋"์ ์จ๊ธฐ๊ณ "๊ทธ๋ฅ ์๋ํ๋" ๊ฒ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ง๋ค์์ต๋๋ค. werf ์ค์น ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ๋ณ๋ ๋๊ตฌ -๊ฐ์ . ์ฌ์ฉํ๋ ค๋ ๋ฆด๋ฆฌ์ค ๋ฒํธ์ ์์ ํ ์ฑ๋์ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด multiwerf๊ฐ ํด๋น ์ฑ๋์ ์๋ก์ด ๋ฒ์ ์ด ์๋์ง ํ์ธํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํฉ๋๋ค.
์ต์ ๋ฒ์ ์ werf๋ ์ฌ์ดํธ์ ๋ฒ์ ์ ํ ๋ฉ๋ด์์ ๊ฐ ์ฑ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์์์ ์ต์ ๋ฆด๋ฆฌ์ค์ ๋ํ ๊ฐ์ฅ ์์ ์ ์ธ ์ฑ๋ ๋ฒ์ ์ด ์คํ๋์์ผ๋ฉฐ, ๊ฒ์ ์์ง์์๋ ์ธ๋ฑ์ฑ๋ฉ๋๋ค. ์ฑ๋์ ๋ํ ๋ฌธ์๋ ๋ณ๋์ ์ฃผ์์์ ์ ๊ณต๋ฉ๋๋ค(์: ๋ฒ ํ ๋ฆด๋ฆฌ์ค 1.0์ ๊ฒฝ์ฐ).
์ ์ฒด์ ์ผ๋ก ์ด ์ฌ์ดํธ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฒ์ ์ด ์์ต๋๋ค.
- ๋ฃจํธ(๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆผ),
- ๊ฐ ๋ฆด๋ฆฌ์ค์ ๊ฐ ํ์ฑ ์ ๋ฐ์ดํธ ์ฑ๋(์: ).
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ดํธ์ ํน์ ๋ฒ์ ์ ์์ฑํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ ์ปดํ์ผํ๋ฉด ๋ฉ๋๋ค. ๋๋ ํ ๋ฆฌ์์ ์คํ ์ค /docs werf ์ ์ฅ์ ํด๋น ๋ช
๋ น(jekyll build), ์ด์ ์ ํ์ํ ๋ฒ์ ์ Git ํ๊ทธ๋ก ์ ํํ์ต๋๋ค.
์ถ๊ฐํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ ํธ๋ฆฌํฐ ์์ฒด(werf)๋ ์กฐ๋ฆฝ์ ์ฌ์ฉ๋ฉ๋๋ค.
- CI/CD ํ๋ก์ธ์ค๋ GitLab CI๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค.
- ๋ฌผ๋ก ์ด ๋ชจ๋ ๊ฒ์ Kubernetes์์ ์คํ๋ฉ๋๋ค.
์์
์ด์ ์์์ ์ค๋ช ํ ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์์ ์ ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋ชจ๋ ์ ๋ฐ์ดํธ ์ฑ๋์์ werf ๋ฒ์ ์ ๋ณ๊ฒฝํ ํ ์ฌ์ดํธ์ ๋ฌธ์๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋์ด์ผ ํฉ๋๋ค..
- ๊ฐ๋ฐํ๋ ค๋ฉด ๋๋๋ก ๋ค์์ ์ํํ ์ ์์ด์ผ ํฉ๋๋ค. ์ฌ์ดํธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ณด๊ธฐ.
๋ชจ๋ ์ฑ๋์ ๋ฒ์ ์ ํด๋น Git ํ๊ทธ์์ ๋ณ๊ฒฝํ ํ์๋ ์ฌ์ดํธ๋ฅผ ๋ค์ ์ปดํ์ผํด์ผ ํ์ง๋ง ์ด๋ฏธ์ง๋ฅผ ์กฐ๋ฆฝํ๋ ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ป๊ฒ ๋ฉ๋๋ค.
- ์ฑ๋์ ๋ฒ์ ๋ชฉ๋ก์ด ๋ณ๊ฒฝ๋๋ฏ๋ก ๋ฒ์ ์ด ๋ณ๊ฒฝ๋ ์ฑ๋์ ๋ํ ๋ฌธ์๋ง ๋ค์ ์ปดํ์ผํ๋ฉด ๋ฉ๋๋ค. ๊ฒฐ๊ตญ, ๋ชจ๋ ๊ฒ์ ์ฒ์๋ถํฐ ๋ค์ ์กฐ๋ฆฝํ๋ ๊ฒ์ ๊ทธ๋ค์ง ์ข์ ์ผ์ด ์๋๋๋ค.
- ์ถ์ ์ฑ๋ ์ธํธ๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ ์์ ์์๋ ์ฑ๋์ ์ด๊ธฐ ์ก์ธ์ค 1.1 ๋ฆด๋ฆฌ์ค๋ณด๋ค ๋ ์์ ์ ์ธ ๋ฒ์ ์ด ์์ ์๋ ์์ง๋ง, ์๊ฐ์ด ์ง๋๋ฉด์ ๋ํ๋๊ฒ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋น๋๋ฅผ ์๋์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋์?
๊ทธ๊ฒ์ ๋ฐํ ๊ทธ ์ด์ ๋ธ๋ฆฌ๋ ์ธ๋ถ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค..
ะ ะตะฐะปะธะทะฐัะธั
์ ๊ทผ ๋ฐฉ์ ์ ํ
๋๋ Kubernetes์์ ํ์ํ ๊ฐ ๋ฒ์ ์ ๋ณ๋์ Pod๋ก ์คํํ ์ ์์ต๋๋ค. ์ด ์ต์ ์ ํด๋ฌ์คํฐ์ ๋ ๋ง์ ์์ ๊ฐ์ฒด๊ฐ ํฌํจ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ์์ ์ ์ธ werf ๋ฆด๋ฆฌ์ค ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฆ๊ฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ค์ ๋ ๋ณต์กํ ์ ์ง ๊ด๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ฐ ๋ฒ์ ์๋ ๋ถํ๊ฐ ์ ์ ์์ฒด HTTP ์๋ฒ๊ฐ ์์ต๋๋ค. ๋ฌผ๋ก , ์ด๋ ๋ ํฐ ์์ ๋น์ฉ์ ์๋ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ ๊ธธ์ ๊ฐ๋ค ํ๋์ ์ด๋ฏธ์ง์ ํ์ํ ๋ชจ๋ ๋ฒ์ ์ ๋น๋ํฉ๋๋ค.. ๋ชจ๋ ๋ฒ์ ์ ์ฌ์ดํธ์ ๋ํ ์ปดํ์ผ๋ ํต๊ณ๋ NGINX๊ฐ ์๋ ์ปจํ ์ด๋์ ์ ์ฅ๋๋ฉฐ, ํด๋น ๋ฐฐํฌ์ ๋ํ ํธ๋ํฝ์ NGINX Ingress๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ๊ฐ๋จํ ๊ตฌ์กฐ(๋ฌด์ํ ์ ํ๋ฆฌ์ผ์ด์ ) ๋๋ถ์ Kubernetes ์์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋ฅผ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค(๋ถํ์ ๋ฐ๋ผ ๋ค๋ฆ).
๋ ์ ํํ ๋งํ๋ฉด, ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์์งํฉ๋๋ค. ํ๋๋ ์์ฐ ํ๋ก๋ฅผ ์ํ ๊ฒ์ด๊ณ , ๋ ๋ฒ์งธ๋ ๊ฐ๋ฐ ํ๋ก๋ฅผ ์ํ ์ถ๊ฐ ์ด๋ฏธ์ง์ ๋๋ค. ์ถ๊ฐ ์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง์ ํจ๊ป ๊ฐ๋ฐ ํ๋ก์์๋ง ์ฌ์ฉ(์คํ)๋๋ฉฐ ๊ฒํ ์ปค๋ฐ์ ์ฌ์ดํธ ๋ฒ์ ์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋ ์ด๋ฏธ์ง ๊ฐ์ ๋ผ์ฐํ ์ Ingress ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
werf ๋ git ๋ณต์ ๋ณธ ๋ฐ ์ํฐํฉํธ
์์ ์ธ๊ธํ๋ฏ์ด, ํน์ ๋ฒ์ ์ ๋ฌธ์์ ๋ํ ์ฌ์ดํธ ํต๊ณ๋ฅผ ์์ฑํ๋ ค๋ฉด ์ ์ ํ ์ ์ฅ์ ํ๊ทธ๋ก ์ ํํ์ฌ ๋น๋ํด์ผ ํฉ๋๋ค. ๋น๋ํ ๋๋ง๋ค ์ ์ฅ์๋ฅผ ๋ณต์ ํ๊ณ ๋ชฉ๋ก์์ ์ ์ ํ ํ๊ทธ๋ฅผ ์ ํํ์ฌ ์ด ์์ ์ ์ํํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์๋นํ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจํ๋ ์์ ์ด๋ฉฐ, ๊ฒ๋ค๊ฐ ์ฌ์ํ์ง ์์ ๋ช ๋ น์ด๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋ ๋ค๋ฅธ ์ฌ๊ฐํ ๋จ์ ์ ์ด ์ ๊ทผ ๋ฐฉ์์์๋ ์ด์ ๋ธ๋ฆฌํ๋ ๋์ ์๋ฌด๊ฒ๋ ์บ์ํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ werf ์ ํธ๋ฆฌํฐ ์์ฒด๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋์ฐ๋ฉฐ ๋ค์์ ๊ตฌํํฉ๋๋ค. ์ค๋งํธ ์บ์ฑ ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค . werf๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด werf๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ์๋ฅผ ํ ๋ฒ ๋ณต์ ํ ๋ค์ ์คํํ๊ธฐ ๋๋ฌธ์ ๋น๋ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ๋ง fetch ํ์ํ๋ค๋ฉด. ๋ํ ์ ์ฅ์์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ ํ์ํ ๋๋ ํ ๋ฆฌ๋ง ์ ํํ ์ ์์ต๋๋ค(์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ์
๋๋ค) docs), ์ด๋ฅผ ํตํด ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ ์์ด ํฌ๊ฒ ์ค์ด๋ค ๊ฒ์
๋๋ค.
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 ํ๊ฒฝ ๋ณ์์์ ๊ฐ์ ํ ๋นํ์ฌ 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 ํ์ผ์
๋๋ค. (ํ์ดํ๋ผ์ธ์ ์คํํ ๋ ์ป์ ์ํฐํฉํธ). ์ฌ์ดํธ๋ฅผ ์ปดํ์ผํ ๋ ํ์ํ์ง๋ง ๊ธฐ์ฌ์ ๋งฅ๋ฝ์์๋ ์ํ๊ฐ ๋ค์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ์๊ฒ ํฅ๋ฏธ๋กญ์ต๋๋ค. ๋จ ํ๋์ ์ ๋ฌผ๋ง ์ฌ์กฐ๋ฆฝ โ ์ฌ์ดํธ์ ๋ฃจํธ ๋ฒ์ ์ ์ํฐํฉํธ(๋ค๋ฅธ ์ํฐํฉํธ์์๋ ํ์ํ์ง ์์).
์ด๋ ์กฐ๊ฑด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. if Go ํ
ํ๋ฆฟ ๋ฐ ๊ตฌ์ฑ ์์ {{ $Root.Files.Get "releases.yml" | sha256sum }} ๋ฌด๋์์ . ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฃจํธ ๋ฒ์ (๋ณ์)์ ๋ํ ์ํฐํฉํธ๋ฅผ ๋น๋ํ ๋ .Channel ๊ฐ๋ค root) ํ์ผ ํด์ releases.yml Ansible ์์
์ด๋ฆ(๋งค๊ฐ๋ณ์)์ ๊ตฌ์ฑ ์์์ด๋ฏ๋ก ์ ์ฒด ๋จ๊ณ์ ์๋ช
์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. name). ๋ฐ๋ผ์ ๋ณ๊ฒฝํ ๋ ์ฝํ
์ธ ํ์ผ releases.yml ํด๋น ์ ๋ฌผ์ด ๋ค์ ์กฐ๋ฆฝ๋ฉ๋๋ค.
์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ ๋๋ ์ฃผ์ํ์ธ์. ์ ๋ฌผ์ ์ด๋ฏธ์ง์์ , ๋๋ ํ ๋ฆฌ๋ง ์ถ๊ฐ๋ฉ๋๋ค /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 ํ๋ก์ ํธ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ์ด๋ฏธ์ง์์ ๊ณ์ ์ปค์ง์ง ์์ต๋๋ค.
์ค์ ์ ์ธ ๋ถ๋ถ์ ๋ง๋ฌด๋ฆฌํ๋ฉด์ ๊ธฐ์ฌ์ ์ ์ฒด ๋ชฉ๋ก์ด ๋ค์์์ ์ ๊ณต๋๋ค๋ ์ ์ ์๊ธฐ์์ผ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. :
- ;
- .
๊ฒฐ๊ณผ
- ์ฐ๋ฆฌ๋ ๋ ผ๋ฆฌ์ ์ธ ์กฐ๋ฆฝ ๊ตฌ์กฐ๋ฅผ ์ป์์ต๋๋ค. ๋ฒ์ ๋น ํ๋์ ์ํฐํฉํธ์ ๋๋ค.
- ์ด ์ด์ ๋ธ๋ฆฌ๋ ๋ณดํธ์ ์ด๋ฉฐ werf์ ์๋ก์ด ๋ฒ์ ์ด ์ถ์๋ ๋ ์๋์ผ๋ก ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ์ฌ์ดํธ์ ๋ฌธ์๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ์๋ก ๋ค๋ฅธ ์ค๊ณฝ์ ์ ๋ํด ๋ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์์ง๋์์ต๋๋ค.
- ์บ์ฑ์ ์ต๋ํ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค. werf์ ์ ๋ฒ์ ์ด ์ถ์๋๊ฑฐ๋ GitHub ํํฌ์์ ๊ฒํ ์ปค๋ฐ์ ์์ฒญํ๋ฉด ์์ ๋ ๋ฒ์ ์ด ํฌํจ๋ ํด๋น ์ํฐํฉํธ๋ง ๋ค์ ๋น๋๋ฉ๋๋ค.
- ์ฌ์ฉํ์ง ์๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. werf ์ ์ฑ ๊ธฐ๋ฐ ์ ๋ฆฌ๋ฅผ ํตํด Docker ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
- werf๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋ ์์ฒด์ ์ธ๋ถ ์ ์ฅ์์์ ์์ ํ ๋ ์บ์ฑ์ ๋ชจ๋ ์ฌ์ฉํ์ฌ ๋น๋ ์์ ์ ๋น ๋ฅด๊ฒ ์งํํ ์ ์์ต๋๋ค.
- ์ธ๋ถ Git ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค๋ฒ ์ ์ฒด ์ ์ฅ์๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ๊น๋ค๋ก์ด ์ต์ ํ ๋
ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํด๋ฅผ ๋ค์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. werf๋ ์บ์์ ๋ณต์ ๋ณธ์ ํ ๋ฒ๋ง ์ฌ์ฉํ ๋ค์ ์ฌ์ฉํฉ๋๋ค.
fetch๊ทธ๋ฆฌ๊ณ ๊ผญ ํ์ํ ๋๋ง. - ๋น๋ ๊ตฌ์ฑ ํ์ผ์์ Go ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ
werf.yaml์ธ๋ถ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ค๋ช ํ ์ ์์ต๋๋ค. - werf์์ ๋ง์ดํ ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ๊ณตํต์ ์ธ ์บ์ ๋๋ถ์ ์ํฐํฉํธ ์์ง ์๋๊ฐ ์๋นํ ๋นจ๋ผ์ง๋๋ค.
- werf๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ฆฌ ์์ ์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ํนํ ๋์ ๋น๋์ ์ค์ํฉ๋๋ค.
PS
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ";
- ยซ";
- ยซ";
- ยซ".
์ถ์ฒ : habr.com
