Cloud Design 3rd - 100-hours-a-week/KTB4-1st-wiki GitHub Wiki
CI๋ฅผ ํตํด ์์ ์ ์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ GHCR์ ์ ์ฅํ์ผ๋, ๊ตฌ๋ ํ๊ฒฝ์ ์ ์ํด์ ๊ธฐ์กด ์ปจํ
์ด๋๋ฅผ ๋ด๋ฆฌ๊ณ ์๋ก ์ฌ๋ ค์ผ ํ๋ค.
์ฌ๋์ด ์ง์ ์์
ํ๋ฉด ํญ์ ์ผ๊ด์ฑ(๋์ผํ ์ ์ฐจ์ ๊ฒ์ฆ ๊ณผ์ )์ ๋ณด์ฅํ๊ธฐ ์ด๋ ต๊ณ , ๋ฐ๋ณต ์์
์ ๊ตณ์ด ์๋์ผ๋ก ํ ํ์๊ฐ ์๋ค๋ฉด ๋
ธ๋๋ ์์์ธ ๋งํผ ํจ์จ์ ์ธ ์๋ํ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์๋ฒ ๊ตฌ์ฑ
- ์ด์ ์๋ฒ ๋จ์ผ EC2 ์ธ์คํด์ค
- Docker Image ํ๊ทธ ์ ๋ต
- ์ด์ ์๋ฒ ๋ฐฐํฌ์ฉ(main): Semantic Version(
MAJOR.MINOR.PATCH) (์์:v1.0.1) - ๊ธฐ๋ฅ ๊ฐ๋ฐ ๊ฒ์ฆ์ฉ(dev): dev-commit SHA, ์ต์ ๋ฒ์ ์ dev-latest
- ์ด์ ์๋ฒ ๋ฐฐํฌ์ฉ(main): Semantic Version(
- ๋ฐฐํฌ ๋จ์
- ํ๋ก ํธ์๋, ๋ฐฑ์๋, AI ๊ฐ๊ฐ ์ธ ๊ฐ์ Docker Image๋ฅผ Docker Compose๋ก ๋ฌถ์ด ๋ฐฐํฌ
์๋น์ค ์ค๋จ ํ์ฉ ์ฌ๋ถ
- 1์ฐจ ๋ฐฐํฌ์์๋ ๋ถํธ์บ ํ ๋ด์ ํ์ ๊ทธ๋ฃน์์ ๋จผ์ ๋ฐฐํฌ๋๊ณ , ์ฌ์ฉ ์๊ฐ์ด ์ผ์ ํ๋ฏ๋ก ์๋น์ค์ ์ค๋จ์ด ๋ฐ์ํด๋ ๊ด์ฐฎ๋ค.
- ์๋น์ค ์ฌ์ฉ ์๊ฐ๋: ํ์ผ ์ฌ๋ ์๊ฐ(9:00โ18:00 ์ค ๋งค์ 50๋ถโ์ ๊ฐ) + ์ ์ฌ์๊ฐ(12:00โ13:00)
๋ฐฐํฌ ์ ๋ต
- In-Place: ์ ๋ฒ์ ๋ฐฐํฌ ์ ์ปจํ ์ด๋ ์ฌ์์ ๋์ ์๋น์ค ์ค๋จ
๋ฐฐํฌ ์๊ฐ
- ์ ๊ท ๋ฐฐํฌ ์๊ฐ: ๋งค์ฃผ ์์์ผ 10์
- hotfix ๋ฐฐํฌ ์๊ฐ: main merge CI ๋จ๊ณ๊ฐ ๋๋ ๋ค ๊ณง๋ฐ๋ก ๋ฐฐํฌ
-
ํ๊ฒฝ๋ณ ๋ฐฐํฌ ๋ฐฉ๋ฒ
- product
- ๋งค์ฃผ ์์์ผ ์ค์ 9์ Release Bundle ์ค ๋ฐฐํฌํ ๋ฒ์ ์ ๋ฐฐํฌ์๊ฐ ์ง์ ์ง์ ํ์ฌ ์คํ
=> (09:00-09:50) AI, BE, FE๊ฐ ๊ฐ๋ณ ๋ ํฌ๋ก ๋ถ๋ฆฌ๋์ด ์์ด ์๋น์ค ๊ท๊ฒฉ์ด ์ผ์นํ๋ฉฐ ๊ฒ์ฆ๋ ๋ฒ์ ์กฐํฉ ์ต์ข ๊ฒํ ๋ฅผ ์ ํํด์ผ ํ๋ค.
=> (09:30) ์ฌ์ฉ์๋ค์๊ฒ 10:00๋ถํฐ 5๋ถ ๋ฏธ๋ง(๋กค๋ฐฑ ํฌํจ)์ ๋ค์ดํ์์ด ๋ฐ์ํ ์ ์์์ ์ถฉ๋ถํ ๊ณ ์งํ๋์ง ํ์ธํด์ผ ํ๋ค.
- ๋งค์ฃผ ์์์ผ ์ค์ 9์ Release Bundle ์ค ๋ฐฐํฌํ ๋ฒ์ ์ ๋ฐฐํฌ์๊ฐ ์ง์ ์ง์ ํ์ฌ ์คํ
- test
- ๋ณ๋ ๋ฐฐํฌ ์๋ํ๊ฐ ํ์ ์๋ค.
- Git SHA ํ๊ทธ์ latest ํ๊ทธ๋ก ๊ตฌ์ฑ๋ docker ์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ์์ pull ๋ฐ์ docker-compose.yml ํ์ผ์ ํ์ฉํ์ฌ ์คํ
- product
-
Release Bundle
-
์ธํ๋ผ ๊ด๋ฆฌ ๋ ํฌ์ ์ฆ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ๊ฐ ์ปจํ ์ด๋ ๋ฒ์ ์ ์กฐํฉ์ ์ ์ํ menifest ํ์ผ(releases/v0.0.0.yaml)์ ์ ์ฅํ๋ค.
-
ํ์ผ ์์ฑ ๋ฐ ์์ ์ ์ํด ์ํฌํ๋ก์ฐ ๊ฐ ๋ ํฌ์ ๋ฐฐํฌํ ๋ฒ์ ํ๊ทธ์ ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ ฅํ๋ฉด GitHub Actions ๋ฌ๋๊ฐ ์๋ ์ ๋ ฅ(ํด๋จผ ์๋ฌ ๋ฐฉ์ง)
-
๋ฒ๋ค์ ํฌํจ๋ ๊ฐ ์ด๋ฏธ์ง๊ฐ GHCR์ ์ค์ ๋ก ์กด์ฌํ๋์ง Docker Registry API๋ก ping์ ๋ ๋ ค ํ์ธ ์ ์ฐจ ํ์
-
release/v1.1.0.yaml
release_metadata: bundle_version: "v1.1.0" release_date: "2026-09-09T10:00:00+09:00" released_by: "janna" target_environment: "production" description: "์ ๊ธฐ ๋ฆด๋ฆฌ์ฆ (์ฑํ ์์ ํ ๋ฐ AI ๊ฒ์ฆ API ์ต์ ํ)" # ๊ฐ ์๋น์ค๋ณ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ฐ Git ์ญ์ถ์ ๋ฉํ๋ฐ์ดํฐ services: backend: service_name: "springboot" image_uri: "ghcr.io/ktb-market/market-backend" image_tag: "v1.1.2" image_digest: "sha256:7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069" git_commit_sha: "a1b2c3d4e5f67890123456789abcdef012345678" git_commit_short: "a1b2c3d" git_ref: "refs/tags/v1.1.2" built_at: "2026-09-08T18:20:11Z" ci_workflow_run_id: "1782390123" ai: service_name: "fastapi" image_uri: "ghcr.io/ktb-market/market-ai" image_tag: "v1.1.0" image_digest: "sha256:3a4b5c6d7e8f90123456789abcdef0123456789abcdef0123456789abcdef01" git_commit_sha: "f9e8d7c6b5a43210fedcba9876543210fedcba98" git_commit_short: "f9e8d7c" git_ref: "refs/tags/v1.1.0" built_at: "2026-09-07T14:15:30Z" ci_workflow_run_id: "1771239981"
-
-
workflow_dispatch
- CD ์ํฌํ๋ก์ฐ ์คํ ์ GHCR์ ์ ์ฌ๋ ํ๊ทธ ์ค ๋ฐฐํฌํ Release Bundle์ RELEASE_VERSION์ ๋งค๊ฐ๋ณ์๋ก ์๋ ์ ๋ ฅ๋ฐ์ ๋ฐฐํฌํ๋ค.
- ์์: RELEASE_VERSION=v1.0.0
=> [BACKEND_TAG:v1.0.2, AI_TAG:v1.0.1, FRONTEND_TAG:v1.0.0]๋ฅผ ํฌํจํ๋ค.
-
์น์ธ ์ ์ฑ
- Release Bundle ์์ฑ ์ BE, FE, AI ํํธ์ ๊ฐ ๋ด๋น์๋ฅผ ํฌํจํ์ฌ ์ต์ 3๋ช
์ด์์ ์น์ธ์ ๋ฐ์์ผ ๋ณํฉ ๊ฐ๋ฅํ๋๋ก ์ค์
=> GitHub Environments์ ์ํฌํ๋ก์ฐ ์น์ธ์๋ฅผ ์ง์ ํ๋ ์ค์ ์ ์ผ๋ฐ private ๋ ํฌ์์ ์ฌ์ฉํ ์ ์๋ค.
=> Release Bundle์ ๊ฒ์ฆ์ ๋๋ธ ์ด๋ฏธ์ง ์กฐํฉ์ผ๋ก ๊ฐ์ฃผํ์ฌ ์ธ์ ๋ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ์ด๋ค.
- ์น์ธ ๊ธฐ์ค: ์ ํ๋ ๋ฒ์ , ์ง์ ๋ฐฐํฌ ๋๋น ๋ณ๊ฒฝ์ , ๋ฉํฐ ๋ ํฌ ๊ฐ ํธํ
- Release Bundle ์์ฑ ์ BE, FE, AI ํํธ์ ๊ฐ ๋ด๋น์๋ฅผ ํฌํจํ์ฌ ์ต์ 3๋ช
์ด์์ ์น์ธ์ ๋ฐ์์ผ ๋ณํฉ ๊ฐ๋ฅํ๋๋ก ์ค์
-
์ด์ ๋ผ์ดํ์ฌ์ดํด
[1๋จ๊ณ: ๊ฐ ๋ ํฌ main ๋ณํฉ]
- FE, BE, AI ๊ฐ๋ณ ๋ ํฌ์์ ๊ธฐ๋ฅ ์๋ฃ ์ main์ ๋ณํฉ (์ฃผ 3ํ)
- CI๊ฐ ๋๋ฉฐ GHCR์ ๊ณ ์ ํ๊ทธ๋ก ์ด๋ฏธ์ง ์ ์ฌ (์ต๊ทผ 5๊ฐ ์ ์ง)
[2๋จ๊ณ: ์ ๊ธฐ ๋ฐฐํฌ ์ค๋น (์์์ผ 08:30)]
- ์ธํ๋ผ ๋ด๋น์๊ฐ
create-release-manifest์ํฌํ๋ก์ฐ ์คํ - ์๋์ผ๋ก
release/v1.1.0๋ธ๋์น ์์ฑ ๋ฐ PR ์คํ
[3๋จ๊ณ: PR ๋ฆฌ๋ทฐ ๋ฐ ์์ ]
- ํ์๋ค(BE, FE, AI ๋ฆฌ๋)์ด PR ์ฝ๋ฉํธ ๋ฐ ๋ณ๊ฒฝ ๋ด์ญ ํ์ธ
- [์์ ๋ฐ์ ์]: ์ํฌํ๋ก์ฐ ์ฌ์คํ์ผ๋ก PR ๋ธ๋์น ์๋ ๊ฐฑ์
- ๊ฐ ํํธ๋ณ 1๋ช ์ ํ์๋ก ํฌํจํ์ฌ 3๋ช ์ด์ ์น์ธ ์ main์ ๋ณํฉ
[4๋จ๊ณ: ์ค์ ์ด์ ๋ฐฐํฌ (์์์ผ 10:00)]
-
CD ์ํฌํ๋ก์ฐ ์คํ: RELEASE_VERSION="v1.1.0" ์ง์
-
์ธํ๋ผ ๋ ํฌ์ main์ ๋จธ์ง๋ releases/v1.1.0.yaml์ ๊ธฐ๋ฐ์ผ๋ก EC2 ์์ฐจ ๊ต์ฒด ๋ฐฐํฌ ์คํ
In-Place: EC2 ์ธ์คํด์ค์์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง pull -> ๊ธฐ์กด ์ปจํ
์ด๋ ์ค์ง ๋ฐ ์ ๊ฑฐ -> ์๋ก์ด ์ปจํ
์ด๋ ์คํ
=> ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ์ปจํ
์ด๋๋ง ๋์
docker compose pull <service>
docker compose up -d --no-deps <service>- ๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ ์๋ฒ ๋ฆฌ์์ค๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๊ณ , ํธ๋ํฝ ๋ผ์ฐํ ๋ฑ ์ถ๊ฐ์ ์ธ ์ํคํ ์ฒ ๊ตฌ์ฑ์ด ํ์ํ๋ค.
- 1์ฐจ ๋ฐฐํฌ์์๋ ์ฌ์ฉ์๊ฐ 30๋ช ์ผ๋ก ํ์ ์ ์ด๊ณ , ์ฌ์ ์ ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ์ถฉ๋ถํ ๊ณ ์ง(๋์ค์ฝ๋)๊ฐ ๊ฐ๋ฅํ๊ธฐ์ ์ ์ ๋์์ ์ค๋จ์ผ๋ก ์ธํ ๋ฆฌ์คํฌ๋ ๋ฌด์ค๋จ ๋ฐฐํฌ์ ํ์ํ ๋ฆฌ์์ค ๋๋น ๋งค์ฐ ์ ๋ค.
- Docker ์์ง ๋ ๋ฒจ Health Check(๊ธฐ๋ ์ฌ๋ถ ํ์ธ)
- docker-compose.yml์ ์ ์ํ healthcheck ์ ์ฑ ์ ์ํด ์ํ
- ์ ํ๋ฆฌ์ผ์ด์
์ค๋น ์ํ ํ์ธ
- Spring Boot Actuator ๋ด๋ถ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ์ฌ ๋ด๋ถ ์์กด์ฑ(DB) ์ ์ ์๋ฆฝ ๊ฒ์ฆ
- ์ธ๋ถ Nginx ๋ผ์ฐํ
ํฌํธ(443/80)๋ฅผ ํตํด ์๋น์ค ์ง์
๋ก ์ ํจ์ฑ ๊ฒ์ฆ
- 5XX Status Code ๋ฐํ ์ ์คํจ
- ์๋ ๋กค๋ฐฑ: ๊ฒ์ฆ ์คํจ(Timeout ๋ฑ) ์ ์คํฌ๋ฆฝํธ ๋ ๋ฒจ์์ ์ํ
- Release Bundle์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ฒ์ ์๋๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ ๋ ฌ๋ ์์๋๋ก ์ต๋ 4๋ฒ๊น์ง ๋ฒ์ ์ ํํฅํ์ฌ ์๋
=> ์ผ์ฃผ์ผ์ ์ต๋ 3๊ฐ ๋ฒ์ ์ด ์์ฑ๋ ๊ฒ์ผ๋ก ์์๋์ด ์ด์ ์ฃผ์ฐจ์ ์์ ๋ ๋ฐฐํฌ ๋ฒ์ ์ด ์ฌ์๋ 4ํ์ฐจ์ ๋๋ฌํ๊ธฐ ์ ์ ์ ์ฉ
- ์๋ ๋กค๋ฐฑ: CD ์ํฌํ๋ก์ฐ Release Bundle ๋ฒ์ ์ ํํฅ ์กฐ์ ํ์ฌ ์คํ
GitHub Secrets์ ์ฌ์ธ
- ์๋น์ค์ ๊ฐ์ธ ์ ๋ณด ๋ฑ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ ํฌํจ๋์ง ์์์ ๊ฐ๋ ฅํ ๋ณด์ ์์ค์ด ์๊ตฌ๋์ง ์๋๋ค.
- ์์ ์ ์ธ ์๋น์ค๊ฐ ์๋๋ผ์ ํด์ปค์๊ฒ ์ํ์ ๋ฐ์ ์ํ์ด ๋งค์ฐ ์ ๋ค.