CI/CDのベストプラクティス
ストーリー
「ツールを導入するだけではCI/CDは成功しない。 大切なのは、チーム全体の習慣を変えることだ」
木村先輩が、過去のプロジェクトの失敗談を話し始めた。
「以前のチームでは、Jenkinsを導入したのにうまくいかなかった。 理由は簡単だ。ビルドが壊れても誰も直さなかった。 テストが遅くなっても誰も気にしなかった。 ツールはただのツールでしかない」
「では、何が一番大事なんですか?」
「チームの文化だ。自動化を信頼し、壊れたものはすぐ直す。 その文化がないと、どんなツールを入れても宝の持ち腐れだ」
パイプライン設計のベストプラクティス
1. 高速なフィードバック
CIパイプラインは10分以内を目標にしましょう。
推奨:フェイルファスト戦略
[push]
│
├─ Stage 1 (1分) : Lint + 型チェック ← 最も速いチェックを最初に
│ 失敗 → 即通知(コー ド修正を指示)
│
├─ Stage 2 (3分) : 単体テスト
│ 失敗 → 即通知(テスト修正を指示)
│
├─ Stage 3 (5分) : 結合テスト + ビルド
│ 失敗 → 即通知
│
└─ Stage 4 (並列) : E2E + セキュリティスキャン
結果 → まとめて通知
合計: 約10分以内
2. パイプラインをコードとして管理
パイプラインの定義もバージョン管理の対象です。
| やること | やらないこと |
|---|---|
| YAMLファイルをGitで管理 | GUIだけで設定する |
| PRでパイプライン変更をレビュー | 直接本番のパイプラインを編集 |
| 環境ごとの差分を最小化 | 環境ごとに全く別のパイプラインを作る |
3. テストピラミッドを意識する
テストピラミッド
/\
/ \ E2Eテスト
/ E2E\ 少数・遅い・高コスト
/------\
/ 結合 \ 結合テスト
/ テスト \ 中程度の数
/------------\
/ 単体テスト \ 単体テスト
/ \ 多数・速い・低コスト
/------------------\
CIで実行するテスト配分:
- 単体テスト: 70%(高速、毎pushで実行)
- 結合テスト: 20%(中速、PRマージ時に実行)
- E2Eテスト: 10%(低速、デプロイ前に実行)
ブランチ戦略とCI/CD
トランクベース開発
CI/CDと最も相性が良いブランチ戦略です。
トランクベース開発
main ─────●─────●─────●─────●─────●─────→
\ / \ / \ /
feature/a ●──● │ │
feature/b ●──●
feature/c
特徴:
- 短命なフィーチャーブランチ(1〜2日以内)
- mainに頻繁にマージ
- 全てのマージでCIが走る
GitHub Flow
GitHub Actionsとの組み合わせで広く使われています。
GitHub Flow + CI/CD
main ──────────●──────────●──────────→
\ /
feature/login ●──●──●
│ │ │
CI CI CI ← 毎pushでCI実行
│
PR作成 → レビュー → マージ → CD
セキュリティのベストプラクティス
シークレット管理
| やること | やらないこと |
|---|---|
| 専用のシークレットストアを使う | コードにAPIキーをハードコード |
| 環境変数で注入する | ログにシークレットを出力 |
| 定期的にローテーションする | 全環境で同じシークレットを使う |
| 最小権限の原則を適用する | 管理者権限のトークンを共有 |
サプライチェーンセキュリティ
サプライチェーンリスク
[自分のコード] → [依存パッケージ] → [CI/CDツール] → [デプロイ先]
│ │
脆弱性の混入 アクション乗っ取り
バージョン固定で対策 SHA固定で対策
| 対策 | 説明 |
|---|---|
| 依存パッケージのバージョン固定 | package-lock.json を必ずコミット |
| アクションのSHA固定 | uses: actions/checkout@v4 より @sha256:... |
| 依存関係の自動更新 | Dependabot / Renovateで脆弱性を検知 |
| 最小権限のGITHUB_TOKEN | permissions を明示的に指定 |
チーム文化のベストプラクティス
ビルドが壊れたら最優先で直す
ビルド壊れた時のフロー
[ビルド失敗通知]
│
▼
誰がコミットした?
│
├── 自分 → 即座に修正開始
│
└── 他の人 → 声をかけて支援
(放置しない)
ルール:
- ビルドが壊れている間は新しいマージをしない
- 15分で直せないなら revert する
- ビルド状態はチームの共有責任
メトリクスを可視化する
| メトリクス | 目標値 | 可視化方法 |
|---|---|---|
| CIパイプライン実行時間 | 10分以内 | ダッシュボード |
| ビルド成功率 | 95%以上 | 週次レポート |
| デプロイ頻度 | 1日1回以上 | カレンダー表示 |
| 平均修復時間(MTTR) | 1時間以内 | アラート集計 |
| テストカバレッジ | 80%以上 | CIレポート |
アンチパターンと対策
| アンチパターン | 症状 | 対策 |
|---|---|---|
| 巨大なモノリスCI | 1回のCIに30分以上 | ステージ分割、並列化 |
| テスト不安定(Flaky) | ランダムに失敗 | 根本原因を特定し修正 |
| 手動ステップの残存 | 「このステップだけ手動で」 | 全て自動化する |
| ブランチの長寿命化 | 数週間マージされないPR | 小さなPRに分割 |
| シークレットの平文管理 | .env ファイルをコミット | シークレットストア使用 |
まとめ
| ポイント | 内容 |
|---|---|
| 高速フィードバック | CIは10分以内、フェイルファスト戦略 |
| テストピラミッド | 単体70%、結合20%、E2E 10%の配分 |
| セキュリティ | シークレット管理とサプライチェーン保護 |
| チーム文化 | ビルド修復最優先、メトリクス可視化 |
チェックリスト
- フェイルファスト戦略を説明できる
- テストピラミッドの概念を理解した
- シークレット管理のベストプラクティスを把握した
- CI/CDにおけるチーム文化の重要性を理解した
次のステップへ
Step 1の内容を理解度チェッククイズで確認しましょう。 CI/CDの基本概念が固まったら、いよいよStep 2でGitHub Actionsの実践に入ります。
推定読了時間: 20分