์ฌ์์ฑ๋๋ Go ๋ฐฑ์๋๋ฅผ ์ํ CI/CD: ๋น๋, ํ ์คํธ, ๋ง์ด๊ทธ๋ ์ด์ , ๋ฐฐํฌ
Go ๋ฐฑ์๋๋ฅผ ์ํ CI/CD: ๋น๋, ํ ์คํธ, ๋ง์ด๊ทธ๋ ์ด์ , Kubernetes ๋๋ VM์ ์์ ํ๊ฒ ๋ฐฐํฌํ๋ ์ค์ฉ์ ํ์ดํ๋ผ์ธ ๋จ๊ณ์ ์์ธก ๊ฐ๋ฅํ ํ๊ฒฝ ์ค์ .

Why CI/CD matters for Go backends you regenerate
์๋ ๋ฐฐํฌ๋ ์ง๋ฃจํ๊ณ ๋ฐ๋ณต์ ์ธ ๋ฐฉ์์ผ๋ก ์คํจํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ก์ปฌ์์ ๋ค๋ฅธ Go ๋ฒ์ ์ผ๋ก ๋น๋ํ๊ฑฐ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ๋นผ๋จน๊ณ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฑด๋๋ฐ๊ฑฐ๋ ์๋ชป๋ ์๋น์ค๋ฅผ ์ฌ์์ํฉ๋๋ค. ๋ฆด๋ฆฌ์ค๋ โ๋ด ํ๊ฒฝ์์๋ ์๋ํ๋๋ฐโ ํ๋ก๋์ ์์๋ ๋์ํ์ง ์๊ณ , ์ฌ์ฉ์๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ๋์์ผ ์๊ฒ ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ์์ฑ(์ฌ์์ฑ)ํ๋ค๊ณ ํด๋ ๋ฆด๋ฆฌ์ค ๊ท์จ์ด ํ์ ์์ด์ง์ง๋ ์์ต๋๋ค. ์๊ตฌ์ฌํญ์ ์ ๋ฐ์ดํธํ ๋ค ๋ฐฑ์๋๋ฅผ ์ฌ์์ฑํ๋ฉด, ์์์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ง์ง์ง ์์๋ ์๋ก์ด ์๋ํฌ์ธํธ๋ ๋ฐ์ดํฐ ํํ, ์์กด์ฑ์ด ์๊ธธ ์ ์์ต๋๋ค. ๋ฐ๋ก ๊ทธ๋ ํ์ดํ๋ผ์ธ์ด ์์ ์ฅ์น์ฒ๋ผ ์๋ํด์ผ ํฉ๋๋ค: ๋ชจ๋ ๋ณ๊ฒฝ์ ๋งค๋ฒ ๋์ผํ ๊ฒ์ฌ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
์์ธก ๊ฐ๋ฅํ ํ๊ฒฝ์ ๋น๋์ ๋ฐฐํฌ ๋จ๊ณ๊ฐ ์ด๋ฆ ๋ถ์ผ ์ ์๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ์กฐ๊ฑด์์ ์คํ๋๋ค๋ ๋ป์ ๋๋ค. ๋ช ๊ฐ์ง ๊ท์น๋ง ์ง์ผ๋ ๋๋ถ๋ถ ํด๊ฒฐ๋ฉ๋๋ค:
- ๋ฒ์ ๊ณ ์ (Go ํด์ฒด์ธ, ๋ฒ ์ด์ค ์ด๋ฏธ์ง, OS ํจํค์ง).
- ํ ๋ฒ ๋น๋ํด์ ๋์ผํ ์ํฐํฉํธ๋ฅผ ๋ชจ๋ ๊ณณ์ ๋ฐฐํฌ.
- ์ค์ ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ ๋๊ธฐ(ํ๊ฒฝ ๋ณ์ ๋๋ ํ๊ฒฝ๋ณ ์ค์ ํ์ผ).
- ๋ชจ๋ ํ๊ฒฝ์์ ๊ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ๋๊ตฌ์ ํ๋ก์ธ์ค ์ฌ์ฉ.
- ๋กค๋ฐฑ์ ํ์ค์ ์ผ๋ก ๋ง๋ค๊ธฐ: ์ด์ ์ํฐํฉํธ๋ฅผ ๋ณด๊ดํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ์๊ธฐ.
Go ๋ฐฑ์๋๋ฅผ ์ํ CI/CD์ ๋ชฉ์ ์ ์๋ํ ์์ฒด๊ฐ ์๋๋๋ค. ์ฌํ ๊ฐ๋ฅํ ๋ฆด๋ฆฌ์ค๋ก ์คํธ๋ ์ค๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค: ์ฌ์์ฑํ๊ณ ํ์ดํ๋ผ์ธ์ ์คํํ๋ฉด, ๋์ค๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ขฐํ๊ณ ๋ฐฐํฌํ ์ ์๊ฒ ๋๋ ๊ฒ๋๋ค.
AppMaster์ฒ๋ผ Go ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ ๋๊ตฌ๋ฅผ ์ด๋ค๋ฉด ์ด ์ ์ ๋ ์ค์ํฉ๋๋ค. ์ฌ์์ฑ์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง ๋ณ๊ฒฝ์์ ํ๋ก๋์ ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ผ๊ด๋๊ณ ํ ์คํธ๋๋ฉฐ ์์ธก ๊ฐ๋ฅํ ๋๋ง ์์ ํ๊ฒ ๋๊ปด์ง๋๋ค.
Pick your runtime and define โpredictableโ upfront
โ์์ธก ๊ฐ๋ฅโํ๋ค๋ ๊ฒ์ ๊ฐ์ ์ ๋ ฅ์ด ์ด๋์ ์คํํ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค๋ ๋ป์ ๋๋ค. Go ๋ฐฑ์๋๋ฅผ ์ํ CI/CD์์๋ ๊ฐ๋ฐ, ์คํ ์ด์ง, ํ๋ก๋์ ์ฌ์ด์ ๋ฌด์์ ๋์ผํ๊ฒ ์ ์งํ ์ง ๋ฏธ๋ฆฌ ํฉ์ํ๋ ๊ฒ์์ ์์ํฉ๋๋ค.
๋ณดํต ๋นํํ ํญ๋ชฉ์ Go ๋ฒ์ , ๋ฒ ์ด์ค OS ์ด๋ฏธ์ง, ๋น๋ ํ๋๊ทธ, ์ค์ ์ด ๋ก๋๋๋ ๋ฐฉ์์ ๋๋ค. ์ด ์ค ํ๋๋ผ๋ ํ๊ฒฝ๋ง๋ค ๋ฌ๋ผ์ง๋ฉด TLS ๋์ ์ฐจ์ด, ๋๋ฝ๋ ์์คํ ํจํค์ง, ํ๋ก๋์ ์์๋ง ๋๋ฌ๋๋ ๋ฒ๊ทธ ๊ฐ์ ๊น์ง ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
ํ๊ฒฝ ๊ฐ ๋๋ฆฌํํธ๋ ๋ณดํต ๋ค์ ์ง์ ์์ ๋๋ฌ๋ฉ๋๋ค:
- OS์ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ค๋ฅธ ๋ฐฐํฌํ ๋ฒ์ , ๋๋ฝ๋ CA ์ธ์ฆ์, ์๊ฐ๋ ์ฐจ์ด)
- ์ค์ ๊ฐ(๊ธฐ๋ฅ ํ๋๊ทธ, ํ์์์, ํ์ฉ๋ ์ค๋ฆฌ์ง, ์ธ๋ถ ์๋น์ค ์ฃผ์)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํ์ ์ค์ (๋ง์ด๊ทธ๋ ์ด์ , ํ์ฅ ๊ธฐ๋ฅ, ์ ๋ ฌ๋ฒ, ์ฐ๊ฒฐ ์ ํ)
- ์ํฌ๋ฆฟ ์ฒ๋ฆฌ(์ ์ฅ ์์น, ํ์ ๋ฐฉ์, ๋๊ฐ ์ฝ์ ์ ์๋์ง)
- ๋คํธ์ํฌ ๊ฐ์ (DNS, ๋ฐฉํ๋ฒฝ, ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ)
Kubernetes์ VM ์ค ๋ฌด์์ ์ ํํ ์ง๋ โ๋ฌด์์ด ๋ ์ข๋คโ๊ฐ ์๋๋ผ ํ์ด ์ฐจ๋ถํ๊ฒ ์ด์ํ ์ ์๋์ง์ ๊ดํ ๋ฌธ์ ์ ๋๋ค.
Kubernetes๋ ์คํ ์ค์ผ์ผ๋ง, ๋กค๋ง ์ ๋ฐ์ดํธ, ์ฌ๋ฌ ์๋น์ค๋ฅผ ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์ด์ํด์ผ ํ ๋ ์ ํฉํฉ๋๋ค. ํ๋๊ฐ ๋์ผํ ์ด๋ฏธ์ง์์ ์คํ๋๋ฏ๋ก ์ผ๊ด์ฑ ์ ์ง์๋ ๋์์ด ๋ฉ๋๋ค. VM์ ์๋น์ค๊ฐ ํ๋ ๋๋ ์์์ด๊ณ , ์์ ํ์ด๋ฉฐ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ฒ ์ ์งํ๊ณ ์ถ์ ๋ ๋ง์ ์ ์์ต๋๋ค.
๋ฐํ์์ด ๋ฌ๋ผ๋ ์ํฐํฉํธ์ ๊ทธ ๊ณ์ฝ์ ํ์คํํ๋ฉด ํ์ดํ๋ผ์ธ์ ๋์ผํ๊ฒ ์ ์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด: CI์์ ํญ์ ๋์ผํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ๊ฐ์ ํ ์คํธ ๋จ๊ณ๋ฅผ ์คํํ๋ฉฐ ๊ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ๋ฒ๋ค์ ๊ณต๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐฐํฌ ๋จ๊ณ๋ง ๋ฌ๋ผ์ง๋๋ค: Kubernetes๋ ์ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์ ์ฉํ๊ณ , VM์ ์ด๋ฏธ์ง๋ฅผ ํ๋งํด ์๋น์ค๋ฅผ ์ฌ์์ํฉ๋๋ค.
์ค์ฉ์ ์: ํ์ด AppMaster์์ Go ๋ฐฑ์๋๋ฅผ ์ฌ์์ฑํ๊ณ ์คํ ์ด์ง์ Kubernetes์, ํ๋ก๋์ ์ ๋น๋ถ๊ฐ VM์ ๋ฐฐํฌํ๋ค๊ณ ํฉ์๋ค. ๋ ๋ค ์ ํํ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ํ๋งํ๊ณ ๊ฐ์ ์ข ๋ฅ์ ์ํฌ๋ฆฟ ์คํ ์ด์์ ์ค์ ์ ๋ก๋ํ๋ฉด โ๋ค๋ฅธ ๋ฐํ์โ์ ๋ฒ๊ทธ์ ์์ธ์ด ์๋๋ผ ๋ฐฐํฌ์ ์ธ๋ถ์ฌํญ์ด ๋ฉ๋๋ค. AppMaster(appmaster.io)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ฆฌํ ํด๋ผ์ฐ๋ ๋์์ผ๋ก ๋ฐฐํฌํ๊ฑฐ๋ ์์ค ์ฝ๋๋ฅผ ๋ด๋ณด๋ด ๋์ผํ ํ์ดํ๋ผ์ธ์ ์์ฒด ์ธํ๋ผ์์ ์คํํ ์ ์์ด ์ด ๋ชจ๋ธ์ ์ ๋ง์ต๋๋ค.
A simple pipeline map you can explain to anyone
์์ธก ๊ฐ๋ฅํ ํ์ดํ๋ผ์ธ์ ์ค๋ช ํ๊ธฐ ์ฝ์ต๋๋ค: ์ฝ๋๋ฅผ ํ์ธํ๊ณ , ๋น๋ํ๊ณ , ์๋์ ์ฆ๋ช ํ๊ณ , ํ ์คํธํ ์ ํํ ๊ฒ์ ๋ฐฐํฌํ๊ณ , ๋งค๋ฒ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํฉ๋๋ค. ์ด ๋ช ๋ฃ์ฑ์ ๋ฐฑ์๋๊ฐ ์ฌ์์ฑ๋๋ ๊ฒฝ์ฐ ๋ ์ค์ํฉ๋๋ค(์: AppMaster๋ก๋ถํฐ ์ฌ์์ฑ) โ ๋ณ๊ฒฝ์ด ๋ง์ ํ์ผ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ๋น ๋ฅด๊ณ ์ผ๊ด๋ ํผ๋๋ฐฑ์ด ํ์ํฉ๋๋ค.
๋จ์ํ Go ๋ฐฑ์๋์ฉ CI/CD ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฐํธ์ ๊ธฐ๋ณธ ๊ฒ์ฌ
- ๋น๋
- ๋จ์ ํ ์คํธ
- ํตํฉ ์ฒดํฌ
- ํจํค์ง(๋ถ๋ณ ์ํฐํฉํธ)
- ๋ง์ด๊ทธ๋ ์ด์ (์ ์ด๋ ๋จ๊ณ)
- ๋ฐฐํฌ
์คํจ๋ ์ด๊ธฐ์ ๋ฉ์ถ๋๋ก ๊ตฌ์กฐํํ์ธ์. ๋ฆฐํธ๊ฐ ์คํจํ๋ฉด ๋ค๋ฅธ ๋จ๊ณ๊ฐ ์คํ๋์ง ์์์ผ ํฉ๋๋ค. ๋น๋๊ฐ ์คํจํ๋ฉด ํตํฉ ๊ฒ์ฌ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ๋ฆฌ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ๋ฉด ์ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋น์ฉ์ ์ค์ด๊ณ ํ์ดํ๋ผ์ธ์ด ๋น ๋ฅด๊ฒ ๋๊ปด์ง๋๋ค.
๋ชจ๋ ๋จ๊ณ๊ฐ ๋ชจ๋ ์ปค๋ฐ์์ ์คํ๋ ํ์๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ถํ :
- ๋ชจ๋ ์ปค๋ฐ/PR: ๋ฆฐํธ, ๋น๋, ๋จ์ ํ ์คํธ
- main ๋ธ๋์น: ํตํฉ ๊ฒ์ฌ, ํจํค์ง
- ๋ฆด๋ฆฌ์ค ํ๊ทธ: ๋ง์ด๊ทธ๋ ์ด์ , ๋ฐฐํฌ
์ด๋ค ๊ฒ์ ์ํฐํฉํธ๋ก ๋ณด๊ดํ ์ง ๊ฒฐ์ ํ์ธ์. ๋ณดํต ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ๋๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง(๋ฐฐํฌํ๋ ๋์), ๋ง์ด๊ทธ๋ ์ด์ ๋ก๊ทธ, ํ ์คํธ ๋ฆฌํฌํธ ๋ฑ์ ๋ณด๊ดํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋กค๋ฐฑ๊ณผ ๊ฐ์ฌ ์ ์ ํํ ๋ฌด์์ด ํ ์คํธ๋๊ณ ์น๊ฒฉ๋์๋์ง ์ง๋ชฉํ๊ธฐ ์ฝ์ต๋๋ค.
Step by step: build stage that is stable and repeatable
๋น๋ ๋จ๊ณ๋ ํ ๊ฐ์ง ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค: ์ค๋, ๋ด์ผ, ๋ค๋ฅธ ๋ฌ๋์์ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋๊ฐ? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ดํ ๋จ๊ณ(ํ ์คํธ, ๋ง์ด๊ทธ๋ ์ด์ , ๋ฐฐํฌ)๋ ์ ๋ขฐํ๊ธฐ ์ด๋ ค์์ง๋๋ค.
ํ๊ฒฝ์ ๊ณ ์ ํ๋ ๊ฒ๋ถํฐ ์์ํ์ธ์. ๊ณ ์ ๋ Go ๋ฒ์ (์: 1.22.x)๊ณผ ๊ณ ์ ๋ ๋ฌ๋ ์ด๋ฏธ์ง(๋ฆฌ๋
์ค ๋ฐฐํฌํ ๋ฐ ํจํค์ง ๋ฒ์ )๋ฅผ ์ฌ์ฉํ์ธ์. latest ํ๊ทธ๋ฅผ ํผํ์ธ์. libc, Git ๋๋ Go ํด์ฒด์ธ์ ์์ ๋ณํ๊ฐ โ๋ด ๋จธ์ ์์๋ ๋๋คโ๋ ์คํจ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ๋๋ฒ๊ทธ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ชจ๋ ์บ์๋ ์๋๋ฅผ ๋์ด์ง๋ง ์ง์ค์ ๊ทผ์์ผ๋ก ์ทจ๊ธํ๋ฉด ์ ๋ฉ๋๋ค. Go ๋น๋ ์บ์์ ๋ชจ๋ ๋ค์ด๋ก๋ ์บ์๋ฅผ ์บ์ํ๋, go.sum์ผ๋ก ํค๋ฅผ ๊ฑธ์ด ์์กด์ฑ์ด ๋ฐ๋๋ฉด ๊น๋ํ ๋ค์ ๋ค์ด๋ก๋๋๊ฒ ํ์ธ์.
์ปดํ์ผ ์ ์ ๋น ๋ฅธ ๊ฒ์ดํธ๋ฅผ ์ถ๊ฐํ์ธ์. ๊ฐ๋ฐ์๊ฐ ์ฐํํ์ง ์๋๋ก ๋น ๋ฅด๊ณ ๊ฒฝ๋์ด์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก gofmt ๊ฒ์ฌ, go vet, ๊ทธ๋ฆฌ๊ณ (๋น ๋ฅด๋ค๋ฉด) staticcheck๋ฅผ ํฌํจํฉ๋๋ค. ๋ํ ๋๋ฝ๋์๊ฑฐ๋ ์ค๋๋ ์์ฑ ํ์ผ์์ ์คํจํ๊ฒ ํ์ธ์ โ ์ฌ์์ฑ๋ ์ฝ๋๋ฒ ์ด์ค์์ ํํ ๋ฌธ์ ์
๋๋ค.
์ฌํ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ปดํ์ผํ๊ณ ๋ฒ์ ์ ๋ณด๋ฅผ ํฌํจํ์ธ์. -trimpath ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ -ldflags๋ก ์ปค๋ฐ SHA์ ๋น๋ ์๊ฐ์ ์ฃผ์
ํ ์ ์์ต๋๋ค. ์๋น์ค๋น ํ๋์ ๋ช
๋ช
๋ ์ํฐํฉํธ๋ฅผ ์์ฑํ์ธ์. ๊ทธ๋ฌ๋ฉด Kubernetes๋ VM์์ ๋ฌด์์ด ์คํ๋๋์ง ์ถ์ ํ๊ธฐ ์ฌ์์ง๋๋ค. ํนํ ๋ฐฑ์๋๋ฅผ ์ฌ์์ฑํ๋ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
Step by step: tests that catch issues before deploy
ํ ์คํธ๋ ๋งค๋ฒ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํ๋ ๋๋ง ๋์์ด ๋ฉ๋๋ค. ๋จผ์ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ๋ชฉํ๋ก ํ๊ณ , ๊ทธ ๋ค์ ์์ธก ๊ฐ๋ฅํ ์๊ฐ ๋ด์ ๋๋๋ ๋ ๊น์ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ธ์.
๋ชจ๋ ์ปค๋ฐ์์ ๋จ์ ํ ์คํธ๋ฅผ ์คํํ์ธ์. ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ ์คํธ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํจํค์ง๋ณ ํ์์์๊ณผ ์ ์ฒด ์ก ํ์์์์ ์ค์ ํ์ธ์. ํ์ ๋ฐ๋ผ ์ถฉ๋ถํ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ์ค์ ์ ํ์ธ์. ์ปค๋ฒ๋ฆฌ์ง๋ ํธ๋กํผ๊ฐ ์๋๋ผ ํ์ง ์ ์ง๋ฅผ ์ํ ์ต์ ๊ธฐ์ค์ ๋๋ค.
์์ ์ ์ธ ํ ์คํธ ๋จ๊ณ์ ํฌํจ๋๋ ํญ๋ชฉ:
go test ./...๋ฅผ ํจํค์ง๋ณ ํ์์์๊ณผ ์ ์ญ ์ก ํ์์์์ผ๋ก ์คํ- ํ์์์์ ๊ฑธ๋ฆฐ ํ ์คํธ๋ ํ๋ผํค๊ฐ ์๋๋ผ ์ค์ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผ
- ์ค์ํ ํจํค์ง(auth, billing, permissions)์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ๋์น ์ค์
- ๋์์ฑ ๊ด๋ จ ์ฝ๋(ํ, ์บ์, ํฌ์์ ์์ ์)์ ๋ํด ๋ ์ด์ค ๋ํ ํฐ ์ฌ์ฉ
๋ ์ด์ค ๋ํ ํฐ๋ ์ ์ฉํ์ง๋ง ๋น๋๋ฅผ ํฌ๊ฒ ๋๋ฆฌ๊ฒ ํ ์ ์์ต๋๋ค. ํํ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ ๋ฆฌํ์คํธ์ ์ผ๊ฐ ๋น๋์์๋ง ์คํํ๊ฑฐ๋ ์ ํ๋ ํจํค์ง์์๋ง ์คํํ๋ ๊ฒ์ด ์์ต๋๋ค.
ํ๋ํค ํ ์คํธ๋ ๋น๋๋ฅผ ์คํจ์ํค์ธ์. ๊ฒฉ๋ฆฌํด์ผ ํ๋ ํ ์คํธ๊ฐ ์๋ค๋ฉด ๋ณ๋ ์ก์ผ๋ก ์ฎ๊ธฐ๊ณ ๊ณ์ ๋ ๋๋ก ๋ฆฌํฌํธ๋๊ฒ ํ๋ฉฐ, ์์ ์์ ๊ธฐํ์ ์๊ตฌํ์ธ์.
๋๋ฒ๊น ์ ์ํด ํ ์คํธ ์ถ๋ ฅ์ ์ ์ฅํ์ธ์. ์์ ๋ก๊ทธ์ ๊ฐ๋จํ ๋ฆฌํฌํธ(์ฑ๊ณต/์คํจ, ์์์๊ฐ, ๋๋ฆฐ ํ ์คํธ ๋ชฉ๋ก)๋ฅผ ๋ณด๊ดํ๋ฉด ์ฌ์์ฑ๋ ๋ณ๊ฒฝ์ด ๋ง์ ๊ฒฝ์ฐ ํ๊ท๋ฅผ ์ฐพ๊ธฐ ์ฝ์ต๋๋ค.
Integration checks with real dependencies, without slow builds
๋จ์ ํ ์คํธ๋ ์ฝ๋๊ฐ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ์๋ํ๋์ง ์๋ ค์ค๋๋ค. ํตํฉ ๊ฒ์ฌ๋ ์๋น์ค๊ฐ ์ค์ ๋ก ๋ถํธํ๊ณ , ์ค์ ์๋น์ค์ ์ฐ๊ฒฐํ๋ฉฐ, ์ค์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง๋ฅผ ํ์ธํฉ๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ ๊ฒ์ด ์ฐ๊ฒฐ๋์์ ๋๋ง ๋๋ฌ๋๋ ๋ฌธ์ ๋ฅผ ์ก์์ฃผ๋ ์์ ๋ง์ ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ์ผ์์ ์ธ ์์กด์ฑ์ ๋์ฐ์ธ์. ํ ์คํธ ์ ์ฉ PostgreSQL(๋ฐ Redis ์ฌ์ฉ ์ Redis)์ ์ ๊น ๋์ฐ๋ ์ ๋๋ฉด ๋๊ฐ ์ถฉ๋ถํฉ๋๋ค. ๋ฒ์ ์ ํ๋ก๋์ ๊ณผ ๊ฐ๊น๊ฒ ์ ์งํ๋ ๋ชจ๋ ํ๋ก๋์ ์ธ๋ถ์ฌํญ์ ๋ณต์ฌํ๋ ค ๋ค์ง๋ ๋ง์ธ์.
์ข์ ํตํฉ ๋จ๊ณ๋ ์๋์ ์ผ๋ก ์๊ฒ ๊ตฌ์ฑํฉ๋๋ค:
- ํ๋ก๋์ ๊ณผ ์ ์ฌํ ํ๊ฒฝ ๋ณ์๋ก ์๋น์ค๋ฅผ ์์(๋จ, ํ ์คํธ์ฉ ์ํฌ๋ฆฟ ์ฌ์ฉ)
- ํฌ์ค ์ฒดํฌ ๊ฒ์ฆ(์:
/health๊ฐ 200 ๋ฐํ) - ํต์ฌ ์๋ํฌ์ธํธ ํ๋ ๊ฐ ํธ์ถํด ์ํ ์ฝ๋์ ์๋ต ํํ ํ์ธ
- PostgreSQL(๋ฐ ํ์ ์ Redis)์ ์ฐ๊ฒฐ ๊ฐ๋ฅํ์ง ํ์ธ
API ๊ณ์ฝ ๊ฒ์ฆ์ ๊นจ์ก์ ๋ ๊ฐ์ฅ ํผํด๊ฐ ํฐ ์๋ํฌ์ธํธ์ ์ง์คํ์ธ์. ์ ์ฒด E2E๊ฐ ์๋๋ผ ๋ช ๊ฐ์ง ์์ฒญ/์๋ต ๊ท์น์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค: ํ์ ํ๋ ๋๋ฝ ์ 400, ์ธ์ฆ ํ์์ 401, ์ ์ ํ๋ฆ์ 200๊ณผ ์์ JSON ํค ๋ฐํ ๋ฑ.
ํตํฉ ํ ์คํธ๋ฅผ ์์ฃผ ๋๋ฆด ์ ์๊ฒ ํ๋ ค๋ฉด ๋ฒ์๋ฅผ ์ ํํ๊ณ ์๊ฐ์ ์ ์ดํ์ธ์. ์์ ๋ฐ์ดํฐ์ ์ ๊ฐ์ง ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ช ๊ฐ์ ์์ฒญ, ๋ถํ ์ด ๋ฉ์ถ๋ฉด ๋ช ์ด ๋ด๋ก ์คํจํ๋๋ก ํ๋ ํ๋ ํ์์์์ ๊ถ์ฅํฉ๋๋ค.
AppMaster๋ก ๋ฐฑ์๋๋ฅผ ์ฌ์์ฑํ๋ ๊ฒฝ์ฐ ์ด๋ฐ ๊ฒ์ฆ์ ๋ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค. ์ฌ์์ฑ๋ ์๋น์ค๊ฐ ์ฌ์ ํ ์ ์์ ์ผ๋ก ์์ํ๊ณ ์น/๋ชจ๋ฐ์ผ ์ฑ์ด ๊ธฐ๋ํ๋ API๋ฅผ ์ ๊ณตํ๋์ง ํ์ธํด ์ค๋๋ค.
Database migrations: safe ordering, gates, and rollback reality
๋จผ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ด๋์ ์คํํ ์ง ๊ฒฐ์ ํ์ธ์. CI์์ ์คํํ๋ฉด ์ด๊ธฐ์ ์ค๋ฅ๋ฅผ ์ก๊ธฐ ์ข์ง๋ง, ๋ณดํต CI๊ฐ ํ๋ก๋์ ์ ์ง์ ๊ฑด๋๋ ค์ ์ ๋ฉ๋๋ค. ๋๋ถ๋ถ ํ์ ๋ฐฐํฌ ์ค์(์ ์ฉ ๋จ๊ณ๋ก) ๋๋ ์๋ก์ด ๋ฒ์ ์ด ์์๋๊ธฐ ์ ์ ์๋ฃ๋์ด์ผ ํ๋ ๋ณ๋์ โmigrateโ ์ก์ผ๋ก ์คํํฉ๋๋ค.
์ค์ฉ์ ๊ท์น: CI์์ ๋น๋ํ๊ณ ํ ์คํธํ ๋ค ๊ฐ๋ฅํ ํ๋ก๋์ ์ ๊ฐ๊น๊ฒ ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํํ์ธ์. Kubernetes์์๋ ๋ณดํต ์ผํ์ฑ Job์ผ๋ก, VM์์๋ ๋ฆด๋ฆฌ์ค ๋จ๊ณ์ ์คํฌ๋ฆฝํธ ๋ช ๋ น์ผ๋ก ์คํํฉ๋๋ค.
์์(ordering)๋ ์ฌ๋๋ค์ด ์๊ฐํ๋ ๊ฒ๋ณด๋ค ์ค์ํฉ๋๋ค. ํ์์คํฌํ ํ์ผ(๋๋ ์๋ฒ)๊ณผ โ์ ํํ ์์๋ก ํ ๋ฒ๋ง ์ ์ฉโ์ ๊ฐ์ ํ์ธ์. ์ฌ์๋ํด๋ ์ค๋ณต์ ๋ง๋ค๊ฑฐ๋ ๋์ค์ ํฌ๋์ ๋์ง ์๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฐ๋ฅํ๋ฉด ๋ฉฑ๋ฑํ๊ฒ ๋ง๋์ธ์.
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ๋จ์ํ๊ฒ ์ ์งํ์ธ์:
- ๋จผ์ ์ถ๊ฐ์ ๋ณ๊ฒฝ ์ ํธ(์ ํ ์ด๋ธ/์ปฌ๋ผ, nullable ์ปฌ๋ผ, ์ ์ธ๋ฑ์ค)
- ํ๋์ ๋ฆด๋ฆฌ์ค ๋์ ์ฝ๋๊ฐ ์ ์คํค๋ง์ ์ ์คํค๋ง ๋ชจ๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฐฐํฌ
- ๊ทธ ๋ค์์ ์ ์ฝ์ ์ ๊ฑฐํ๊ฑฐ๋ ๊ฐํ(์ปฌ๋ผ ์ญ์ , NOT NULL๋ก ๋ณ๊ฒฝ)
- ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ์์ ํ๊ฒ ์ํ(๊ฐ๋ฅํ๋ฉด ์ธ๋ฑ์ค๋ฅผ concurrent๋ก ์์ฑ)
์คํ ์ ์ ์์ ์ฅ์น๋ฅผ ์ถ๊ฐํ์ธ์. ์๋ฅผ ๋ค์ด ํ๋์ ๋ง์ด๊ทธ๋ ์ด์
๋ง ์คํ๋๊ฒ ํ๋ DB ๋ฝ๊ณผ โํ๊ดด์ ๋ณ๊ฒฝ์ ์น์ธ ํ์โ ๊ฐ์ ์ ์ฑ
์
๋๋ค. ์: ๋ง์ด๊ทธ๋ ์ด์
์ DROP TABLE ๋๋ DROP COLUMN์ด ํฌํจ๋๋ฉด ์๋ ๊ฒ์ดํธ๊ฐ ์น์ธ๋์ง ์๋ ํ ํ์ดํ๋ผ์ธ์ ์คํจํ๊ฒ ๋ง๋์ธ์.
๋กค๋ฐฑ์ ์ด๋ ค์ด ํ์ค์ ๋๋ค: ๋ง์ ์คํค๋ง ๋ณ๊ฒฝ์ ๋๋๋ฆด ์ ์์ต๋๋ค. ์ปฌ๋ผ์ ์ญ์ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ ์ ์์ต๋๋ค. ๋กค๋ฐฑ ๊ณํ์ ์ ํฅ์ ์์ (forward fix)์ ๋ง์ถฐ ๊ณํํ์ธ์: ์์ ํ ๋๋ง ๋ค์ด ๋ง์ด๊ทธ๋ ์ด์ ์ ๋๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐฑ์ ๊ณผ ์ ํฅ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ๋ณต๊ตฌํ์ธ์.
๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ์๋ ๋ณต๊ตฌ ๊ณํ์ ๋ถ์ด์ธ์: ๋์ค ์คํจ ์ ์ด๋ป๊ฒ ๋ณต๊ตฌํ ์ง, ์ฑ์ ๋กค๋ฐฑํด์ผ ํ ๋ ์ด๋ป๊ฒ ํ๋ํ ์ง. AppMaster๋ก Go ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฆด๋ฆฌ์ค ๊ณ์ฝ์ ์ผ๋ถ๋ก ๋ค๋ฃจ์ด ์์ฑ๋ ์ฝ๋์ ์คํค๋ง๊ฐ ๋๊ธฐํ๋๋๋ก ํ์ธ์.
Packaging and configuration: artifacts you can trust
ํ์ดํ๋ผ์ธ์ด ์์ธก ๊ฐ๋ฅํ๋ค๊ณ ๋๊ปด์ง๋ ค๋ฉด ๋ฐฐํฌํ๋ ๊ฒ์ด ํญ์ ํ ์คํธํ ๊ฒ๊ณผ ๋์ผํด์ผ ํฉ๋๋ค. ์ด๋ ํจํค์ง๊ณผ ์ค์ ๊ด๋ฆฌ์ ๋ฌ๋ ค ์์ต๋๋ค. ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ด์ธ๋ ์ํฐํฉํธ๋ก ์ทจ๊ธํ๊ณ ํ๊ฒฝ ์ฐจ์ด๋ ์ ๋ถ ๋ฐ์ผ๋ก ๋นผ์ธ์.
ํจํค์ง์ ๋ณดํต ๋ ๊ฐ์ง ๊ธธ ์ค ํ๋์ ๋๋ค. Kubernetes์ ๋ฐฐํฌํ๋ค๋ฉด ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ๊ธฐ๋ณธ์ ๋๋ค. OS ๊ณ์ธต์ ๊ณ ์ ํ๊ณ ๋กค์์์ ์ผ๊ด๋๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. VM์ฉ ๋ฒ๋ค๋ ์ ๋ขฐํ ์ ์๋๋ฐ, ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ์ ๋ฐํ์์ ํ์ํ ์์์ ํ์ผ(์: CA ์ธ์ฆ์, ํ ํ๋ฆฟ, ์ ์ ์์ฐ)์ ํฌํจํ๊ณ ๋งค๋ฒ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ๋ฉด ๋ฉ๋๋ค.
์ค์ ์ ๋ฐ์ด๋๋ฆฌ์ ๊ตฌ์ ๋ฃ์ง ๋ง์ธ์. ๋๋ถ๋ถ ์ค์ (ํฌํธ, DB ํธ์คํธ, ๊ธฐ๋ฅ ํ๋๊ทธ)์ ํ๊ฒฝ ๋ณ์๋ก ์ฒ๋ฆฌํ๊ณ , ๊ฐ์ด ๊ธธ๊ฑฐ๋ ๊ตฌ์กฐํ๋์ด ์์ผ๋ฉด ํ๊ฒฝ๋ณ ์ค์ ํ์ผ์ ์ฌ์ฉํ์ธ์. ์ค์ ์๋น์ค๊ฐ ์๋ค๋ฉด ์์กด์ฑ์ผ๋ก ์ทจ๊ธํ์ธ์: ๊ถํ ์ ๊ธ, ๊ฐ์ฌ ๋ก๊ทธ, ๋ช ํํ ํด๋ฐฑ ํ๋์ ๋ก๋๋ค.
์ํฌ๋ฆฟ์ ๋์ง ๋ง์์ผ ํ ์ ์ ๋๋ค. ๋ ํฌ์งํ ๋ฆฌ๋ ์ด๋ฏธ์ง, CI ๋ก๊ทธ์ ์ ๋ ๋ฃ์ง ๋ง์ธ์. ์์ ์ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ถ๋ ฅํ์ง ๋ง์ธ์. CI ์ํฌ๋ฆฟ ์ ์ฅ์์ ๋๊ณ ๋ฐฐํฌ ์ ์ฃผ์ ํ์ธ์.
์ํฐํฉํธ ์ถ์ ์ฑ์ ์ํด ๊ฐ ๋น๋์ ์๋ณ์๋ฅผ ๋ฃ์ผ์ธ์: ์ปค๋ฐ ํด์์ ๋ฒ์ ์ผ๋ก ํ๊ทธ, ๋น๋ ๋ฉํ๋ฐ์ดํฐ(๋ฒ์ , ์ปค๋ฐ, ๋น๋ ์๊ฐ)๋ฅผ ์ ๋ณด ์๋ํฌ์ธํธ์ ํฌํจ, ๋ฐฐํฌ ๋ก๊ทธ์ ์ํฐํฉํธ ํ๊ทธ ๊ธฐ๋ก. ํ ๋ช ๋ น์ด๋ ๋์๋ณด๋๋ก โ๋ฌด์์ด ์คํ ์ค์ธ์งโ ๋ตํ ์ ์๊ฒ ํ์ธ์.
AppMaster๋ก Go ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ค๋ฉด ์ด ๊ท์จ์ ๋ ์ค์ํฉ๋๋ค: ์ฌ์์ฑ์ด ์์ ํ๋ ค๋ฉด ์ํฐํฉํธ ๋ค์ด๋ฐ๊ณผ ์ค์ ๊ท์น์ด ๋งค ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
Deploying to Kubernetes or VMs without surprises
๋๋ถ๋ถ์ ๋ฐฐํฌ ์คํจ๋ โ๋์ ์ฝ๋โ ๋๋ฌธ์ด ์๋๋๋ค. ์ค์ ๋ถ์ผ์น, ๋๋ฝ๋ ์ํฌ๋ฆฟ, ์์์ ํ์ง๋ง ์ค์ ๋ก ์ค๋น๋์ง ์์ ์๋น์ค ๋๋ฌธ์ ๋๋ค. ๋ชฉํ๋ ๋จ์ํฉ๋๋ค: ๋์ผํ ์ํฐํฉํธ๋ฅผ ๋ชจ๋ ๊ณณ์ ๋ฐฐํฌํ๊ณ , ํ๊ฒฝ๋ณ ์ฐจ์ด๋ ์ค์ ์ผ๋ก๋ง ์ ์ดํ์ธ์.
Kubernetes: treat deploys as controlled rollouts
Kubernetes์์๋ ํต์ ๋ ๋กค์์์ ๋ชฉํ๋ก ํ์ธ์. ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํด ํ๋๋ฅผ ์ ์ง์ ์ผ๋ก ๊ต์ฒดํ๊ณ , readiness์ liveness ์ฒดํฌ๋ฅผ ์ถ๊ฐํด ํ๋ซํผ์ด ํธ๋ํฝ ์ ์ก ์๊ธฐ์ ์ ์ง ์๊ธฐ๋ฅผ ์๊ฒ ํ์ธ์. ๋ฆฌ์์ค ์์ฒญ๊ณผ ์ ํ๋ ์ค์ํฉ๋๋ค. CI ๋ฌ๋์์๋ ํต๊ณผํ์ง๋ง ์์ ๋ ธ๋์์ OOM์ผ๋ก ์ฃฝ์ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง์ ์ํฌ๋ฆฟ์ ๋ถ๋ฆฌํ์ธ์. ์ปค๋ฐ๋ง๋ค ํ๋์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌ ์ ํ๊ฒฝ๋ณ ์ค์ (ConfigMaps, Secrets ๋๋ ์ํฌ๋ฆฟ ๋งค๋์ )์ ์ฃผ์ ํ๋ฉด ์คํ ์ด์ง๊ณผ ํ๋ก๋์ ์ ๋์ผํ ๋นํธ๋ก ์คํ๋ฉ๋๋ค.
VMs: systemd gives you most of what you need
๊ฐ์ ๋จธ์ ์ ๋ฐฐํฌํ ๋๋ systemd๊ฐ ์์ ์ค์ผ์คํธ๋ ์ดํฐ ์ญํ ์ ํฉ๋๋ค. ์์ ๋๋ ํฐ๋ฆฌ, ํ๊ฒฝ ํ์ผ, ์ฌ์์ ์ ์ฑ ์ ๋ช ํํ ํ ์ ๋ ํ์ผ์ ๋ง๋์ธ์. stdout/stderr๋ฅผ ๋ก๊ทธ ์์ง๊ธฐ๋ journald๋ก ๋ณด๋ด๋ฉด ์ธ์๋ํธ๊ฐ SSH ๋ค์ง๊ธฐ ์์์ ์ด ๋๋ ์ผ์ ์ค์ผ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ ์์ด๋ ์์ ํ ๋กค์์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ธ๋ฃจ/๊ทธ๋ฆฐ: ๋ ๋๋ ํฐ๋ฆฌ(๋๋ ๋ VM)๋ฅผ ์ ์งํ๊ณ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ค์์นํ๋ฉฐ ์ด์ ๋ฒ์ ์ ๋น ๋ฅธ ๋กค๋ฐฑ์ฉ์ผ๋ก ์ค๋นํฉ๋๋ค. ์นด๋๋ฆฌ๋ ๋น์ทํฉ๋๋ค: ์๋์ ํธ๋ํฝ๋ง ์ ๋ฒ์ ์ผ๋ก ๋ณด๋ด ์ํ๋ฅผ ํ์ธํ ๋ค ํ์ฅํฉ๋๋ค.
๋ฐฐํฌ๋ฅผ โ์๋ฃโ๋ก ํ์ํ๊ธฐ ์ ์ ์ด๋์๋ ๊ฐ์ ํฌ์คํธ-๋ํ๋ก์ด ์ค๋ชจํฌ ์ฒดํฌ๋ฅผ ์คํํ์ธ์:
- ํฌ์ค ์๋ํฌ์ธํธ๊ฐ OK๋ฅผ ๋ฐํํ๊ณ ์์กด์ฑ์ด ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธ
- ์์ ์ค์ ๋์ ์คํ(์: ํ ์คํธ ๋ ์ฝ๋ ์์ฑ ๋ฐ ์กฐํ)
- ์๋น์ค ๋ฒ์ /๋น๋ ID๊ฐ ์ปค๋ฐ๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฆ
- ์คํจํ๋ฉด ๋กค๋ฐฑํ๊ณ ์๋ฆผ ๋ฐ์ก
๋ฐฑ์๋๋ฅผ ์ฌ์์ฑํ๋ ๊ฒฝ์ฐ(์: AppMaster Go ๋ฐฑ์๋)์๋ ์ด ์ ๊ทผ๋ฒ์ ์์ ์ ์ ๋๋ค: ํ ๋ฒ ๋น๋ํ๊ณ ์ํฐํฉํธ๋ฅผ ๋ฐฐํฌํ ๋ค ํ๊ฒฝ ์ค์ ์ผ๋ก ์ฐจ์ด๋ฅผ ์ ์ดํ์ธ์.
Common mistakes that make pipelines unreliable
๋๋ถ๋ถ์ ๋ง๊ฐ์ง ๋ฆด๋ฆฌ์ค๋ โ๋์ ์ฝ๋โ ๋๋ฌธ์ด ์๋๋๋ค. ํ์ดํ๋ผ์ธ์ด ์คํ๋ง๋ค ๋ค๋ฅด๊ฒ ํ๋ํ ๋ ๋ฐ์ํฉ๋๋ค. Go ๋ฐฑ์๋์ฉ CI/CD๋ฅผ ์ฐจ๋ถํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๋ค์ ํจํด์ ์กฐ์ฌํ์ธ์.
Mistake patterns that cause surprise failures
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ฌด๋ฐ ๊ฐ๋๋ ์ผ ์์ด ์๋์ผ๋ก ๋ชจ๋ ๋ฐฐํฌ์์ ์คํํ๋ ๊ฒ์ ์ ํ์ ์ธ ์ค์์ ๋๋ค. ํ ์ด๋ธ์ ์ ๊ทธ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฐ์ ์๋น์ค ์ ์ฒด๋ฅผ ๋ค์ด์ํฌ ์ ์์ต๋๋ค. ํ๋ก๋์ ์์๋ ๋ช ์์ ๋จ๊ณ ๋ค์ ๋๊ณ ์น์ธ ์ ์ฐจ๋ฅผ ์๊ตฌํ์ธ์.
latest ํ๊ทธ๋ ๊ณ ์ ๋์ง ์์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์์ธ์
๋๋ค. ๋์ปค ์ด๋ฏธ์ง์ Go ๋ฒ์ ์ ๊ณ ์ ํด ๋น๋ ํ๊ฒฝ์ด ์์ํ ๋ณํ์ง ์๊ฒ ํ์ธ์.
โ์์โ๋ก ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ๋ฌ ํ๊ฒฝ์์ ๊ณต์ ํ๋ฉด ์๊ตฌํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ , ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์คํ ์ด์ง์ผ๋ก ์ ์ ๋๊ฑฐ๋ ์คํ ์ด์ง ์คํฌ๋ฆฝํธ๊ฐ ํ๋ก๋์ ์ ๊ฑด๋๋ฆฌ๋ ์ผ์ด ์๊น๋๋ค. ํ๊ฒฝ๋ณ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค(๋ฐ ์๊ฒฉ์ฆ๋ช )๋ฅผ ๋ถ๋ฆฌํ์ธ์.
ํฌ์ค ์ฒดํฌ์ ๋ ๋๋์ค ์ฒดํฌ๊ฐ ์์ผ๋ฉด ๋ฐฐํฌ๋ โ์ฑ๊ณตโ์ผ๋ก ํ์๋์ง๋ง ์๋น์ค๊ฐ ๊นจ์ ธ ์์ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ํ๊ณ DB์ ์ฐ๊ฒฐํ๋ฉฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋์ง๋ฅผ ๊ฒ์ฌํ๋ ์ฒดํฌ๋ฅผ ์ถ๊ฐํ์ธ์.
๋ง์ง๋ง์ผ๋ก ์ํฌ๋ฆฟ, ์ค์ , ์ ๊ทผ๊ถ์ ๋ํ ์์ ๊ถ์ด ๋ถ๋ช ํํ๋ฉด ๋ฆด๋ฆฌ์ค๊ฐ ์ถ์ธก์ผ๋ก ๋ณํฉ๋๋ค. ๋๊ฐ ์ํฌ๋ฆฟ์ ์์ฑํ๊ณ ํ์ ํ๋ฉฐ ์ฃผ์ ํ๋์ง ์์ ์๋ฅผ ์ ํ์ธ์.
ํ์ค์ ์ธ ์คํจ ์: ํ์ด ๋ณ๊ฒฝ์ ๋จธ์งํ๊ณ ํ์ดํ๋ผ์ธ์ด ๋ฐฐํฌ๋ฅผ ์์ํฉ๋๋ค. ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํ ์ด์ง์์๋ ์๋ํ์ง๋ง(๋ฐ์ดํฐ ์ ์) ํ๋ก๋์ ์์๋ ํ์์์ํฉ๋๋ค(๋ฐ์ดํฐ ๋ง์). ์ด๋ฏธ์ง๊ฐ ๊ณ ์ ๋์ด ์๊ณ ํ๊ฒฝ ๋ถ๋ฆฌ๊ฐ ๋์ด ์์ผ๋ฉฐ ๋ง์ด๊ทธ๋ ์ด์ ๋จ๊ณ๊ฐ ๊ฒ์ดํธ๋ก ๋ณดํธ๋์ด ์์๋ค๋ฉด ๋ฐฐํฌ๋ ์์ ํ๊ฒ ์ค๋จ๋์์ ๊ฒ์ ๋๋ค.
AppMaster๋ก Go ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ฉด ์ฌ์์ฑ์ด ๋ง์ ํ์ผ์ ํ ๋ฒ์ ๊ฑด๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ท์น์ ๋ ์ค์ํฉ๋๋ค. ์์ธก ๊ฐ๋ฅํ ์ ๋ ฅ๊ณผ ๋ช ์์ ๊ฒ์ดํธ๋ ํฐ ๋ณ๊ฒฝ์ด ์ํํ ๋ฆด๋ฆฌ์ค๋ก ์ด์ด์ง๋ ๊ฒ์ ๋ง์์ค๋๋ค.
Quick checklist for a predictable CI/CD setup
Go ๋ฐฑ์๋์ฉ CI/CD์ ๋ํ ์ง๊ฐ ์ ๊ฒํ์ ๋๋ค. ๊ฐ ํญ๋ชฉ์ ๋ช ํํ โ์โ๋ก ๋ตํ ์ ์๋ค๋ฉด ๋ฆด๋ฆฌ์ค๋ ํจ์ฌ ์ฌ์์ง๋๋ค.
- ์ฝ๋๋ง์ด ์๋๋ผ ํ๊ฒฝ์ ์ ๊ธ. Go ๋ฒ์ ๊ณผ ๋น๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ณ ์ ํ๊ณ ๋ก์ปฌ๊ณผ CI์ ๋์ผํ ์ค์ ์ฌ์ฉ.
- ํ์ดํ๋ผ์ธ์ 3๊ฐ์ ๊ฐ๋จํ ๋ช ๋ น์ผ๋ก ์คํ. ํ๋๋ ๋น๋, ํ๋๋ ํ ์คํธ, ํ๋๋ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํฐํฉํธ ์์ฑ.
- ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๋ก๋์ ์ฝ๋์ฒ๋ผ ์ทจ๊ธ. ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์คํ ๋ก๊ทธ ๋ณด๊ด, ๋กค๋ฐฑ์ ์๋ฏธ ๋ฌธ์ํ.
- ์ถ์ ๊ฐ๋ฅํ ๋ถ๋ณ ์ํฐํฉํธ ์์ฑ. ํ ๋ฒ ๋น๋ํ๊ณ ์ปค๋ฐ SHA๋ก ํ๊ทธํด ํ๊ฒฝ ๊ฐ ์ฌ๋น๋ ์์ด ์น๊ฒฉ.
- ๋น ๋ฅด๊ฒ ์คํจํ๋ ์ฒดํฌ๋ก ๋ฐฐํฌ. ๋ ๋๋์ค/๋ผ์ด๋ธ๋์ค ํฌ์ค ์ฒดํฌ์ ๋ชจ๋ ๋ฐฐํฌ์์ ์คํ๋๋ ์งง์ ์ค๋ชจํฌ ํ ์คํธ ์ถ๊ฐ.
ํ๋ก๋์ ์ ๊ทผ์ ์ ํํ๊ณ ๊ฐ์ฌ ๊ฐ๋ฅํ๊ฒ ์ ์งํ์ธ์. CI๋ ์ ์ฉ ์๋น์ค ๊ณ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ , ์ํฌ๋ฆฟ์ ์ค์์์ ๊ด๋ฆฌํ๋ฉฐ ์๋ ํ๋ก๋์ ์์ ์ ๋๊ฐ, ๋ฌด์์, ์ธ์ ํ๋์ง ๋ช ํํ ๋จ๊ฒจ์ผ ํฉ๋๋ค.
A realistic example and next steps you can start this week
์์ ์ด์ํ(4๋ช )์ด ์ฃผ 1ํ ๋ฐฐํฌํฉ๋๋ค. ์ ํํ์ด ์ํฌํ๋ก๋ฅผ ๊ณ์ ๋ค๋ฌ๊ธฐ ๋๋ฌธ์ Go ๋ฐฑ์๋๋ฅผ ์์ฃผ ์ฌ์์ฑํฉ๋๋ค. ๋ชฉํ๋ ๊ฐ๋จํฉ๋๋ค: ์๋ฒฝ์ ์ธ๋ฆฌ๋ ๊ณ ์ฅ ์๋ฅผ ์ค์ด๊ณ ์๋ฌด๋ ๋๋ผ์ง ์๋ ๋ฆด๋ฆฌ์ค.
๊ธ์์ผ์ Typical ๋ณ๊ฒฝ: customers์ ์ ํ๋๋ฅผ ์ถ๊ฐ(์คํค๋ง ๋ณ๊ฒฝ)ํ๊ณ ๊ทธ ํ๋๋ฅผ ์ฐ๋ API๋ฅผ ์
๋ฐ์ดํธ(์ฝ๋ ๋ณ๊ฒฝ). ํ์ดํ๋ผ์ธ์ ์ด๋ค์ ํ๋์ ๋ฆด๋ฆฌ์ค๋ก ์ฒ๋ฆฌํฉ๋๋ค. ํ๋์ ์ํฐํฉํธ๋ฅผ ๋น๋ํ๊ณ ๊ทธ ์ ํํ ์ํฐํฉํธ๋ก ํ
์คํธ๋ฅผ ์คํํ ๋ค์๋ง ๋ง์ด๊ทธ๋ ์ด์
์ ์ ์ฉํ๊ณ ๋ฐฐํฌํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฝ๋๋ฅผ ๊ธฐ๋๋ณด๋ค ์์ ๋๊ฐ๊ฑฐ๋, ๋ฐ๋๋ก ์ฝ๋๊ฐ ๋งค์นญ๋๋ ์คํค๋ง ์์ด ๋ฐฐํฌ๋๋ ์ผ์ด ์์ต๋๋ค.
์คํค๋ง ๋ณ๊ฒฝ์ด ํฌํจ๋๋ฉด ํ์ดํ๋ผ์ธ์ ์์ ๊ฒ์ดํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ถ๊ฐ์ ๋ณ๊ฒฝ์ธ์ง(์: nullable ์ปฌ๋ผ ์ถ๊ฐ) ํ์ธํ๊ณ , ์ปฌ๋ผ ์ญ์ ๋ ๋๊ท๋ชจ ํ ์ด๋ธ ์ฌ์์ฑ ๊ฐ์ ์ํ ์์๋ฅผ ํ์ํฉ๋๋ค. ์ํํ๋ฉด ํ๋ก๋์ ์ด์ ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋จํฉ๋๋ค. ํ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ์์ ํ๊ฒ ๊ณ ์น๊ฑฐ๋ ๊ณํ๋ ์๋์ฐ๋ฅผ ์ก์ต๋๋ค.
ํ ์คํธ๊ฐ ์คํจํ๋ฉด ์๋ฌด๊ฒ๋ ์์ผ๋ก ๋์๊ฐ์ง ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ฆฌํ๋ก๋์ ํ๊ฒฝ์์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์คํจํ๋ฉด ์งํํ์ง ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ โ์ด๋ฒ ํ ๋ฒ๋ง ๋ฐ์ด๋ฃ์โ๋ ์๋๋ฅผ ํด์ ์ ๋ฉ๋๋ค.
๋๋ถ๋ถ ํ์ ์ ํตํ๋ ๊ฐ๋จํ ๋ค์ ๋จ๊ณ:
- ํ๋์ ํ๊ฒฝ๋ถํฐ ์์(๋ฆฌ์ ํ๊ธฐ ์ฌ์ด ๋จ์ผ ๊ฐ๋ฐ ๋ฐฐํฌ).
- ํ์ดํ๋ผ์ธ์ด ํญ์ ํ๋์ ๋ฒ์ ํ๋ ๋น๋ ์ํฐํฉํธ๋ฅผ ์์ฑํ๊ฒ ํ๊ธฐ.
- ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋์ผ๋ก ์คํํ๋, ํ๋ก๋์ ์์๋ ์น์ธ์ ์๊ตฌ.
- ๊ฐ๋ฐ์ด ๋ช ์ฃผ ์์ ๋๋ฉด ์คํ ์ด์ง ์ถ๊ฐ.
- ํ๋ก๋์ ๊ฒ์ดํธ์ ๊ทธ๋ฆฐ ํ ์คํธ์ ์ฑ๊ณต์ ์ธ ์คํ ์ด์ง ๋ฐฐํฌ๋ฅผ ์๊ตฌ.
AppMaster๋ก ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ค๋ฉด ์ฌ์์ฑ์ ๋์ผํ ํ์ดํ๋ผ์ธ ๋จ๊ณ ์์ ์ ์งํ์ธ์: regenerate, build, test, migrate(์์ ํ ํ๊ฒฝ์์), ๊ทธ๋ฆฌ๊ณ deploy. ์์ฑ๋ ์์ค๋ ์ผ๋ฐ ์์ค์ฒ๋ผ ์ทจ๊ธํ์ธ์. ๋ชจ๋ ๋ฆด๋ฆฌ์ค๋ ํ๊ทธ๋ ๋ฒ์ ์ผ๋ก๋ถํฐ ๋์ผํ ๋จ๊ณ๋ก ์ฌํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Go ๋ฒ์ ๊ณผ ๋น๋ ํ๊ฒฝ์ ๊ณ ์ ํ์ธ์. ๊ฐ์ ์ ๋ ฅ์ด ํญ์ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋๋ก ํ๋ฉด โ๋ด ํ๊ฒฝ์์๋ ์๋โ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๊ณ ์คํจ๋ฅผ ์ฌํํ๊ธฐ ์ฌ์์ง๋๋ค.
์ฌ์์ฑ(regeneration)์ ์๋ํฌ์ธํธ, ๋ฐ์ดํฐ ๋ชจ๋ธ, ์์กด์ฑ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ์ด๋ฐ ๋ณ๊ฒฝ์ ํญ์ ๋์ผํ ๊ฒ์ฆ ์ ์ฐจ๋ก ํต๊ณผ์ํค๋ฏ๋ก ์ฌ์์ฑ์ด ์ํ์ด ์๋ ์์ ํ ์์ ์ด ๋ฉ๋๋ค.
ํ ๋ฒ ๋น๋ํ ์ํฐํฉํธ๋ฅผ dev, staging, prod๋ก ๊ทธ๋๋ก ์น๊ฒฉ(promote)ํ์ธ์. ํ๊ฒฝ๋ณ๋ก ๋ค์ ๋น๋ํ๋ฉด ๋์ผ ์ปค๋ฐ์ด๋ผ๋ ํ ์คํธํ์ง ์์ ๊ฒ์ด ๋ฐฐํฌ๋ ์ ์์ต๋๋ค.
ํฌ๋งท ๊ฒ์ฌ, ๊ธฐ๋ณธ ์ ์ ๊ฒ์ฌ, ๋น๋, ๊ทธ๋ฆฌ๊ณ ํ์์์์ด ์๋ ๋จ์ ํ ์คํธ ๊ฐ์ ๋น ๋ฅธ ๊ฒ์ดํธ๋ฅผ ํ ๋ฆฌํ์คํธ๋ง๋ค ์คํํ์ธ์. ๋น ๋ฅด๋ฉด์๋ ์๊ฒฉํ๊ฒ ํด์ ๊นจ์ง ๋ณ๊ฒฝ์ ์ด๊ธฐ์ ๋ฉ์ถ๊ฒ ํฉ๋๋ค.
์๋น์ค๋ฅผ ์ค์ ์ ๋น์ทํ ์ค์ ์ผ๋ก ๋์ฐ๊ณ PostgreSQL ๊ฐ์ ์ค์ ์์กด์ฑ๊ณผ ์ฐ๋ํ๋ ์์ ํตํฉ ๋จ๊ณ๋ง ์ถ๊ฐํ์ธ์. ๋ชฉํ๋ โ์ปดํ์ผ์ ๋๋๋ฐ ์์ํ์ง ๋ชปํ๋คโ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ก๋ ๊ฒ์ ๋๋ค. ์ ์ฒด E2E๋ฅผ ๋งค๋ฒ ๋๋ฆด ํ์๋ ์์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ์๋์ผ๋ก ์๋ฌด ํ๊ฒฝ์๋ ์คํ๋๋ ๋จ๊ณ๊ฐ ๋์ด์ ์ ๋ฉ๋๋ค. ๋จ์ผ ์คํ ๋ฝ๊ณผ ๋ช ํํ ๋ก๊ทธ๊ฐ ์๋ ์ ์ด๋ ๋ฆด๋ฆฌ์ค ๋จ๊ณ๋ก ์คํํ์ธ์. ๋ง์ ์คํค๋ง ๋ณ๊ฒฝ์ ๊ฐ๋จํ ๋๋๋ฆด ์ ์๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค.
Readiness ์ฒดํฌ๋ฅผ ์ถ๊ฐํด ์ ํ๋๊ฐ ์ค์ ๋ก ์ค๋น๋ ๋ค์๋ง ํธ๋ํฝ์ด ๊ฐ๋๋ก ํ์ธ์. ๋ํ ๋ฆฌ์์ค ์์ฒญ/์ ํ์ ํ์ค์ ์ผ๋ก ์ค์ ํด CI์์ ํต๊ณผํ ์๋น์ค๊ฐ ํ๋ก๋์ ์์ OOM์ผ๋ก ์ฃฝ์ง ์๊ฒ ํด์ผ ํฉ๋๋ค.
๊ฐ๋จํ systemd ์ ๋ ํ์ผ๊ณผ ์ผ๊ด๋ ๋ฆด๋ฆฌ์ค ์คํฌ๋ฆฝํธ๋ฉด VM ํ๊ฒฝ์์๋ ์์ ์ ์ธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ๋ฅํ ํ ์ปจํ ์ด๋๊ณผ ๋์ผํ ์ํฐํฉํธ ๋ชจ๋ธ์ ์ ์งํ๊ณ , ๋ฐฐํฌ ํ ๊ฐ๋จํ ์ค๋ชจํฌ ์ฒดํฌ๋ฅผ ์ถ๊ฐํ์ธ์.
๋น๋ฐ์ ๋ ํฌ์งํ ๋ฆฌ๋ ๋น๋ ์ํฐํฉํธ, ๋ก๊ทธ์ ์ ๋ ํฌํจ์ํค์ง ๋ง์ธ์. ๋ฐฐํฌ ์์๋ง ์ํฌ๋ฆฟ ์คํ ์ด์์ ์ฃผ์ ํ๊ณ , ์ฝ์ ์ ์๋ ๊ถํ์ ์ ํํ๋ฉฐ ์ ๊ธฐ์ ์ผ๋ก ๋กํ ์ด์ ํ์ธ์.
์ฌ์์ฑ์ ํ์ดํ๋ผ์ธ ์์ ๋๊ณ ๋ค๋ฅธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ฒ๋ฆฌํ์ธ์: regenerate, build, test, package, ๊ทธ๋ฆฌ๊ณ ์์ ์ฅ์น๊ฐ ์๋ migrate ๋ฐ deploy. AppMaster๋ก ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ์ด ํ๋ฆ์ ๋ฐ๋ฅด๋ฉด ๋ณ๊ฒฝ ๋ด์ฉ์ ๋น ๋ฅด๊ณ ์์ ํ๊ฒ ๋ฐฐํฌํ ์ ์์ต๋๋ค.


