143 lines
4.2 KiB
Markdown
143 lines
4.2 KiB
Markdown
---
|
|
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 |
|