CI/CD

英語名 Continuous Integration / Continuous Delivery
読み方 コンティニュアス インテグレーション / コンティニュアス デリバリー
難易度
所要時間 パイプライン構築に1〜2週間
提唱者 マーティン・ファウラー、ジェズ・ハンブル
目次

ひとことで言うと
#

コードの変更を頻繁に統合し、ビルド・テスト・デプロイを自動化するプラクティス。CI(継続的インテグレーション)で品質を保ち、CD(継続的デリバリー/デプロイ)でリリースを高速化する。

押さえておきたい用語
#

押さえておきたい用語
パイプライン(Pipeline)
ビルド・テスト・デプロイなどの処理を順序立てて自動実行する一連のステージのこと。コードのプッシュをトリガーに起動し、各ステージが順次またはパラレルに実行される。
Four Keys
デプロイ頻度・リードタイム・変更失敗率・復旧時間の4つの指標のこと。DORA(DevOps Research and Assessment)が提唱し、チームのデリバリーパフォーマンスを測定する業界標準。
Flaky Test(不安定なテスト)
同じコードに対して実行するたびに結果が変わる不安定なテストのこと。CI全体の信頼性を損ない、開発者がテスト結果を無視する原因となる。
カナリアリリース(Canary Release)
新バージョンをまず一部のトラフィック(例: 5%)にだけ公開し、問題がなければ段階的に全体へ展開するデプロイ手法を指す。

CI/CDの全体像
#

CI/CD:コードから本番デプロイまでの自動化パイプライン
CI(継続的インテグレーション)1. ビルドコードをコンパイル・パッケージ化2. ユニットテストカバレッジ80%以上を目標に3. 静的解析・リンターコード品質をゲートで担保4. インテグレーションテストCD(継続的デリバリー)5. ステージングデプロイ本番同等環境で動作確認6. 本番デプロイブルーグリーン/カナリアで安全に7. モニタリングエラーレート監視・自動ロールバックFour Keys(改善度の測定指標)デプロイ頻度週1回以上が目標リードタイムコミット→本番1日以内変更失敗率15%以下が目標復旧時間1時間以内が目標CIは10分以内に完了させる(開発者の集中力を維持)
CI/CD導入の進め方
1
CI構築
ビルド・テスト・静的解析を自動化
2
テスト充実
テストピラミッドに沿って品質を担保
3
CD構築
ステージング→本番の自動デプロイを実装
Four Keysで計測
デプロイ頻度・リードタイム等を継続改善

こんな悩みに効く
#

  • 手動デプロイに半日かかり、リリースが怖いイベントになっている
  • マージしたらテストが壊れていて、誰がいつ壊したかわからない
  • リリース頻度が低く、1回のリリースに大量の変更が含まれてしまう

基本の使い方
#

ステップ1: CI — 継続的インテグレーションを構築する

コードをプッシュするたびに、自動でビルドとテストが走る環境を作る

  • GitHub Actions、GitLab CI、CircleCI などのCIサービスを導入する
  • ビルド → ユニットテスト → リンター → 静的解析の順にパイプラインを組む
  • PRのマージ条件にCIの成功を必須にする

ポイント: CIが10分以上かかると開発者が待てなくなる。高速化を常に意識する。

ステップ2: 自動テストを充実させる

CIの品質はテストの品質で決まる

  • ユニットテスト: 高速で大量に。カバレッジ80%以上を目標に
  • インテグレーションテスト: DB、API連携の確認
  • E2Eテスト: 主要なユーザーフローだけを対象にする

ポイント: テストピラミッド(ユニット多め、E2E少なめ)を意識する。

ステップ3: CD — 継続的デリバリーを構築する

CIが通ったコードを、自動でステージング・本番にデプロイする

  • ステージング環境への自動デプロイ(Continuous Delivery)
  • 本番環境への自動デプロイ(Continuous Deployment)
  • ブルーグリーンデプロイ、カナリアリリースでリスクを低減する

