Git
CI/CD運用
CI(テスト・Lint)とCD(デプロイ・ロールバック)の運用ガイドライン
CI(継続的インテグレーション)
CI(Continuous Integration)は、コードの品質を維持し、バグを早期に発見するための自動化プロセスです。
CIで実行すべき項目
必須項目
- Lint(コードスタイルチェック): ESLint、Prettier、Stylelintなど
- 型チェック: TypeScript の型エラー検出
- テスト: ユニットテスト、統合テストの実行
- ビルド確認: ビルドが正常に完了するか確認
推奨項目
- カバレッジ測定: テストカバレッジの計測
- セキュリティスキャン: 脆弱性の自動検出
- パフォーマンステスト: Lighthouse CI など
- 依存関係チェック: 脆弱性のある依存関係の検出
プロジェクトの規模や要件に応じて、必要なチェックを選択してください。
すべてを実装する必要はありません。
GitHub Actions の設定例
基本的なCI設定
name: CI
on:
pull_request:
branches: [develop, main]
push:
branches: [develop, main]
jobs:
lint-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run linter
run: pnpm run lint
- name: Run type check
run: pnpm run type-check
- name: Run tests
run: pnpm run test
- name: Build
run: pnpm run build
カバレッジ付きテスト
name: Test Coverage
on:
pull_request:
branches: [develop, main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run tests with coverage
run: pnpm run test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
CIの実行タイミング
- Pull Request作成時: すべてのチェックを実行
- コミットpush時: 開発ブランチ(develop)で実行
- main/developへのマージ時: すべてのチェックを実行
CIが失敗したPRはマージしないCIが失敗している状態でのマージは、品質低下につながります。
ブランチ保護ルールでCIの成功を必須条件に設定することを推奨します。
CIの実行時間の最適化
CIの実行時間が長すぎると、開発速度が低下します。以下の最適化を検討してください。
- キャッシュの活用: 依存関係のキャッシュ
- 並列実行: 独立したジョブを並列で実行
- 条件付き実行: 変更されたファイルに応じて実行を制限
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# ... Lintの実行
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# ... テストの実行
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# ... ビルドの実行
CD(継続的デリバリー)
CD(Continuous Delivery/Deployment)は、アプリケーションを自動的にデプロイするプロセスです。
デプロイ戦略
環境の分離
- Staging: 本番と同等の環境でのテスト
- Production: 本番環境
プロジェクトによっては、Development(ローカル環境)、Preview環境、QA環境を追加することもあります。
デプロイのトリガー
- develop ブランチへのマージ: Staging環境へ自動デプロイ
- main ブランチへのマージ: Production環境へ自動デプロイ(または手動承認後)
GitHub Actions でのデプロイ設定例
Stagingへの自動デプロイ
name: Deploy to Staging
on:
push:
branches: [develop]
jobs:
deploy:
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm run build
env:
NODE_ENV: production
- name: Deploy to Staging
env:
DEPLOY_TOKEN: ${{ secrets.STAGING_DEPLOY_TOKEN }}
run: |
# デプロイコマンド(Vercel、Netlifyなど)
pnpm run deploy:staging
Productionへの手動承認付きデプロイ
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
# GitHub Environmentで承認者を設定可能
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm run build
env:
NODE_ENV: production
- name: Deploy to Production
env:
DEPLOY_TOKEN: ${{ secrets.PRODUCTION_DEPLOY_TOKEN }}
run: |
pnpm run deploy:production
- name: Notify deployment
if: success()
run: |
# デプロイ成功の通知(Slack、Discordなど)
echo "Deployment successful"
GitHub Environmentsの活用
GitHub Environmentsを使用すると、環境ごとにSecretsを分離でき、承認フローも設定できます。 本番デプロイには必ず承認フローを設定することを推奨します。
GitHub Environmentsを使用すると、環境ごとにSecretsを分離でき、承認フローも設定できます。 本番デプロイには必ず承認フローを設定することを推奨します。
デプロイ時の注意事項
- ダウンタイムの最小化: ゼロダウンタイムデプロイを目指す
- ロールバック可能性: 問題発生時に即座に戻せる仕組み
- デプロイ前のヘルスチェック: CIの成功を確認
- デプロイ後のヘルスチェック: 正常に動作しているか確認
ロールバック
デプロイ後に問題が発生した場合、迅速にロールバックできる体制を整えます。
ロールバックの方法
1. Git revert によるロールバック
# 問題のあるコミットを打ち消すコミットを作成
git revert <commit-hash>
git push origin main
# 自動的に前のバージョンへデプロイ
2. プラットフォームの機能を使用
- Vercel: ダッシュボードから以前のデプロイに戻す
- Netlify: デプロイ履歴から以前のバージョンを選択
- AWS/GCP: インフラの管理コンソールから巻き戻し
ロールバックの準備ロールバック手順は、デプロイ前に必ず確認しておいてください。
緊急時にスムーズに対応できるよう、ドキュメント化しておくことを推奨します。
ロールバックのテスト
ロールバック手順をテストし、実際に機能することを確認します。
name: Rollback Test (Manual)
on:
workflow_dispatch:
inputs:
environment:
description: "Environment to rollback"
required: true
type: choice
options:
- staging
- production
jobs:
rollback:
runs-on: ubuntu-latest
environment: ${{ inputs.environment }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2 # 直前のコミットも取得
- name: Rollback to previous commit
run: |
git revert HEAD --no-edit
git push origin main