要点: Production CIはMergeごとにSourceのCorrectness、Security、Buildability Evidenceを作ります。
課題
Compile成功だけではGenerated Drift、Skip Test、脆弱Dependency、Secret漏洩、Review外Imageを防げません。過権限RunnerもSupply-chain Riskです。
単純な対策だけでは不十分な理由
GitLabとGitHubはSyntaxが違っても、最小Permission、Job Isolation、Immutable Artifactという設計は同じです。
Security FindingにはPolicy、Owner、Exception Expiryが必要です。
処理フロー
Format・Lockfile→Quality
Lint・Type・Test・Build→Security
Secret・SAST・Dependency・Image→Release
SBOM・Signature・Provenance
アーキテクチャ上の判断
Fail Fast
Format、Verify、Lint、Typeを先に実行します。
Build Once Promote
同一DigestをStagingとProductionで使います。
Trust Zone分離
PRはRead-only、Sign・DeployはProtected Refと短期Identityだけです。
さらに深く考える
Source Drift検証
Generated FileとLockfile後のClean Treeを確認します。
ExceptionをDebt管理
Owner、Control、Expiryを持ち、期限切れでFailします。
実装手順
- Repository StateとGenerated Outputを先に検証します。
- Lint、Type、Test、Production Buildを明示Thresholdで並列化します。
- Scan後、一度Build・SignしたDigestを全環境へPromoteします。
技術例: Equivalent Quality Gates
verify: format --check; generated-diff; lockfile-policy
quality: lint; typecheck; unit --coverage; integration
build: production-build; migration-check
security: secret-scan; SAST; dependency-audit; image-scan
release: SBOM; sign(digest); attest(provenance)
deploy: promote(the_same_digest)GitLabはstages・needs、GitHubはjobs・needsを使い、実CommandはRepository Scriptへ置きます。
想定すべき障害パターン
- Untrusted BranchのCacheを使います。
- 必須TestをSkipしてExit 0になります。
- Deploy時RebuildでDigestが変わります。
監視すべきシグナル
| シグナル | 確認する理由 |
|---|---|
| Pipeline・Queue時間 | Feedback速度です。 |
| Gate Failure・Flaky率 | Defectと不安定Automationを分けます。 |
| Digest・SBOM・Signature Coverage | Release Evidenceです。 |
設計の検証方法
- Lint、Test、Build、Secret、脆弱性を意図的に失敗させます。
- Untrusted PRの権限を試験します。
- Production Digestから全Evidenceを追跡します。
安全なRollout計画
Report-onlyからNoiseを除去し、Fast Gate、Security、Signingの順でEnforceします。Cache・Parallel化でもTrust境界を維持します。
本番前チェックリスト
- Protected Branchは全CheckとReviewを要求します。
- Untrusted PRはSecretやPrivileged Runnerへ到達しません。
- 失敗JobはRelease可能Artifactを残しません。
まとめ
CI/CDはReviewed SourceからProduction ArtifactまでのEvidence Chainです。