ポイント: Continuous Delivery(手動承認あり)とContinuous Deployment(完全自動)は別物。まずはDeliveryから。

ステップ4: モニタリングとフィードバックループを整備する

デプロイ後の状態を監視し、問題があれば即座にロールバックする

  • デプロイ後のエラーレート、レスポンスタイムを監視
  • 異常を検知したら自動でロールバックする仕組み
  • デプロイ頻度、リードタイム、変更失敗率をメトリクスとして追跡

ポイント: Four Keys(デプロイ頻度、リードタイム、変更失敗率、復旧時間)で改善度を測る。

具体例
#

例1:WebアプリのCI/CDパイプラインをGitHub Actionsで構築する

パイプライン構成:

  1. トリガー: PRの作成・更新時、mainブランチへのマージ時
  2. ビルド: npm installnpm run build(3分)
  3. テスト: ユニットテスト(2分)→ インテグレーションテスト(5分)
  4. 静的解析: ESLint + TypeScript型チェック(1分)
  5. ステージングデプロイ: mainマージ時にステージング環境へ自動デプロイ
  6. 本番デプロイ: ステージングで動作確認後、承認ボタンで本番へデプロイ
  7. モニタリング: デプロイ後15分間、エラーレートを監視。閾値超えで自動ロールバック

結果: PRからマージまで平均30分、本番デプロイまで1時間。以前は手動で半日かかっていたのが92%短縮

例2:Flaky Testを撲滅してCI信頼性を回復する

Before: テストスイート800件中、Flaky Testが23件。CIの成功率は72%。開発者は「また落ちた」でCIを無視し、mainブランチが週に3回壊れていた。

対策:

  1. Flaky Testを特定するダッシュボードを構築(過去30日の成功率が95%未満のテストを自動検出)
  2. 発見した23件を専用の隔離スイートに移動し、メインCIからは除外
  3. 毎スプリントで2〜3件ずつ根本原因を修正して本スイートに復帰

After(3ヶ月後): Flaky Testが23件→2件。CIの成功率が72%→97%。mainブランチが壊れる頻度が週3回→月1回に改善。開発者がCIの結果を信頼して行動する文化が復活した。

例3:月1リリースから週3リリースに改善した中規模チーム

Before: 10人チーム。月1回の手動リリース。1回のリリースに平均47件の変更が含まれ、リリース後のバグ発生率は30%

CI/CD導入ステップ:

  1. 月1〜2: GitHub ActionsでCIを構築。ユニットテスト300件を自動実行
  2. 月3: ステージング自動デプロイを導入。PRマージ→5分でステージングに反映
  3. 月4: カナリアリリースを導入。本番トラフィックの5%→25%→100%と段階的に展開

After(6ヶ月後):

  • リリース頻度: 月1回→週3回
  • 1回あたりの変更数: 47件→5件
  • リリース後バグ発生率: 30%→5%
  • 小さくリリースすることでリスクが劇的に低下した

やりがちな失敗パターン
#

  1. CIが遅すぎて無視される — ビルド+テストに30分以上かかると、開発者はCIの結果を待たずにマージしてしまう。CIは10分以内に収める。並列実行やキャッシュを活用する
  2. テストが不安定(Flaky)で信頼されない — ランダムに失敗するテストがあると、「また失敗か」でCIの結果が無視される。不安定なテストは即修正するか、隔離する
  3. CDを入れたがロールバック手順がない — 自動デプロイしたが、問題発生時に戻し方がわからずパニック。ロールバック手順を必ず整備し、定期的に訓練する
  4. CIの成功をマージ条件にしていない — CIが存在するのにマージ時に必須にしていないため、テスト失敗のままマージされる。Branch Protection Ruleで必須化する

まとめ
#

CI/CDは現代のソフトウェア開発の基盤。CIで品質を担保し、CDでリリースを高速化する。導入のポイントは「テストの品質」と 「パイプラインの速度」。まずはCIから始めて、自動テストを充実させ、段階的にCDへ進化させよう。