--- id: wiki-20260508-continuous-integration-ci--redir title: Continuous Integration (CI) category: 10_Wiki/Topics status: verified canonical_id: self aliases: [CI, Continuous Integration, 지속적 통합] duplicate_of: none source_trust_level: A confidence_score: 0.92 verification_status: applied tags: [cicd, devops, automation, testing] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: yaml framework: GitHub Actions, GitLab CI, Jenkins --- # Continuous Integration (CI) ## 매 한 줄 > **"매 every commit 의 main branch 의 automated build + test"**. 매 Grady Booch (1991) 의 coin → Martin Fowler (2000) 의 popularize → 매 2026 의 trunk-based dev + GitHub Actions 의 dominant practice. 매 integration hell 의 prevent — 매 small frequent merge + fast feedback (<10 min). ## 매 핵심 ### 매 Practices - **Single source repo** (trunk-based, optionally short-lived feature branches). - **Automated build** on every push. - **Self-testing build** (unit + integration). - **Daily commit** to main (최소). - **Build fast** (<10 min target). - **Test in clone of prod** (Docker, ephemeral env). - **Visible status** (badge, Slack notify). - **Fix red main immediately** (revert > forward fix). ### 매 CI vs CD - **CI**: build + test on every push — main 의 always green. - **CD (Delivery)**: 매 always-shippable artifact + manual prod gate. - **CD (Deployment)**: 매 fully automated to prod. ### 매 응용 1. Pre-merge: PR check (lint, test, type, build). 2. Post-merge: artifact build + push. 3. Nightly: e2e, perf, security scan. 4. Release: tag → publish (npm, container). ## 💻 패턴 ### GitHub Actions PR check ```yaml name: pr on: { pull_request: { branches: [main] } } jobs: ci: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 - uses: actions/setup-node@v4 with: { node-version: 20, cache: pnpm } - run: pnpm install --frozen-lockfile - run: pnpm lint - run: pnpm typecheck - run: pnpm test --coverage - run: pnpm build - uses: codecov/codecov-action@v4 ``` ### Branch protection (main) ```yaml # .github/branch-protection.yml (or via API) required_status_checks: strict: true contexts: [ci/lint, ci/test, ci/build] required_pull_request_reviews: { required_approving_review_count: 1 } enforce_admins: true ``` ### Parallel matrix ```yaml jobs: test: strategy: fail-fast: false matrix: node: [18, 20, 22] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} ``` ### Cache ```yaml - uses: actions/cache@v4 with: path: ~/.pnpm-store key: pnpm-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} ``` ### Pre-commit (Husky + lint-staged) ```json { "lint-staged": { "*.{ts,tsx}": ["eslint --fix", "prettier --write"] } } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | GitHub repo | GitHub Actions | | GitLab self-host | GitLab CI | | Java enterprise | Jenkins (with Jenkinsfile) | | Monorepo, perf-critical | Nx Cloud / Turborepo Remote Cache | | OSS multi-platform | GitHub Actions + matrix | **기본값**: 매 GitHub Actions + branch protection + required check. ## 🔗 Graph - 부모: [[CI/CD Pipeline]] · [[DevOps]] - 변형: [[Continuous Delivery]] · [[Continuous Deployment]] - 응용: [[Trunk-Based Development]] · [[Pull Request Workflow]] - Adjacent: [[TeamCity]] · [[Jenkins]] · [[GitOps]] · [[Pre-commit Hook]] ## 🤖 LLM 활용 **언제**: 매 workflow YAML 의 generation, action 의 lookup, matrix 의 expansion. **언제 X**: 매 secret handling — 매 OIDC + GitHub Secrets manual review. ## ❌ 안티패턴 - **Long-lived feature branch**: 매 merge hell — 매 short-lived (<3 day). - **Skipping tests** (`[skip ci]` 의 abuse): 매 main 의 break. - **Slow CI** (>15 min): 매 PR backlog — 매 cache + parallelize. - **Flaky tests** 의 retry abuse: 매 fix 의 root cause. - **Manual deploy from laptop**: 매 reproducibility 의 zero — 매 CI 의 only. ## 🧪 검증 / 중복 - Verified (Fowler "Continuous Integration", GitHub Actions docs). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — practices + Actions/branch protection patterns |