GitHub Actions๋ก CI/CD ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ — ๋น๋๋ถํฐ ๋ฐฐํฌ๊น์ง. ์ฝ๋๋ฅผ pushํ๋ฉด ์์์ ํ
์คํธํ๊ณ , ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ์ฌ๋ฆฌ๊ณ , ๋ฐฐํฌ๊น์ง ํ๋ค. ์์ผ๋ก ํ๋ ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ GitHub Actions๋ฅผ, ์ํฌํ๋ก ๊ตฌ์กฐ๋ถํฐ ์ค์ .yml๊ณผ ์คํ ๊ฒฐ๊ณผ๊น์ง ํ ๋ฒ์ ์ ๋ฆฌํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
Docker ์ ๋ฌธ ๊ธ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ณ ์ปจํ ์ด๋๋ก ์คํํ๋ ๋ฒ์ ๋ค๋ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ์ด๋ ๊ฒ ์ ์๋ค — "๋ค์ ๋จ๊ณ๋ ์ด ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋น๋·๋ฐฐํฌํ๋ CI/CD"๋ผ๊ณ . ๊ทธ ๋ค์ ๋จ๊ณ๊ฐ ์ด ๊ธ์ด๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ค ์๊ฒ ๋์ด๋, ๋งค๋ฒ ์์ผ๋ก ํ๋ฉด ์ด๋ ๊ฒ ํ๋ฌ๊ฐ๋ค. ์ฝ๋๋ฅผ ๊ณ ์น๊ณ , ๋ก์ปฌ์์ ํ
์คํธํ๊ณ (๊ฐ๋ ๊น๋นกํ๊ณ ), docker build ์น๊ณ , ๋ ์ง์คํธ๋ฆฌ์ pushํ๊ณ , ์๋ฒ์ SSH๋ก ๋ค์ด๊ฐ์ pullํ๊ณ ์ฌ์์ํ๋ค. ์ฌ๋์ด ํ๋ ์ผ์ด๋ผ ํ
์คํธ๋ฅผ ๊ฑด๋๋ฐ๊ณ , ํ๊ทธ๋ฅผ ํท๊ฐ๋ฆฌ๊ณ , ๋ฐฐํฌ ์์๋ฅผ ๋น ๋จ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ค ๊ธ์์ผ ์ ๋
์ ์ฌ๊ณ ๊ฐ ๋๋ค.
CI/CD์ ํต์ฌ์ "์ฌ๋์ด ๋งค๋ฒ ๋ฐ๋ณตํ๋ ์ผ์ ์ฝ๋๋ก ๋ชป ๋ฐ์ ์๋์ผ๋ก ๋๋ฆฐ๋ค"๋ ๊ฒ์ด๋ค. ๋น๋·ํ ์คํธ·๋ฐฐํฌ๊ฐ ์ฝ๋๊ฐ ๋๋ฉด, ๋น ๋จ๋ฆด ์๋ ํท๊ฐ๋ฆด ์๋ ์๋ค.
GitHub Actions๋ ์ด ์๋ํ๋ฅผ GitHub ์ ์ฅ์ ์์์ ๋ฐ๋ก ํด์ฃผ๋ ๋๊ตฌ๋ค. ๋ณ๋ ์๋ฒ๋ฅผ ์ธ์ธ ํ์ ์์ด, ์ ์ฅ์์ .yml ํ์ผ ํ๋๋ฅผ ๋๋ฉด push·PR ๊ฐ์ ์ด๋ฒคํธ์ ๋ง์ถฐ ์ํฌํ๋ก๊ฐ ์คํ๋๋ค. ์ด ๊ธ์์๋ CI/CD๊ฐ ๋ฌด์์ธ์ง๋ถํฐ, ์ํฌํ๋ก์ ๊ตฌ์กฐ, ๋ฆฐํธ·ํ
์คํธ ์๋ํ(CI), Docker ์ด๋ฏธ์ง ๋น๋·ํธ์, ๊ทธ๋ฆฌ๊ณ ๋ฐฐํฌ(CD)๊น์ง ์ค์ .yml๊ณผ ํจ๊ป ๋จ๊ณ๋ณ๋ก ๋ง๋ ๋ค.
1. CI/CD๋ — ๊ทธ๋ฆฌ๊ณ GitHub Actions
๋จผ์ ์ฉ์ด๋ถํฐ ์ ๋ฆฌํ์.
- CI (Continuous Integration, ์ง์์ ํตํฉ) — ์ฝ๋๋ฅผ ์์ฃผ ํฉ์น๊ณ , ํฉ์น ๋๋ง๋ค ์๋์ผ๋ก ๋น๋·ํ ์คํธํด์ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ์ก๋ ๊ฒ. "์ด ๋ณ๊ฒฝ์ด ๋ญ๊ฐ ๊นจ๋จ๋ฆฌ์ง ์์๋?"๋ฅผ ๋งค push๋ง๋ค ๊ธฐ๊ณ๊ฐ ๊ฒ์ฌํ๋ค.
- CD (Continuous Delivery/Deployment, ์ง์์ ์ ๋ฌ/๋ฐฐํฌ) — CI๋ฅผ ํต๊ณผํ ๊ฒฐ๊ณผ๋ฌผ์ ์๋์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋ค๊ฑฐ๋, ์ค์ ๋ก ๋ฐฐํฌํ๋ ๊ฒ. ํ ์คํธ๋ฅผ ํต๊ณผํ ๋ฐ๋ก ๊ทธ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ๋ด๋ณด๋ธ๋ค.
ํ ๋ฌธ์ฅ์ผ๋ก, CI๋ "๊นจ์ง ๊ฑธ ์ผ์ฐ ์ก๋ ๊ทธ๋ฌผ", CD๋ "๊ฒ์ฆ๋ ๊ฑธ ์๋์ผ๋ก ๋ด๋ณด๋ด๋ ์ปจ๋ฒ ์ด์ด"๋ค.
GitHub Actions๋ ์ด ๋์ GitHub์ ๋ด์ฅ๋ ํํ๋ก ์ ๊ณตํ๋ค. ๋์์ ์ดํดํ๋ ค๋ฉด ๋ค์ฏ ๋จ์ด๋ฉด ๋๋ค.
- Workflow — ์๋ํ ์ ์ฒด.
.github/workflows/์์.ymlํ์ผ ํ๋๊ฐ ์ํฌํ๋ก ํ๋๋ค. - Event — ์ํฌํ๋ก๋ฅผ ์คํ์ํค๋ ๋ฐฉ์์ .
push,pull_request, ํ๊ทธ ์์ฑ ๋ฑ. - Job — ์ํฌํ๋ก ์์ ์์ ๋จ์. ์ฌ๋ฌ Job์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ ฌ ์คํ๋๋ฉฐ, ์์กด ๊ด๊ณ๋ฅผ ์ค ์ ์๋ค.
- Step — Job ์์ ํ ๋จ๊ณ. ์ก์
์ ํธ์ถ(
uses)ํ๊ฑฐ๋ ์ ธ ๋ช ๋ น์ ์คํ(run)ํ๋ค. - Runner — Job์ ์ค์ ๋ก ์คํํ๋ ๊ฐ์ ๋จธ์ (๋ณดํต
ubuntu-latest). ๋งค๋ฒ ๊นจ๋ํ ํ๊ฒฝ์์ ์์ํ๋ค.
2. ์ํฌํ๋ก์ ๊ตฌ์กฐ — YAML ํ ์ฅ ๋ฏ์ด๋ณด๊ธฐ
์ํฌํ๋ก ํ์ผ์ ์ ์ฅ์์ .github/workflows/ ํด๋์ ๋๋ค. ๊ฐ์ฅ ์์ ์์ ๋ก ๊ตฌ์กฐ๋ฅผ ๋ณด์.
# .github/workflows/ci.yml
name: CI # ์ํฌํ๋ก ์ด๋ฆ (Actions ํญ์ ํ์)
on: # ์ธ์ ์คํํ ์ง — ์ด๋ฒคํธ
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test: # job ์ด๋ฆ
runs-on: ubuntu-latest # ์ด๋ค runner์์ ๋๋ฆด์ง
steps:
- uses: actions/checkout@v5 # 1) ์ ์ฅ์ ์ฝ๋ ์ฒดํฌ์์
- uses: actions/setup-node@v5 # 2) Node.js ์ค์น
with:
node-version: "20"
cache: "npm" # ์์กด์ฑ ์บ์ (๋น๋ ๋จ์ถ)
- run: npm ci # 3) ์์กด์ฑ ์ค์น
- run: npm test # 4) ํ
์คํธ ์คํ
์ฝ๋ ๋ฒ์ ์์์ ์๋๋ก ๊ทธ๋๋ก๋ค. on์ด ์ธ์ , jobs๊ฐ ๋ฌด์์, steps๊ฐ ์ด๋ค ์์๋ก๋ฅผ ์ ์ํ๋ค. uses๋ ๋จ์ด ๋ง๋ ์ฌ์ฌ์ฉ ์ก์
์ ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฒ์ด๊ณ (actions/checkout์ฒ๋ผ), run์ ์
ธ ๋ช
๋ น์ ์ง์ ์คํํ๋ ๊ฒ์ด๋ค.

