Skip to content

CICDとは

CI/CDは、ソフトウェア開発における一連の自動化されたプロセスを指し、開発者がコードをコミットしてからユーザーに提供するまでの工程を自動化します。これにより、開発サイクルを高速化し、品質を向上させます。

❌ 問題のある開発フロー(CI/CDがない場合)

Section titled “❌ 問題のある開発フロー(CI/CDがない場合)”

❌ 問題のある手作業でのデプロイ:

Terminal window
# 問題: 手作業でのデプロイプロセス
# 1. コードをローカルでテスト
npm test
# 2. ビルド
npm run build
# 3. サーバーにSSH接続
ssh user@production-server
# 4. コードを手動でアップロード
scp -r dist/* user@production-server:/var/www/app
# 5. サーバーを再起動
sudo systemctl restart nginx
# 問題点:
# 1. 時間がかかる(30分から数時間)
# 2. 人的ミスが発生しやすい(設定の誤り、漏れ)
# 3. 再現性が低い(同じ手順を繰り返せない)
# 4. ロールバックが困難(以前の状態に戻せない)
# 5. チーム開発が困難(デプロイの競合)

解決: CI/CDによる自動化

.github/workflows/deploy.yml
# 解決: GitHub Actionsによる自動化
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Deploy
run: |
# 自動デプロイのロジック
scp -r dist/* user@production-server:/var/www/app
ssh user@production-server 'sudo systemctl restart nginx'
# メリット:
# 1. 迅速なデプロイ(数分で完了)
# 2. 人的ミスの削減(自動化により一貫性が保証)
# 3. 完全な再現性(同じワークフローで同じ結果)
# 4. 簡単なロールバック(Gitで管理)
# 5. チーム開発が容易(自動化により競合が減少)

1. 早期のバグ発見

# CIにより、コードをコミットした時点で自動的にテストが実行される
# これにより、バグを早期に発見し、修正コストを削減
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm ci
- run: npm test # コミット時に自動的にテストが実行される

2. 一貫性の保証

# 同じワークフローで、開発環境、ステージング環境、本番環境を構築
# これにより、環境依存のバグを防ぐ
jobs:
deploy-dev:
environment: development
steps:
- run: deploy.sh dev
deploy-staging:
environment: staging
steps:
- run: deploy.sh staging
deploy-prod:
environment: production
steps:
- run: deploy.sh prod

3. 開発速度の向上

# 自動化により、開発者はコードに集中できる
# デプロイの手作業から解放され、開発時間が増加
# 手作業: 30分/デプロイ × 10回/週 = 5時間/週
# CI/CD: 5分/デプロイ × 10回/週 = 50分/週
# 節約時間: 約4時間/週
  • CI (Continuous Integration): 継続的インテグレーション
  • CD (Continuous Delivery/Deployment): 継続的デリバリー/デプロイメント
  • 開発サイクルの高速化: 自動化により、開発者はコードに集中でき、新機能のリリースやバグ修正が迅速に行えます。
  • 品質の向上とバグの早期発見: 自動テストにより、問題が早期に発見され、手戻りを削減できます。
  • チームの連携強化: コードの変更履歴やテスト結果が可視化され、スムーズな共同作業を促進します。
  1. 継続的デリバリー (Continuous Delivery): 自動化されたテストとビルドが成功した後、本番環境へのデプロイは手動で行います。
  2. 継続的デプロイメント (Continuous Deployment): 自動テストに成功したコードは自動で本番環境にデプロイされます。
  • ソースステージ (Source): コードがリポジトリにプッシュされるとパイプラインが起動します。
  • ビルドステージ (Build): ソースコードをコンパイルし、実行可能なアーティファクトを作成します。
  • テストステージ (Test): 単体テストや結合テストを実行し、品質を検証します。
  • デプロイステージ (Deploy): テストに合格したアーティファクトを各環境にデプロイします。
  • ブルー/グリーンデプロイメント: 新しい環境を構築し、ロードバランサーでトラフィックを切り替えます。
  • カナリアデプロイメント: 新しいバージョンを一部のユーザーに限定してリリースし、徐々に展開します。
  • ローリングデプロイメント: 既存のサーバーを少しずつ新しいバージョンに置き換えていきます。
  • 静的アプリケーションセキュリティテスト(SAST: ソースコードの脆弱性を分析します。
  • 動的アプリケーションセキュリティテスト(DAST: 稼働中のアプリケーションに攻撃をシミュレートします。
  • コンテナイメージのスキャン: コンテナに既知の脆弱性がないかスキャンします。

IaC(Infrastructure as Code)ツール(Terraformなど)と連携することで、アプリケーションだけでなくインフラの変更も自動化できます。これにより、アプリケーションとインフラの一貫性を保つことが可能です。

  • Gitブランチ戦略: 開発フローを標準化するために、Git FlowGitHub Flowなどのブランチ戦略を適用します。
  • ロールバック: デプロイ後の問題に備え、迅速に前のバージョンに戻せる仕組みを構築します。
  • パイプラインのコード化: パイプラインの定義をコードとして管理し、バージョン管理やレビューを可能にします。
  • テスト環境の自動化: プルリクエストごとに一時的なテスト環境を自動で構築・破棄することで、開発の効率を向上させます。
  • GitHub Actions: GitHubに統合されたYAMLベースのCI/CDツール。
  • Jenkins: 柔軟性が高いオープンソースの自動化サーバー。
  • CircleCI: コンテナ技術との連携に優れたクラウドサービス。
  • GitLab CI/CD: GitLabに統合されており、単一プラットフォームで開発を完結できます。

GitHub Actions vs Jenkins vs CircleCI vs GitLab CI/CD

Section titled “GitHub Actions vs Jenkins vs CircleCI vs GitLab CI/CD”

判断基準:

ツール学習コスト統合性柔軟性コスト推奨度
GitHub Actions低い高い(GitHub統合)中程度無料(制限あり)⭐⭐⭐⭐⭐
Jenkins高い低い非常に高い無料⭐⭐⭐
CircleCI中程度中程度高い有料⭐⭐⭐⭐
GitLab CI/CD低い高い(GitLab統合)中程度無料(制限あり)⭐⭐⭐⭐

実践的な選択指針:

// GitHub Actionsを選ぶべき場合:
// 1. GitHubを使用している
// 2. シンプルなCI/CDパイプライン
// 3. 学習コストを抑えたい
// 4. 無料プランで十分
// Jenkinsを選ぶべき場合:
// 1. 非常に複雑なパイプライン
// 2. カスタムプラグインが必要
// 3. オンプレミス環境
// 4. 完全な制御が必要
// CircleCIを選ぶべき場合:
// 1. マルチクラウド環境
// 2. 高度な並列実行が必要
// 3. コンテナ技術との統合が重要
// GitLab CI/CDを選ぶべき場合:
// 1. GitLabを使用している
// 2. 単一プラットフォームで完結したい
// 3. セキュリティ機能が重要

CI/CDは、現代のソフトウェア開発において不可欠なツールです。適切に導入することで、開発速度と品質を大幅に向上させることができます。

シニアエンジニアとして考慮すべき点:

  1. 段階的な導入: 既存のプロセスに段階的にCI/CDを導入
  2. パイプラインの最適化: 実行時間とコストのバランス
  3. セキュリティ: 機密情報の適切な管理(Secrets、環境変数)
  4. モニタリング: パイプラインの実行状況の監視とアラート
  5. ドキュメント化: パイプラインの目的と動作をドキュメント化