Continuous Integration - 100-hours-a-week/3-team-ssammu-wiki GitHub Wiki
-
์๋ ๋ฐฐํฌ๋ก ์ธํ ์ค์ ๋ฐ์
๊ฐ๋ฐ์๊ฐ ์ง์ SSH๋ก VM์ ์ ์ํ๊ณ
scp
๋ก ํ์ผ์ ์ ์กํ๋ ๋ฐฉ์์ ๋ฐ๋ณต์ ์ด๊ณ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ -
์ฝ๋ ํ์ง ๊ด๋ฆฌ ๋ถ์ฌ
์ผ๊ด๋ ํ ์คํธ๋ ๋ฆฐํธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ ์ฝ๋๊ฐ ๋ณํฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์
-
ํ์ ๋ฐ ๊ฐ์์ฑ ๋ถ์กฑ
๋๊ฐ ์ด๋ค ์ฝ๋๋ฅผ ์ธ์ ์ด๋ค ํ๊ฒฝ์ ๋ฐ์ํ๋์ง ์ถ์ ์ด ์ด๋ ค์
์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋ณ๊ฒฝํ ์ฝ๋๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํตํฉํ๊ณ , ๋น๋ ๋ฐ ํ ์คํธ ์๋ํ๋ฅผ ํตํด ํ์ง์ ์ ์งํ๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค.
-
์๋ํ๋ ๋น๋ยทํ ์คํธ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
ํธ์(Push) ๋๋ PR ์์ ์ ์๋์ผ๋ก ๋์ํ์ฌ ์ฝ๋ ํ์ง ์ ์ง
-
์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ ์ ์ง
๋ชจ๋ ๋ธ๋์น/์ปค๋ฐ์์ ๋์ผํ ํ๊ฒฝ์์ ํ ์คํธ ๋ฐ ๋ถ์ ์ํ
-
๋ฌธ์ ์กฐ๊ธฐ ๋ฐ๊ฒฌ ๋ฐ ๋น ๋ฅธ ํผ๋๋ฐฑ
ํ ์คํธ ์คํจ, ๋ฆฐํธ ์ค๋ฅ ๋ฑ์ ๋น ๋ฅด๊ฒ ๊ฐ์งํ๊ณ ์์ ์ ๋
-
๋ฐฐํฌ ์์ ์ฑ ํ๋ณด
๋น๋ ๊ฒฐ๊ณผ๋ฅผ Cloud Storage ๋ฑ์ ์์ ํ๊ฒ ์ ์ฅํ์ฌ ๋ฐฐํฌ ์์ ์ฑ ๊ฐํ
ํ์ฌ ์ฐ๋ฆฌ ํ์ ์์ค์ฝ๋ ๊ด๋ฆฌ ๋ฐ ํ์ ๋๊ตฌ๋ก GitHub์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํญ๋ชฉ | ์ค๋ช |
---|---|
์ ๊ณ ํ์ค ๋๊ตฌ | ๋๋ถ๋ถ์ ์คํ์์ค ํ๋ก์ ํธ์ ์คํํธ์ , ๊ธฐ์ ๊ฐ๋ฐํ์ด ์ฌ์ฉ ์ค์ด๋ฉฐ, ํ์ ๊ดํ์ด ์ ์ ๋ฆฝ๋ผ ์์ |
PR ๊ธฐ๋ฐ ํ์ | Pull Request๋ฅผ ํตํด ์ฝ๋ ๋ฆฌ๋ทฐ, ์น์ธ, ๋จธ์ง ๊ณผ์ ์ด ํฌ๋ช ํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌ๋จ |
๊ฐ์์ฑ ๋ฐ ์ถ์ ์ฑ | ์ปค๋ฐ/PR/๋ฆฌ๋ทฐ/๋ฆด๋ฆฌ์ฆ ๊ธฐ๋ก์ด ๋ช ํํ๊ฒ ๋จ์ ํ ๋ด ํ์คํ ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ฉ์ด |
ํ์ฅ ๊ฐ๋ฅํ ์ํ๊ณ | Actions, Dependabot, ๋ณด์ ๊ฒ์ฌ ๋ฑ ๋ค์ํ ์๋ํ ๊ธฐ๋ฅ์ ์ค์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ |
๋ณด์ ๋ฐ ๊ถํ ๊ด๋ฆฌ | ์กฐ์ง๋ณ ๊ถํ ์ค์ , ๋ธ๋์น ๋ณดํธ, ๋น๋ฐ ๊ฐ ๊ด๋ฆฌ ๋ฑ ํ์ ์ ํ์ํ ๋ณด์ ๊ธฐ๋ฅ์ด ์๋น |
๋น์ฉ ํจ์จ์ฑ | Private ์ ์ฅ์๋ ๋ฌด๋ฃ ์ ๊ณต๋๋ฉฐ, ํ ๊ท๋ชจ๊ฐ ์์๋ ๋ถ๋ด ์์ด ์ฌ์ฉ ๊ฐ๋ฅ |
GitHub์ ๋จ์ํ ์ฝ๋ ์ ์ฅ์๋ฅผ ๋์ด์ ํจ์จ์ ์ธ ํ์ ํ๋ซํผ์ผ๋ก ๊ธฐ๋ฅํ๊ณ ์์ผ๋ฉฐ, CI/CD์๋ ๋ฐ์ ํ๊ฒ ํตํฉ๋์ด ์์ด ์ ์ง๊ด๋ฆฌ ๋ถ๋ด์ด ์ ์ต๋๋ค.
GitHub๊ณผ ์์ ํ ํตํฉ๋๋ CI ๋๊ตฌ๋ก๋ GitHub Actions๋ฅผ ์ ํํ์ต๋๋ค. ์๋๋ ์ฃผ์ CI ๋๊ตฌ์์ ๋น๊ต์ ๋๋ค:
ํญ๋ชฉ | GitHub Actions | GitLab CI/CD | Jenkins |
---|---|---|---|
GitHub ํตํฉ์ฑ | โ ์์ ํตํฉ, ๋ณ๋ ์ฐ๋ ๋ถํ์ | ๐ถ ์ธ๋ถ ์ฐ๋ ํ์ | โ ์๋ ์ฐ๋ ๋ฐ ์ค์ ํ์ |
์ค์ ๋ฐฉ์ |
.yml ๊ธฐ๋ฐ์ผ๋ก ์ง๊ด์ |
.gitlab-ci.yml |
Groovy ์คํฌ๋ฆฝํธ ๋๋ UI ์ค์ |
ํ์ต ๊ณก์ | โ ๋ฎ์ | ์ค๊ฐ | โ ๋์ |
ํ์ฅ์ฑ | GitHub Marketplace์์ ์์ฒ ๊ฐ ์ก์ ์ ๊ณต | ์ผ๋ถ ์คํ์์ค ์ง์ | ํ๋ฌ๊ทธ์ธ ๋ง์ง๋ง ๋ณต์ก |
๋ณด์ ์ฐ๋ | GitHub ๊ณ์ ๋ฐ ์กฐ์ง ๊ถํ๊ณผ ํตํฉ | ๋ณ๋ ์ธ์ฆ ํ์ | ๋ณ๋ ์ค์ ํ์ |
๋น์ฉ | โ Private ์ ์ฅ์๋ ๋ฌด๋ฃ tier ์ง์ | ๋ฌด๋ฃ tier ์ ํ ์กด์ฌ | ์๋ฒ ์ง์ ์ด์ ํ์ |
GCP ์ฐ๋ | ๊ณต์ ์ก์
๋ฐ gcloud CLI ์ง์์ผ๋ก ๊ฐํธ |
๋งค๋ด์ผ ์ค์ ํ์ | ํ๋ฌ๊ทธ์ธ ๋๋ Shell ์คํฌ๋ฆฝํธ ์์ฑ ํ์ |
GitHub Actions๋ GitHub ๊ธฐ๋ฐ์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ฅ ์์ฐ์ค๋ฝ๊ณ ์ฝ๊ฒ ์๋ํํ ์ ์๋ CI ๋๊ตฌ์ ๋๋ค.
๋ณ๋ CI ์๋ฒ ์์ด๋ ๋น ๋ฅด๊ฒ ๊ตฌ์ถ ๊ฐ๋ฅํ๋ฉฐ, GCP ๋ฐ ํ ์๋น์ค์์ ์ฐ๋๋ ๊ฐ๋จํ๋ค๋ ์ ์์ ์ค๋ฌด ์ ์ฉ์ฑ๊ณผ ํจ์จ์ฑ์ด ๋งค์ฐ ๋ฐ์ด๋ฉ๋๋ค.
๋ธ๋์น ์ด๋ฆ | ์ฉ๋ | ๋ณํฉ ๋ฐฉ์ | ๋ธ๋์น ์์ฑ ๊ธฐ์ค | ํ์ดํ๋ผ์ธ ์ค๋ช |
---|---|---|---|---|
main |
์ด์ ๊ธฐ์ค ์์ ํ๋ ์ฝ๋ ์ค๋ ์ท - ์ด์ ๋ฆด๋ฆฌ์ฆ ํ merge๋จ | Push, PR + ๋ฆฌ๋ทฐ ํ ๋ณํฉ | - | |
release/x.y.z |
์ด์ ๋ฐฐํฌ ๋ธ๋์น | Push, PR + ๋ฆฌ๋ทฐ ํ ๋ณํฉ | dev |
build โ test โ lint โ artifact |
dev |
ํตํฉ ํ ์คํธ ๋ธ๋์น | Push, PR + ๋ฆฌ๋ทฐ ํ ๋ณํฉ | main |
build โ test โ lint โ artifact |
feature/* |
๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น | Push | dev |
lint |
hotfix/* |
์ด์ ์ค ๊ธด๊ธ ์์ | Push | release |
build โ test โ lint |
(feature/ํ์๊ฐ์
) โ dev โ release/1.0.0 โ main
โ โ
hotfix/* ์ด์ ๊ธฐ์ค ์ค๋
์ท
release
๋ธ๋์น๋ ์ด์ ๋ฐฐํฌ ์ QA ์ต์ข
๊ณต๊ฐ์
๋๋ค. ๊ฒ์ ํ์๋ง main
์ ๋ณํฉํฉ๋๋ค.
main
์ ์ด์ ๋ฐฐํฌ ์ด๋ ฅ์ด ์ถ์ ๋ ์ค๋
์ท ์ ์ฅ์ ์ญํ ์ ํ๋ฉฐ, ์ง์ ๋ฐฐํฌ์๋ ๊ด์ฌํ์ง ์์ต๋๋ค.
๊ธด๊ธ ์์ ์์๋ ๋ฐ๋์ hotfix/*
๋ฅผ ์ฌ์ฉํ๋ฉฐ, release
์ dev
์ ๋ชจ๋ ๋ณํฉํฉ๋๋ค.
์ด๊ธฐ ์ค๊ณ๋ ์๋์ ๊ฐ์ด ๋๋ ๋ณด๋ฉด ์ข์์:
-
Build: ์ข
์์ฑ ์ค์น, ๋น๋ (ex.
npm install
,npm run build
) -
Test: ์ ๋ ๋ฐ ํตํฉ ํ
์คํธ ์ํ (ex.
npm run test
) -
Lint : ์ฝ๋ ์คํ์ผ ์ ๊ฒ (ex.
eslint
) - Artifact Upload: ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ GCS์ ์ ๋ก๋ํ์ฌ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋กค๋ฐฑ ๋๋น
์๋น์ค | ์ ์ฅ ๊ฒฝ๋ก ์์ | ์ค๋ช |
---|---|---|
Backend | gs://careerbee-deploy-artifacts/backend/app-.jar | ๊ฐ ์ปค๋ฐ๋ง๋ค JAR ํ์ผ ์ ์ฅ |
Frontend | gs://careerbee-deploy-artifacts/frontend// | ์ ์ ๋ฆฌ์์ค ๋๋ ํ ๋ฆฌ ์ ์ฒด ์ ์ฅ |
AI Server | gs://careerbee-deploy-artifacts/ai/ai-.zip | ์์ค, ๊ฐ์ํ๊ฒฝ ํฌํจ ์์ถ ํ์ผ ์ ์ฅ |
artifact๋ ๋น๋๋ ์คํ ํ์ผ ๋๋ ์ ์ ํ์ผ์ ์๋ฏธํ๋ฉฐ, ์ปค๋ฐ ํด์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ฅ๋์ด ๋กค๋ฐฑ ์ ์ ํํ ์์ ๋ณต์์ด ๊ฐ๋ฅํฉ๋๋ค.
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
Trigger | push |
์ฃผ์ ๋จ๊ณ | checkout โ install โ lint |
๋ฐฐํฌ ์ฌ๋ถ | โ ์์ |
๊ธฐ๋ฅ | ๊ฐ๋ฐ ์ค ๋น ๋ฅธ ํผ๋๋ฐฑ์ฉ (๋จ๊ณ ์คํจ ์ PR ๋ฐฉ์ง) |
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
Trigger |
push , pull_request (PR ๋์์ด dev์ผ ๊ฒฝ์ฐ) |
์ฃผ์ ๋จ๊ณ | checkout โ install โ build โ test โ lint |
๋ฐฐํฌ ์ฌ๋ถ | โ ์์ |
๊ธฐ๋ฅ | ํตํฉ ํ์ง ์ ๊ฒ ๋ฐ QA ํ๊ฒฝ ๋์ |
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
Trigger |
push , pull_request (PR ๋์์ด release์ผ ๊ฒฝ์ฐ) |
์ฃผ์ ๋จ๊ณ | checkout โ install โ build โ test โ lint |
๋ฐฐํฌ ์ฌ๋ถ | โ ์ด์ ํ๊ฒฝ ์๋ ๋ฐ์ |
๊ธฐ๋ฅ | ์ค์๋น์ค ๋ฐ์, ์์ ์ฑ ํ๋ณด ์ต์ฐ์ |
ํญ๋ชฉ | ๋ด์ฉ |
---|---|
Trigger | push |
์ฃผ์ ๋จ๊ณ | checkout โ install โ build โ test โ lint |
๋ฐฐํฌ ์ฌ๋ถ | โ ์์ (main ๋ณํฉ ์ ์๋ ๋ฐฐํฌ ์งํ) |
๊ธฐ๋ฅ | ๊ธด๊ธ ์์ ์ฌํญ์ ๋ํด release ์์ค์ ํ์ง ์ฒดํฌ ๋ฐ ๋น ๋ฅธ ๋ฐฐํฌ ์ง์ |

- ๋ชจ๋ ๋ธ๋์น๋ Push ๋๋ PR ์ GitHub Actions CI๊ฐ ์๋ ์คํ๋ฉ๋๋ค.
-
feature
๋ธ๋์น๋ Lint๋ง ์ํํ๋ฉฐ,dev/release
์์๋ Build, Test, Lint๊ฐ ์คํ๋ฉ๋๋ค. -
main
๋ธ๋์น์์๋ ๋น๋ ์ฐ์ถ๋ฌผ์ด GCS์ ์ ๋ก๋๋์ด CD ํ์ดํ๋ผ์ธ๊ณผ ์ฐ๊ณ๋ฉ๋๋ค.
name: CI Pipeline
# ๐ 1. ์ด๋ค ์ด๋ฒคํธ์์ ์คํํ ์ง ์ค์
on:
push:
branches:
- 'main' # ์ด์ ๋ธ๋์น
- 'dev' # ํตํฉ ํ
์คํธ ๋ธ๋์น
- 'feature/**' # ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น
- 'hotfix/**' # ๊ธด๊ธ ์์ ๋ธ๋์น
pull_request:
branches:
- 'main'
- 'dev'
# ๐ 2. ๊ณตํต ํ๊ฒฝ ๋ณ์
env:
NODE_VERSION: '18'
GCS_BUCKET: ${{ secrets.GCS_BUCKET_NAME }} # GCS ๋ฒํท ์ด๋ฆ (Secrets์ ์ ์ฅ ํ์)
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} # GCP ์๋น์ค ๊ณ์ ํค (JSON)
COMMIT_HASH: ${{ github.sha }} # ํ์ฌ ์ปค๋ฐ ํด์ (๋ฐฐํฌ ์ ๋ฒ์ ์ถ์ ์ฉ)
jobs:
ci:
runs-on: ubuntu-latest # GitHub์์ ์ ๊ณตํ๋ ๋ฆฌ๋
์ค ํ๊ฒฝ ์ฌ์ฉ
steps:
# ๐ฆ ์ฝ๋ ์ฒดํฌ์์
- name: ๐ฆ Checkout code
uses: actions/checkout@v3
# โ๏ธ Node.js ์ค์น
- name: โ๏ธ Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
# ๐ฅ Node ํจํค์ง ์ค์น
- name: ๐ฅ Install dependencies
run: npm ci
# โ
[feature ๋ธ๋์น ์ ์ฉ] Lint๋ง ์ํ
- name: ๐งน Lint (feature only)
if: startsWith(github.ref, 'refs/heads/feature/')
run: npm run lint
# โฉ feature ๋ธ๋์น์์๋ ๋น๋/ํ
์คํธ ์๋ต
- name: โฉ Skip build/test (feature only)
if: startsWith(github.ref, 'refs/heads/feature/')
run: echo "Skip build/test for feature/*"
# โ
[main/dev/hotfix] ๊ณตํต ๋น๋ ๋ฐ ํ
์คํธ
# ๐ ํ๋ก์ ํธ ๋น๋
- name: ๐ Build project
if: "!startsWith(github.ref, 'refs/heads/feature/')"
run: npm run build
# ๐งช ๋ฐฑ์๋ ํ
์คํธ
- name: ๐งช Run Backend tests
if: "!startsWith(github.ref, 'refs/heads/feature/')"
run: npm run test:backend
# ๐งช ํ๋ก ํธ์๋ ํ
์คํธ
- name: ๐งช Run Frontend tests
if: "!startsWith(github.ref, 'refs/heads/feature/')"
run: npm run test:frontend
# ๐งช AI ์๋ฒ ํ
์คํธ (Python)
- name: ๐งช Run AI tests
if: "!startsWith(github.ref, 'refs/heads/feature/')"
run: |
cd ai
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pytest
# ๐งน ๋ฆฐํธ ์คํ (๊ณตํต)
- name: ๐งน Lint
if: "!startsWith(github.ref, 'refs/heads/feature/')"
run: npm run lint
# โ๏ธ ๋ฐฐํฌ ๋จ๊ณ (main ๋ธ๋์น ํ์ )
- name: ๐ฆ Package backend
if: github.ref == 'refs/heads/main'
run: zip -r app-${COMMIT_HASH:7}.zip dist/
- name: โ๏ธ Upload backend to GCS
if: github.ref == 'refs/heads/main'
uses: google-github-actions/upload-cloud-storage@v1
with:
path: app-${COMMIT_HASH:7}.zip
destination: ${{ env.GCS_BUCKET }}/backend/
credentials: ${{ env.GCP_SA_KEY }}
- name: ๐ฆ Package frontend
if: github.ref == 'refs/heads/main'
run: |
mkdir -p packaged/frontend-${COMMIT_HASH:7}
cp -r dist/* packaged/frontend-${COMMIT_HASH:7}/
- name: โ๏ธ Upload frontend to GCS
if: github.ref == 'refs/heads/main'
uses: google-github-actions/upload-cloud-storage@v1
with:
path: packaged/frontend-${COMMIT_HASH:7}
destination: ${{ env.GCS_BUCKET }}/frontend/${{ env.COMMIT_HASH }}
credentials: ${{ env.GCP_SA_KEY }}
- name: ๐ฆ Package AI
if: github.ref == 'refs/heads/main'
run: zip -r ai-${COMMIT_HASH:7}.zip ai/ venv/ requirements.txt main.py
- name: โ๏ธ Upload AI to GCS
if: github.ref == 'refs/heads/main'
uses: google-github-actions/upload-cloud-storage@v1
with:
path: ai-${COMMIT_HASH:7}.zip
destination: ${{ env.GCS_BUCKET }}/ai/
credentials: ${{ env.GCP_SA_KEY }}
๐ฆ root/
โโโ backend/ # ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ค
โ โโโ dist/ # ๋น๋ ์ฐ์ถ๋ฌผ (ex. app-<commit>.zip)
โ โโโ tests/ # ๋ฐฑ์๋ ์ ๋/ํตํฉ ํ
์คํธ ์ฝ๋
โ
โโโ frontend/ # ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
์์ค
โ โโโ dist/ # ์ ์ ํ์ผ ๋น๋ ์ฐ์ถ๋ฌผ (GCS์ ์
๋ก๋๋จ)
โ โโโ __tests__/ # ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ํ
์คํธ ์ฝ๋
โ
โโโ ai/ # AI ์๋ฒ ๊ด๋ จ ์์ค
โ โโโ main.py # AI ์๋ฒ ์ง์
์
โ โโโ requirements.txt # Python ์ข
์์ฑ ๋ช
์ธ
โ โโโ venv/ # Python ๊ฐ์ํ๊ฒฝ (CI์์ ์์ฑ)
โ โโโ tests/ # pytest ๊ธฐ๋ฐ ํ
์คํธ ์ฝ๋
โ
โโโ package.json # ๊ณตํต ๋น๋ ๋ฐ ํ
์คํธ ์คํฌ๋ฆฝํธ ์ ์
โโโ .eslintrc.json # ๋ฆฐํธ ๊ท์น ์ค์
โ
โโโ .github/
โ โโโ workflows/
โ โโโ ci.yml # GitHub Actions CI ํ์ดํ๋ผ์ธ ์ค์ ํ์ผ
๊ฒฝ๋ก | ํญ๋ชฉ | ์ค๋ช |
---|---|---|
/.github/workflows/ci.yml | GitHub Actions ์ค์ ํ์ผ | ๋ธ๋์น๋ณ CI ์คํ ์ ์ (build/test/lint/deploy) |
/package.json | ๋น๋/ํ ์คํธ ์คํฌ๋ฆฝํธ | test:backend, test:frontend, lint ๋ฑ ๋ช ๋ น์ด ์ ์ |
/backend/dist/ | ๋น๋ ์ฐ์ถ๋ฌผ | ์์ถ ํ GCS์ ์ ๋ก๋๋จ |
/frontend/dist/ | ์ ์ ํ์ผ ๋น๋ ๊ฒฐ๊ณผ | GCS์ ์ ์ฒด ํด๋ ์ ๋ก๋ |
/ai/ | AI ์๋ฒ | ์คํ ํ์ผ(main.py), ๊ฐ์ํ๊ฒฝ(venv), ํ ์คํธ ์ฝ๋ ํฌํจ |
/ai/tests/ | pytest ํ ์คํธ | pytest๊ฐ ์ธ์ํ๋ Python ํ ์คํธ ํ์ผ๋ค |
/.eslintrc.json | ๋ฆฐํธ ์ค์ | ESLint ๊ท์น ์ ์ |
์ด๋ฆ | ์ค๋ช |
---|---|
GCS_BUCKET_NAME |
์ฐ์ถ๋ฌผ ์ ์ฅ์ฉ GCS ๋ฒํท ์ด๋ฆ |
GCP_SA_KEY |
์๋น์ค ๊ณ์ ํค (JSON ์ ์ฒด ๋ด์ฉ) |
-
dev
/main
๋ธ๋์น์ ๊ฒฝ์ฐ ๋น๋, ํ ์คํธ, ๋ฆฐํธ๊น์ง ํฌํจ๋๋ฏ๋ก PR๋ง๋ค ์ ์ฒด ํ์ดํ๋ผ์ธ ์คํ์ ์๋ถ ์ด์ ์์ - ์ ์ ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ๋ ๋๋ ค์ง ์ ์์
๋์ ๋ฐฉํฅ: ์บ์ฑ ์ ๋ต (actions/cache
), step ๋ณ๋ ฌ ์ฒ๋ฆฌ, ํ
์คํธ ๋ถ๋ฆฌ ์คํ ๋์
์์
- ๋ฌด๋ฃ tier์๋ ์๋ณ ์คํ ์๊ฐ ์ ํ์ด ์กด์ฌํจ (2,000๋ถ/์)
- ๋ค์์ ๋ณ๋ ฌ ๋ธ๋์น๋ ๋น๋ฒํ Push ๋ฐ์ ์ ๊ณผ๊ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ
๋์ ๋ฐฉํฅ: Lint๋ง ์คํํ๋ ๋ธ๋์น ๊ตฌ๋ถ, ํ์ํ ์กฐ๊ฑด์์๋ง full CI ์คํ
๐ ๋ณธ ํ์ด์ง๋ 2025๋ 5์ 12์ผ์ ๋ง์ง๋ง์ผ๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.