์ด ํ์ผ์ ์ ์ฅ์์ pushํ๋ฉด, ๊ทธ ์๊ฐ๋ถํฐ main์ ๋ํ push์ PR๋ง๋ค GitHub๊ฐ ์๋์ผ๋ก ์ด ์ํฌํ๋ก๋ฅผ ๋๋ฆฐ๋ค. ์ ์ฅ์์ Actions ํญ์์ ์คํ ์ด๋ ฅ๊ณผ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์๋ค.
๋ฒ์ ๋ฉ๋ชจ. ์ก์ ๋ฒ์ (
@v5,@v4๋ฑ)์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ค. ํญ์ ๋ฉ์ด์ ํ๊ทธ๋ก ํํ๊ณ (@main์ฒ๋ผ ๋ ๋ค๋๋ ์ฐธ์กฐ๋ ํผํ๋ค), ์ค์ ์ ์ฉ ์ GitHub Marketplace์์ ์ต์ ๋ฉ์ด์ ๋ฒ์ ์ ํ ๋ฒ ํ์ธํ๋ ๊ฒ ์ข๋ค.
3. CI ํ์ดํ๋ผ์ธ — ๋ฆฐํธ·ํ ์คํธ ์๋ํ
์ด์ ์ค์ฉ์ ์ธ CI๋ฅผ ๋ง๋ค์ด๋ณด์. PR์ด ์ฌ๋ผ์ฌ ๋๋ง๋ค ๋ฆฐํธ → ํ ์คํธ๋ฅผ ๋๋ ค์, ํต๊ณผํ์ง ๋ชปํ๋ฉด ๋จธ์ง๋ฅผ ๋ง๋ ๊ฒ ๋ชฉํ๋ค.
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# ๊ฐ์ ๋ธ๋์น์ ์ push๊ฐ ์ค๋ฉด ์งํ ์ค์ด๋ ๋ก์ ์คํ์ ์ทจ์
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node: ["20", "22"] # ๋ Node ๋ฒ์ ์์ ๋์์ ๊ฒ์ฆ
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: ${{ matrix.node }}
cache: "npm"
- run: npm ci
- run: npm run lint # ESLint ๋ฑ
- run: npm test # ํ
์คํธ
๋ช ๊ฐ์ง ์ค๋ฌด ์ฅ์น๊ฐ ๋ค์ด ์๋ค.
- matrix —
node: ["20", "22"]๋ก ์ฌ๋ฌ ๋ฒ์ ์์ ๋ณ๋ ฌ๋ก ๊ฐ์ ๊ฒ์ฆ์ ๋๋ฆฐ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ค ํ๊ฒฝ ์ง์์ ์ ์ฉํ๋ค. - concurrency — ๋น ๋ฅด๊ฒ ์ฐ์ pushํ ๋, ์ด๋ฏธ ๋๊ณ ์๋ ๋ก์ ์คํ์ ์๋ ์ทจ์ํด ๋ญ๋น๋ฅผ ์ค์ธ๋ค.
- cache: "npm" — ์์กด์ฑ์ ์บ์ํด
npm ci์๊ฐ์ ํฌ๊ฒ ์ค์ธ๋ค.
DB๊ฐ ํ์ํ ํตํฉ ํ
์คํธ๋ผ๋ฉด, services๋ก ํ
์คํธ์ฉ ์ปจํ
์ด๋(์: PostgreSQL)๋ฅผ ๋์ธ ์ ์๋ค. ์ฌ๊ธฐ์ Docker์์ ๋ฐฐ์ด ์ปจํ
์ด๋ ๊ฐ๋
์ด ๊ทธ๋๋ก ์ฐ์ธ๋ค.
services:
postgres:
image: postgres:17
env:
POSTGRES_PASSWORD: testpass
POSTGRES_DB: testdb
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
pushํ๋ฉด Actions ํญ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ค. ํต๊ณผํ๋ฉด ์ด๋ฐ ๋ชจ์ต์ด๋ค.
โ test (20) 1m 38s
โ test (22) 1m 41s
All checks have passed
ํ๋๋ผ๋ ์คํจํ๋ฉด ๋นจ๊ฐ X๊ฐ ๋จ๊ณ , ๋ธ๋์น ๋ณดํธ ๊ท์น(๋ค์์ ์ค๋ช )๊ณผ ๋ฌถ์ผ๋ฉด ๊ทธ PR์ ๋จธ์ง๊ฐ ๋งํ๋ค. "ํ ์คํธ ํต๊ณผ ์์ด๋ main์ ๋ชป ๋ค์ด์จ๋ค"๊ฐ ์ฝ๋๋ก ๊ฐ์ ๋๋ค.
4. ์ด๋ฏธ์ง ๋น๋ & ํธ์ — Docker์ ์ฐ๊ฒฐ
CI๊ฐ ์ด๋ก๋ถ์ด๋ฉด, ์ด์ Docker ์
๋ฌธ์์ ๋ง๋ Dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ๋ ์ง์คํธ๋ฆฌ์ ์ฌ๋ฆฐ๋ค. ์ฌ๊ธฐ์๋ GitHub๊ฐ ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ GitHub Container Registry(ghcr.io)์ ํธ์ํ๋ค.
# .github/workflows/docker.yml
name: Build and Push Image
on:
push:
branches: [main]
tags: ["v*.*.*"]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }} # ์: jinoism/myapp
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write # ghcr.io ํธ์์ ํ์
steps:
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Log in to GHCR
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} # ์๋ ์ ๊ณต — ๋ณ๋ ์ค์ ๋ถํ์
- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch # ๋ธ๋์น๋ช
ํ๊ทธ
type=semver,pattern={{version}} # v1.2.3 ํ๊ทธ
type=sha,prefix=sha- # ์ปค๋ฐ SHA ํ๊ทธ
- name: Build and push
uses: docker/build-push-action@v7
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha # GitHub Actions ์บ์ ํ์ฉ
cache-to: type=gha,mode=max
ํต์ฌ ํฌ์ธํธ๋ง ์ง์.
- permissions: packages: write —
ghcr.io์ ํธ์ํ๋ ค๋ฉด ์ด ๊ถํ์ด ํ์ํ๋ค. secrets.GITHUB_TOKEN— GitHub๊ฐ ์ํฌํ๋ก๋ง๋ค ์๋ ๋ฐ๊ธํ๋ ํ ํฐ์ด๋ผ, GHCR ๋ก๊ทธ์ธ์ ๋ณ๋ ๋น๋ฐํค๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค.- metadata-action — Git ์ ๋ณด(๋ธ๋์น·ํ๊ทธ·SHA)๋ก ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์๋ ์์ฑํ๋ค. ์์ผ๋ก ํ๊ทธ๋ฅผ ๋ถ์ด๋ค ์ค์ํ๋ ์ผ์ด ์ฌ๋ผ์ง๋ค.
- cache-from/to: gha — ์ด์ ๋น๋์ ๋ ์ด์ด ์บ์๋ฅผ ์ฌ์ฌ์ฉํด ๋น๋๋ฅผ ๋จ์ถํ๋ค(๋ ์ด์ด ์บ์ ๊ฐ๋ ์ Docker ๊ธ ์ฐธ๊ณ ).
์ฑ๊ณตํ๋ฉด ์ ์ฅ์์ Packages์ ์ด๋ฏธ์ง๊ฐ ์ฌ๋ผ๊ฐ๋ค.
#9 exporting to image
#9 pushing ghcr.io/jinoism/myapp:main
#9 pushing ghcr.io/jinoism/myapp:sha-a1b2c3d
#9 DONE
์ด์ docker pull ghcr.io/jinoism/myapp:main์ผ๋ก ์ด๋์๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ์ ์๋ค.
5. CD — ๋ฐฐํฌ ์๋ํ์ ์ํฌ๋ฆฟ
๋ง์ง๋ง ์กฐ๊ฐ์ด๋ค. ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ์ค์ ์๋ฒ์ ๋ฐฐํฌํ๋ค. ํต์ฌ์ "ํ ์คํธ๋ฅผ ํต๊ณผํ ๋ฐ๋ก ๊ทธ ์ด๋ฏธ์ง๋ฅผ, ๊ฒ์ฆ์ ๊ฑฐ์ณ ๋ด๋ณด๋ธ๋ค"๋ ํ๋ฆ์ด๋ค.

