GLANZ. CREATIVE WORKS
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を分離でき、承認フローも設定できます。 本番デプロイには必ず承認フローを設定することを推奨します。

デプロイ時の注意事項

  • ダウンタイムの最小化: ゼロダウンタイムデプロイを目指す
  • ロールバック可能性: 問題発生時に即座に戻せる仕組み
  • デプロイ前のヘルスチェック: 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