生成AI研修
Part 6: AI × 開発 応用

Chapter 35: CI/CD と AI

GitHub Actions、自動テスト・レビュー、品質ゲート

35.1 CI/CD の基礎概念

CI/CD(Continuous Integration / Continuous Delivery)は、コード変更を自動的にテスト・検証し、本番環境へ届けるまでのパイプラインです。AI を組み込むことで、これまで人間が判断していた品質ゲートを自動化・高精度化できます。

AI 導入前後の比較

フェーズAI 導入前AI 導入後
コードレビュー人間が手動実施(数時間)AI が数分でレビュー + 人間が最終確認
テスト生成開発者が手動で書くAI がカバレッジを分析して自動生成
バグ検出テストで見逃したバグが本番へ静的解析 + AI レビューで事前検出
ドキュメント実装後に手動更新(忘れがち)マージ時に AI が自動更新

35.2 GitHub Actions の基本

GitHub Actions は GitHub に組み込まれた CI/CD プラットフォームです。.github/workflows/ 以下に YAML ファイルを置くことで、プッシュや PR をトリガーにワークフローを実行できます。

基本的なワークフロー構造

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "22"
          cache: "npm"

      - name: Install dependencies
        run: npm ci

      - name: Type check
        run: npx tsc --noEmit

      - name: Lint
        run: npx eslint src/ --max-warnings 0

      - name: Test
        run: npx vitest run --coverage

      - name: Coverage check
        run: |
          COVERAGE=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
          if (( $(echo "$COVERAGE < 80" | bc -l) )); then
            echo "❌ Coverage ${COVERAGE}% is below 80%"
            exit 1
          fi

35.3 AI による自動テスト・レビュー

Claude Code を GitHub Actions に組み込む

PR がオープンされたタイミングで Claude Code を使って自動レビューを実行します。

# .github/workflows/ai-review.yml
name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run AI Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # 変更されたファイルを取得
          CHANGED_FILES=$(git diff --name-only origin/main...HEAD | grep -E '\.(ts|tsx)$' | head -20)

          if [ -z "$CHANGED_FILES" ]; then
            echo "No TypeScript files changed"
            exit 0
          fi

          # AI レビューを実行
          REVIEW=$(env -u CLAUDECODE claude -p "
            以下のファイルをレビューしてください:
            ${CHANGED_FILES}

            確認項目:
            1. 型安全性(any型の使用)
            2. エラーハンドリングの漏れ
            3. セキュリティの問題(SQL インジェクション・XSS 等)
            4. パフォーマンスの問題

            出力: GitHub PR コメント形式の Markdown
          " --output-format text)

          # PR にコメントを投稿
          gh pr comment ${{ github.event.pull_request.number }} --body "$REVIEW"

AI によるテスト自動生成

新しいコードに対してテストが不足している場合、AI がテストを自動生成して PR に追加します:

# .github/workflows/test-generation.yml
name: AI Test Generation

on:
  pull_request:
    types: [opened]

jobs:
  generate-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Check test coverage
        id: coverage
        run: |
          npm ci && npx vitest run --coverage --reporter json
          LOW_COVERAGE=$(cat coverage/coverage-summary.json | \
            jq -r '[to_entries[] | select(.value.lines.pct < 80) | .key] | join("\n")')
          echo "files=$LOW_COVERAGE" >> $GITHUB_OUTPUT

      - name: Generate missing tests
        if: steps.coverage.outputs.files != ''
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          env -u CLAUDECODE claude -p "
            以下のファイルのテストカバレッジが 80% 未満です。
            不足しているテストを Vitest で書いてください:

            ${{ steps.coverage.outputs.files }}

            既存のテストファイルを参考にして、同じスタイルで書くこと。
          "
          git add -A && git commit -m "test: add missing tests (auto-generated)"
          git push

35.4 品質ゲートの設計

品質ゲートは「この基準を満たさなければマージ不可」という自動チェックポイントです。

品質ゲートの GitHub Actions 統合設定

# .github/branch-protection-rules の設定(GitHub API経由)
# Required status checks:
# - Type Check (tsc)
# - Lint (eslint)
# - Test (vitest)
# - Coverage (≥ 80%)
# - AI Review (claude)
# - Security Scan (trivy)
# .github/workflows/quality-gate.yml
name: Quality Gate

on:
  pull_request:
    branches: [main]

jobs:
  type-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npx tsc --noEmit

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npx eslint src/ --max-warnings 0

  test-and-coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx vitest run --coverage
      - name: Enforce 80% coverage
        run: |
          LINES=$(jq '.total.lines.pct' coverage/coverage-summary.json)
          [ "$(echo "$LINES >= 80" | bc)" = "1" ] || (echo "Coverage: $LINES%" && exit 1)

  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: "fs"
          severity: "CRITICAL,HIGH"
          exit-code: "1"

段階的な品質ゲートの導入

既存プロジェクトへの一気導入は現実的でありません。段階的に厳しくします:

追加するゲート目標
第1週型チェック、テスト最低限の安全ネット
第2週カバレッジ 60%テスト習慣の確立
第4週カバレッジ 80%、リント品質基準の定着
第8週AI レビュー、セキュリティスキャン完全自動化

35.5 デプロイの自動化

AI を使った安全なデプロイパイプライン

AI スモークテストの実装

# .github/workflows/deploy.yml(抜粋)
  smoke-test:
    runs-on: ubuntu-latest
    needs: deploy-staging
    steps:
      - name: AI Smoke Test
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          STAGING_URL: ${{ vars.STAGING_URL }}
        run: |
          env -u CLAUDECODE claude -p "
            ${STAGING_URL} にデプロイされたアプリのスモークテストを実施してください。

            確認項目:
            1. トップページが 200 を返すか
            2. API の /health エンドポイントが OK を返すか
            3. 認証フローが正常に動くか(テストユーザーで確認)
            4. 主要な API エンドポイント 5 つが正常に応答するか

            問題があれば 'SMOKE_TEST_FAILED' と出力してください。
          " | grep -q 'SMOKE_TEST_FAILED' && exit 1 || exit 0

GitHub Actions のワークフロー実行結果 出典: GitHub Actions 公式ドキュメント

TODO: あとで実際のスクリーンショットに置き換え - GitHub Actions の品質ゲートが全て通過した PR の画面(緑のチェックマーク)

環境別のデプロイ戦略

環境トリガーAI の役割
PreviewPR オープンスモークテスト + UI 確認
Stagingmain マージ統合テスト + パフォーマンス確認
Production手動承認リリース後の監視 + 異常検知

本番デプロイには必ず人間の承認を挟むことで、AI の誤判断による障害を防ぎます。GitHub の environment protection rules を使って承認ゲートを設定してください。

On this page