Job ์ฌ์ด ์์๋ needs๋ก ๋ชป ๋ฐ๋๋ค. test๊ฐ ํต๊ณผํด์ผ build๊ฐ ๋๊ณ , build๊ฐ ๋๋์ผ deploy๊ฐ ๋๋ค.
jobs:
test:
runs-on: ubuntu-latest
steps:
# ... (3๋ฒ์ CI ๋ด์ฉ)
build:
needs: test # test ํต๊ณผ ํ์๋ง
runs-on: ubuntu-latest
steps:
# ... (4๋ฒ์ ๋น๋·ํธ์ ๋ด์ฉ)
deploy:
needs: build # build ์ฑ๊ณต ํ์๋ง
runs-on: ubuntu-latest
environment: production # ์น์ธ ๊ฒ์ดํธ (์๋ ์ค๋ช
)
steps:
- name: Deploy over SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /srv/myapp
docker compose pull # ์ ์ด๋ฏธ์ง ๋ฐ๊ธฐ
docker compose up -d # ๋ฌด์ค๋จ์ ๊ฐ๊น๊ฒ ๊ต์ฒด
๋ฐฐํฌ ๋จ๊ณ์ ํต์ฌ์ ๋ ๊ฐ์ง๋ค.
์ํฌ๋ฆฟ(Secrets). ์๋ฒ ์ฃผ์·์ ์ ํค ๊ฐ์ ๋ฏผ๊ฐํ ๊ฐ์ ์ ๋ .yml์ ํ๋์ฝ๋ฉํ์ง ์๋๋ค. ์ ์ฅ์ Settings → Secrets and variables → Actions์ ๋ฑ๋กํ๊ณ , ์ํฌํ๋ก์์๋ ${{ secrets.์ด๋ฆ }}์ผ๋ก ์ฐธ์กฐํ๋ค. ์ฝ๋์๋ ๊ฐ์ด ๋๋ฌ๋์ง ์๊ณ , ๋ก๊ทธ์๋ ๋ง์คํน๋๋ค.
์น์ธ ๊ฒ์ดํธ(Environment). environment: production์ ์ง์ ํ๊ณ ๊ทธ ํ๊ฒฝ์ ํ์ ๋ฆฌ๋ทฐ์ด๋ฅผ ๊ฑธ์ด๋๋ฉด, ์ด์ ๋ฐฐํฌ ์ง์ ์ "Approve"๋ฅผ ๋๋ฌ์ผ ์งํ๋๋ค. ์๋ํํ๋ ์ด์ ๋ฐฐํฌ๋ง์ ์ฌ๋์ด ํ ๋ฒ ํ์ธํ๋, ํ์ค์ ์ธ ์ ์ถฉ์ด๋ค.
์ ์์๋ SSH๋ก ์๋ฒ์ ๋ค์ด๊ฐ
docker compose๋ก ๊ต์ฒดํ๋ ๋จ์ํ ๋ฐฉ์์ด๋ค. Vercel·AWS·Cloudflare ๊ฐ์ ํ๋ซํผ์ ๊ฐ์์ ๊ณต์ ์ก์ ์ด๋ OIDC ์ฐ๋์ ์ ๊ณตํ๋ฏ๋ก, ๋ฐฐํฌ ๋์์ ๋ง๋ ์ก์ ์ผ๋ก ์ดdeployJob๋ง ๊ฐ์๋ผ์ฐ๋ฉด ๋๋ค.
6. ์ค์ ํ — ๋ ๋น ๋ฅด๊ณ ์์ ํ๊ฒ
๋ง์ง๋ง์ผ๋ก, ๊ตด๋ ค๋ณด๋ฉด ๊ณง ํ์ํด์ง๋ ๊ฒ๋ค์ ์ ๋ฆฌํ๋ค.
- ๋ธ๋์น ๋ณดํธ ๊ท์น — Settings → Branches์์ main์ "์ํ ์ฒดํฌ ํต๊ณผ ํ์"๋ฅผ ๊ฑธ๋ฉด, CI๊ฐ ์ด๋ก๋ถ์ด ์๋ PR์ ๋จธ์ง๊ฐ ๋งํ๋ค. CI๋ฅผ "์์ผ๋ฉด ์ข์ ๊ฒ"์์ "ํต๊ณผํด์ผ ํ๋ ๊ณ์ฝ"์ผ๋ก ๋ฐ๊พผ๋ค.
- ์บ์ —
cache: "npm"(์์กด์ฑ)๊ณผcache-from/to: gha(Docker ๋ ์ด์ด)๋ง ์ผ๋ ํ์ดํ๋ผ์ธ ์๊ฐ์ด ์ ๋ฐ ์ดํ๋ก ์ค๊ณค ํ๋ค. - concurrency — ์ฐ์ push ์ ๋ก์ ์คํ์ ์๋ ์ทจ์ํด runner ์๊ฐ์ ์๋๋ค.
- ๋๋ฒ๊น
— ์คํจํ Job์ ๋ก๊ทธ๋ฅผ ํผ์ณ ๋ณด๊ณ , ์ ์ฒด๊ฐ ์๋๋ผ "Re-run failed jobs"๋ก ์คํจ๋ถ๋ง ๋ค์ ๋๋ฆฐ๋ค. ์ ์ฅ์ ์ํฌ๋ฆฟ์
ACTIONS_STEP_DEBUG=true๋ฅผ ๋๋ฉด ๋ ์์ธํ ๋ก๊ทธ๊ฐ ๋์จ๋ค. - ๊ถํ ์ต์ํ —
permissions๋ ํ์ํ ๊ฒ๋ง ๋ช ์ํ๋ค(์: ๋น๋ Job์๋งpackages: write). ๊ธฐ๋ณธ์ ์ขํ๊ณ ํ์ํ ๊ณณ๋ง ์ฐ๋ค.
์๋๋ ์์ฃผ ์ฐ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ ๋ฆฌํ ํ๋ค.
| ํธ๋ฆฌ๊ฑฐ | ์ธ์ ์คํ๋๋ |
push (branches) |
ํน์ ๋ธ๋์น์ ํธ์ํ ๋ |
pull_request |
PR์ด ์ด๋ฆฌ๊ฑฐ๋ ๊ฐฑ์ ๋ ๋ |
push (tags) |
v1.2.3 ๊ฐ์ ํ๊ทธ๋ฅผ ํธ์ํ ๋ (๋ฆด๋ฆฌ์ค ๋ฐฐํฌ์ ์ ํฉ) |
workflow_dispatch |
Actions ํญ์์ ์๋ ์คํ ๋ฒํผ์ผ๋ก |
schedule (cron) |
์ ํด์ง ์๊ฐ๋ง๋ค (์ผ๊ฐ ๋ฐฐ์น ๋ฑ) |
๋ง์น๋ฉฐ
CI/CD๋ "์ฌ๋์ด ๋งค๋ฒ ๋ฐ๋ณตํ๋ ๋น๋·ํ
์คํธ·๋ฐฐํฌ๋ฅผ ์ฝ๋๋ก ๋ชป ๋ฐ์ ์๋ํํ๋ค"๋ ๋ฐ์์ด๋ค. GitHub Actions๋ ์ด๊ฑธ ์ ์ฅ์ ์์์ .yml ํ๋ ์ฅ์ผ๋ก ํด๊ฒฐํ๋ค. pushํ๋ฉด ํ
์คํธ๊ฐ ๋๊ณ (CI), ํต๊ณผํ๋ฉด ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ๋ ์ง์คํธ๋ฆฌ์ ์ฌ๋ฆฌ๊ณ , ์น์ธ ํ ๋ฐฐํฌ๋๋(CD) ํ๋ฆ์ด ํ ๋ฒ ๊ฐ์ถฐ์ง๋ฉด, ๋ฐฐํฌ๋ ๋ ์ด์ ๊ธด์ฅ๋๋ ์์์
์ด ์๋๋ผ ์ผ์์ด ๋๋ค.
ํต์ฌ๋ง ๋ค์ ์ง์ผ๋ฉด, Event → Workflow → Job → Step ๊ตฌ์กฐ ์์์, needs๋ก ์์๋ฅผ ์๊ณ , ์ํฌ๋ฆฟ์ผ๋ก ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ณ , ์บ์๋ก ์๋๋ฅผ ์ฌ๋ฆฌ๊ณ , ์น์ธ ๊ฒ์ดํธ๋ก ์์ ์ฅ์น๋ฅผ ๋๋ค. Docker์์ ๋ง๋ ์ด๋ฏธ์ง๊ฐ ์ฌ๊ธฐ์ ์๋์ผ๋ก ๋น๋·๋ฐฐํฌ๋๋ฉฐ ํ๋์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ด์ด์ง๋ค.
๋ค์ ๋จ๊ณ๋ ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๊ฑธ์ณ ์ด์ํ๊ณ ์๋ ๋ณต๊ตฌ·ํ์ฅํ๋ ์ค์ผ์คํธ๋ ์ด์ , ์ฆ Kubernetes๋ค. ๊ทธ๊ฑด ๋ณ๋ ๊ธ์์ ์ด์ด๊ฐ๊ฒ ๋ค.
์ฐธ๊ณ ์ถ์ฒ
- GitHub Docs — Understanding GitHub Actions — https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
- GitHub Docs — Publishing Docker images — https://docs.github.com/en/actions/publishing-packages/publishing-docker-images
- Docker Docs — Introduction to GitHub Actions — https://docs.docker.com/guides/gha/
- docker/build-push-action — https://github.com/docker/build-push-action
- docker/metadata-action — https://github.com/docker/metadata-action
'๐ Tech Stack > Database & Infra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Kubernetes ์ ๋ฌธ (1) | 2026.06.30 |
|---|---|
| Docker ์ ๋ฌธ (1) | 2026.06.28 |
| ์คํ๊ณํ(EXPLAIN) ํ ๋ฒ์ ์ฝ๊ธฐ (1) | 2026.06.26 |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ณด๋ ๊ฒ๋ค (0) | 2026.05.20 |
