この用語をシェア
概要・定義
CI/CD(Continuous Integration/Continuous Delivery)は、ソフトウェア開発において、コードの統合・テスト・デプロイを自動化する開発手法です。CI(継続的インテグレーション)は、開発者が頻繁にコードを共有リポジトリに統合し、自動的にビルドとテストを実行する手法です。CD(継続的デリバリー)は、テスト済みのコードを自動的に本番環境にデプロイする手法です。
CI/CDは、DevOps文化の中核を担う重要な概念であり、2000年代初頭のExtreme Programming(XP)の実践から発展しました。現代のソフトウェア開発では、品質向上、リリース頻度の向上、リスク軽減を実現するために不可欠な手法となっています。
CI(継続的インテグレーション)
概要
開発者が頻繁に(通常は1日に数回)コードをメインブランチに統合し、統合のたびに自動的にビルドとテストを実行する開発手法です。
主要な特徴
- 頻繁な統合: 小さな変更を頻繁に統合
- 自動ビルド: コードのコミット時に自動的にビルド実行
- 自動テスト: 単体テスト、統合テストの自動実行
- 即座のフィードバック: 問題を早期に発見・修正
利点
- 統合の問題を早期に発見
- コード品質の向上
- 開発効率の向上
- リリース可能な状態の維持
CD(継続的デリバリー/継続的デプロイメント)
継続的デリバリー(Continuous Delivery)
CIで検証されたコードを、手動承認を経て本番環境にデプロイできる状態に自動的に準備する手法です。
継続的デプロイメント(Continuous Deployment)
テストをパスしたコードを、人間の介入なしに自動的に本番環境にデプロイする手法です。
主要な特徴
- 自動デプロイ: 承認プロセスを経た自動デプロイ
- 環境の一貫性: 開発から本番まで一貫した環境
- ロールバック機能: 問題発生時の迅速な復旧
- リリース戦略: Blue-Green、Canary等の安全なリリース
CI/CDパイプラインの構成
典型的なパイプライン
- ソースコード管理: Git等でのコード管理
- ビルド: コードのコンパイル・パッケージ化
- テスト: 単体テスト、統合テスト、E2Eテスト
- 静的解析: コード品質、セキュリティチェック
- アーティファクト作成: デプロイ用成果物の作成
- ステージング環境デプロイ: 本番環境への前段階
- 承認プロセス: 手動または自動承認
- 本番環境デプロイ: 実際のリリース
- 監視・検証: デプロイ後の動作確認
主要なCI/CDツール
クラウドベースCI/CD
- GitHub Actions: GitHub統合型CI/CD
- GitLab CI/CD: GitLab統合型CI/CD
- Azure DevOps: Microsoft提供のDevOpsプラットフォーム
- AWS CodePipeline: AWS提供のCI/CDサービス
- Google Cloud Build: Google Cloud提供のCI/CDサービス
オンプレミス・セルフホスト
- Jenkins: オープンソースの定番CI/CDツール
- CircleCI: クラウド・オンプレミス両対応
- TeamCity: JetBrains製のCI/CDツール
- Bamboo: Atlassian製のCI/CDツール
実装例
GitHub Actions ワークフロー
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run linting
run: npm run lint
- name: Run security audit
run: npm audit
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run build
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push myapp:${{ github.sha }}
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Deploy to production
run: |
# デプロイスクリプトの実行
kubectl set image deployment/myapp myapp=myapp:${{ github.sha }}
メリット・デメリット
メリット
- バグや統合の問題を早期に発見でき、修正コストを抑えられる
- リリース作業が自動化・標準化され、人為的ミスが減る
- リリース頻度を高められ、ユーザーへの価値提供サイクルが短縮される
- テストやビルドの実行履歴が残り、品質のトレーサビリティが向上する
デメリット・注意点
- 初期構築コスト: パイプラインの設計・テスト自動化の整備には一定の工数が必要で、テストが不十分なプロジェクトほど導入効果が出にくい
- 誤った自動デプロイのリスク: テストカバレッジが低い状態で継続的デプロイを行うと、不具合が本番環境に即座に反映されてしまう
- 運用・保守負荷: パイプライン自体も設定ファイルとして管理・保守する対象になり、複雑化すると理解できるメンバーが限られてしまうことがある
- 実行時間の増大: プロジェクトが大きくなるとビルド・テストの実行時間が伸び、開発体験を損なう場合がある(キャッシュや並列実行での対策が必要)
主要CI/CDツールの比較
| 項目 | GitHub Actions | GitLab CI/CD | Jenkins | CircleCI |
|---|---|---|---|---|
| ホスティング形態 | クラウド(GitHub統合) | クラウド/セルフホスト | 主にセルフホスト | クラウド/セルフホスト |
| 設定ファイル | YAML(.github/workflows) | YAML(.gitlab-ci.yml) | Groovy(Jenkinsfile) | YAML(config.yml) |
| 特徴 | GitHubリポジトリとの親和性、豊富なMarketplace | Gitリポジトリ管理からCI/CDまで一体型 | プラグインが豊富、カスタマイズ性が高い | 高速な並列実行、シンプルな設定 |
| 向いている用途 | GitHubでコード管理しているプロジェクト全般 | GitLabで一元管理したいチーム | 複雑な既存パイプライン、オンプレミス要件 | 高速なビルド・テストを重視するチーム |
実務での活用シーン・導入時の注意点
代表的な活用シーン
- Webアプリ・APIの継続的リリース: mainブランチへのマージをトリガーに、テスト・ビルド・本番デプロイを自動実行
- モバイルアプリのビルド自動化: iOS/Androidのビルド・署名・ストア申請プロセスの自動化
- インフラのCI/CD(GitOps): Terraformコードの変更をトリガーに、plan/applyを自動実行
- セキュリティチェックの自動化: 依存パッケージの脆弱性スキャンやSAST(静的解析)をパイプラインに組み込む
導入時に気をつけたいポイント
- まずはCI(自動テスト・ビルド)から着手し、信頼性が確認できてから段階的にCD(自動デプロイ)へ拡張する
- 本番デプロイには承認ステップやカナリアリリースなど、リスクを抑える仕組みを組み込む
- シークレット(APIキー等)はパイプライン内にハードコードせず、GitHub SecretsなどのSecret管理機能を利用する
外部リンク
関連用語
よくある質問(FAQ)
Q. CI(継続的インテグレーション)とCD(継続的デリバリー)は別々に導入できますか
はい、CIとCDは独立して段階的に導入できます。まずはCIとして「コミットごとに自動ビルド・自動テストを実行する」仕組みから始め、テストの信頼性が確保できた段階でCD(自動デプロイ)に拡張するのが実務上一般的なアプローチです。いきなり本番への自動デプロイまで導入するのはリスクが高いため、段階的な導入が推奨されます。
Q. 継続的デリバリーと継続的デプロイメントの違いは何ですか
継続的デリバリー(Continuous Delivery)は、テスト済みのコードをいつでも本番環境にデプロイできる状態に保ちますが、実際のデプロイには手動承認を挟みます。継続的デプロイメント(Continuous Deployment)は、テストをパスしたコードを人間の介入なしに自動的に本番環境へデプロイします。リリースのタイミングを人間がコントロールしたい場合は継続的デリバリー、完全自動化を目指す場合は継続的デプロイメントを選択します。
Q. 小規模なチームでもCI/CDを導入すべきですか
規模に関わらず導入するメリットがあります。GitHub ActionsやGitLab CI/CDはリポジトリに設定ファイルを1つ追加するだけで始められ、無料枠も充実しているため、小規模チームや個人開発でも低コストで導入できます。最初はLint(静的解析)とテストの自動実行程度から始め、慣れてきたらデプロイの自動化に広げていくとよいでしょう。
Q. CI/CDパイプラインが遅い場合はどう改善すればよいですか
主な対策として、依存パッケージのキャッシュ活用(npm ci、Dockerレイヤーキャッシュ等)、テストの並列実行、変更のあったモジュールのみをビルド・テストする差分実行、不要なステップの削減などが挙げられます。GitHub Actionsではジョブを複数に分割してmatrix戦略で並列化することも有効です。
Q. 2025-2026年のCI/CDの最新動向は
AIコーディングアシスタント(GitHub Copilot等)によるパイプライン設定の自動生成やレビュー支援、サプライチェーンセキュリティ強化(SBOM生成、依存パッケージの署名検証)、そしてTerraform等と組み合わせたGitOpsによるインフラ変更の自動化が進んでいます。
