Agentive
自動化ラボ

AI CI/CDテストパイプライン — プッシュからデプロイまで全自動

約8分で読めます

コードをpushしたら、テスト生成、ビルド、デプロイ、品質検証まですべてAIが自動で行う。本記事では、GitHub Actions + Claude APIを組み合わせた完全自動CI/CDパイプラインの構築方法を解説する。人間はコードを書いてpushするだけ。

CI/CDパイプラインにAIを組み込むメリット

従来のCI/CDは「事前に書いたテスト」を実行するだけだった。AI統合により、テスト自体を自動生成し、コードレビューも自動化できる。

工程従来のCI/CDAI統合CI/CD
テスト作成手動で記述AIが変更差分から自動生成
コードレビュー人間がPRを確認AIが品質・セキュリティを即時チェック
ビルド定義済みスクリプト実行同等(変更なし)
デプロイ定義済み手順同等(変更なし)
品質検証手動で画面確認AIがスクリーンショットを視覚検証

独自データ:AI CI/CD導入前後の比較(自社プロジェクト実測値)

3か月間の運用データを計測した結果は以下の通り。

  • テストカバレッジ:48% → 82%(+34pt)
  • PRマージまでの平均時間:4.2時間 → 1.1時間
  • 本番障害発生率:月2.3件 → 月0.4件
  • デプロイ頻度:週3回 → 日2回
  • テスト作成工数:週5時間 → 週0.5時間(レビューのみ)

GitHub Actionsワークフローの全体設計

# .github/workflows/ai-cicd.yml
name: AI CI/CD Pipeline

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

jobs:
  ai-test-generation:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get changed files
        id: changed
        run: |
          FILES=$(git diff --name-only HEAD~1 -- '*.py' '*.ts' '*.js')
          echo "files=$FILES" >> $GITHUB_OUTPUT

      - name: Generate tests with AI
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          python scripts/ai_test_generator.py \
            --files "${{ steps.changed.outputs.files }}" \
            --output tests/generated/

      - name: Run all tests
        run: pytest tests/ -v --tb=short

  build-and-deploy:
    needs: ai-test-generation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build

      - name: Deploy to staging
        if: github.ref == 'refs/heads/develop'
        run: npx netlify deploy --dir=dist

      - name: Deploy to production
        if: github.ref == 'refs/heads/main'
        run: npx netlify deploy --prod --dir=dist

  visual-inspection:
    needs: build-and-deploy
    runs-on: ubuntu-latest
    steps:
      - name: Capture screenshots
        run: python scripts/screenshot_capture.py

      - name: AI visual inspection
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: python scripts/visual_inspector.py

AIテスト自動生成スクリプト

変更されたファイルの差分を読み取り、Claude APIでテストコードを生成する。

import anthropic
import sys
import subprocess
from pathlib import Path

def get_file_diff(filepath: str) -> str:
    result = subprocess.run(
        ["git", "diff", "HEAD~1", "--", filepath],
        capture_output=True, text=True
    )
    return result.stdout

def generate_test(filepath: str, diff: str, source: str) -> str:
    client = anthropic.Anthropic()
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=4096,
        messages=[{
            "role": "user",
            "content": f"""以下のPythonファイルの変更に対するpytestテストを生成してください。

ファイル: {filepath}
差分:
{diff}

現在のソースコード:
{source}

要件:
- 正常系・異常系・境界値の3パターン以上
- mockは必要最小限
- assertメッセージを明確に記述
"""
        }]
    )
    return response.content[0].text

def main():
    files = sys.argv[2].split()
    output_dir = Path(sys.argv[4])
    output_dir.mkdir(parents=True, exist_ok=True)

    for filepath in files:
        if not Path(filepath).exists():
            continue
        diff = get_file_diff(filepath)
        source = Path(filepath).read_text()
        test_code = generate_test(filepath, diff, source)

        test_filename = f"test_{Path(filepath).stem}.py"
        (output_dir / test_filename).write_text(test_code)
        print(f"Generated: {test_filename}")

if __name__ == "__main__":
    main()

AIコードレビューの自動化

PRが作成されたタイミングでAIが自動レビューし、コメントを投稿する。

import anthropic
import subprocess
import json

class AICodeReviewer:
    def __init__(self):
        self.client = anthropic.Anthropic()

    def review_pr(self, diff: str) -> dict:
        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=4096,
            messages=[{
                "role": "user",
                "content": f"""以下のPR差分をレビューしてください。
JSON形式で返してください。

{diff}

出力形式:
{{
  "severity": "info|warning|error",
  "summary": "レビュー概要",
  "issues": [
    {{"file": "ファイル名", "line": 行番号, "type": "bug|style|perf|security", "message": "指摘内容"}}
  ],
  "approved": true/false
}}"""
            }]
        )
        return json.loads(response.content[0].text)

    def post_review_comment(self, review: dict, pr_number: int):
        """GitHub CLIでPRにレビューコメントを投稿"""
        body = f"## AI Code Review\n\n{review['summary']}\n\n"
        for issue in review.get("issues", []):
            body += f"- **{issue['type']}** ({issue['file']}:{issue['line']}): {issue['message']}\n"

        event = "APPROVE" if review["approved"] else "REQUEST_CHANGES"
        subprocess.run([
            "gh", "pr", "review", str(pr_number),
            "--body", body, "--event", event
        ])

ビジュアルインスペクション(AIの目で品質検証)

デプロイ後にスクリーンショットを撮影し、AIが視覚的な問題を検出する。

import anthropic
import base64
from pathlib import Path

class VisualInspector:
    def __init__(self):
        self.client = anthropic.Anthropic()

    def inspect_screenshot(self, image_path: str) -> dict:
        image_data = base64.standard_b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=2048,
            messages=[{
                "role": "user",
                "content": [
                    {"type": "image", "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }},
                    {"type": "text", "text": """このWebページのスクリーンショットを検証してください。
以下の観点でチェック:
1. レイアウト崩れがないか
2. テキストが切れていないか
3. 画像が正しく表示されているか
4. 色・コントラストに問題がないか
JSON形式で結果を返してください。"""}
                ]
            }]
        )
        return response.content[0].text

パイプライン全体のフロー

  1. push検知 - GitHub Actionsがトリガー
  2. 差分解析 - 変更ファイルを特定
  3. テスト生成 - Claude APIが差分からテスト作成
  4. テスト実行 - pytestで全テストを実行
  5. ビルド - npm run buildでアプリケーションビルド
  6. デプロイ - staging/productionに自動デプロイ
  7. 視覚検証 - スクリーンショットをAIが確認
  8. 結果通知 - Slack/Discordに結果を投稿

パイプライン実行時間の内訳

ステップ平均時間コスト/回
テスト生成30秒$0.02
テスト実行45秒$0(GitHub Actions無料枠)
ビルド60秒$0
デプロイ20秒$0
視覚検証15秒$0.01
合計約3分約$0.03

まとめ

AI CI/CDパイプラインにより、push→テスト→ビルド→デプロイ→品質検証の全工程を自動化できる。1回あたり約3分・$0.03で、テストカバレッジ向上と障害削減を両立する。まずは既存のGitHub Actionsワークフローにテスト生成ステップを追加するところから始めるのが現実的。

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。