GitHub Actions×AI自動化2026:Claude/GPT-4oをCIパイプラインに組み込む実践ガイド
GitHub Actions×AI:開発ワークフローを自動化する
AIをCIパイプラインに組み込むことで、以下が自動化できます:
- PRのコードレビューをAIが実施 → レビュー待ち時間ゼロ
- テスト失敗の原因をAIが解析 → デバッグ時間削減
- PR説明文の自動生成 → ドキュメント作業ゼロ
- セキュリティ脆弱性の自動検出 → 人手のセキュリティレビューを補完
基本:Claude APIをActions内で呼ぶ
# .github/workflows/ai-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get diff
id: diff
run: |
DIFF=$(git diff origin/${{ github.base_ref }}...HEAD -- '*.ts' '*.tsx' | head -200)
echo "diff<<EOF" >> $GITHUB_OUTPUT
echo "$DIFF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: AI Review with Claude
id: review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
REVIEW=$(curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 2048,
"messages": [{
"role": "user",
"content": "以下のコード差分をレビューしてください:\n\n'"${{ steps.diff.outputs.diff }}"'"
}]
}' | jq -r '.content[0].text')
echo "review<<EOF" >> $GITHUB_OUTPUT
echo "$REVIEW" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Post review comment
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '## AI コードレビュー\n\n' + `${{ steps.review.outputs.review }}`
});
応用1:テスト失敗の自動解析
# .github/workflows/test-analysis.yml
name: Test Failure Analysis
on:
workflow_run:
workflows: ["CI Tests"]
types: [completed]
jobs:
analyze-failure:
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
runs-on: ubuntu-latest
steps:
- name: Get test logs
id: logs
run: |
LOGS=$(gh run view ${{ github.event.workflow_run.id }} --log-failed 2>&1 | tail -100)
echo "logs<<EOF" >> $GITHUB_OUTPUT
echo "$LOGS" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Analyze and notify Slack
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
run: |
ANALYSIS=$(curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-haiku-4-5-20251001",
"max_tokens": 512,
"messages": [{
"role": "user",
"content": "テスト失敗ログを分析して根本原因と修正方法を簡潔に:\n'"${{ steps.logs.outputs.logs }}"'"
}]
}' | jq -r '.content[0].text')
curl -X POST $SLACK_WEBHOOK \
-H 'Content-type: application/json' \
--data "{\"text\":\"CIテスト失敗\n$ANALYSIS\"}"
応用2:PR説明文の自動生成
# .github/workflows/pr-description.yml
name: Auto PR Description
on:
pull_request:
types: [opened]
jobs:
generate-description:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate and update PR description
uses: actions/github-script@v7
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
script: |
const { execSync } = require('child_process');
const commits = execSync(
'git log origin/${{ github.base_ref }}...HEAD --oneline'
).toString();
const diff = execSync(
'git diff origin/${{ github.base_ref }}...HEAD --stat'
).toString();
const response = await fetch('https://api.anthropic.com/v1/messages', {
method: 'POST',
headers: {
'x-api-key': process.env.ANTHROPIC_API_KEY,
'anthropic-version': '2023-06-01',
'content-type': 'application/json',
},
body: JSON.stringify({
model: 'claude-haiku-4-5-20251001',
max_tokens: 1024,
messages: [{
role: 'user',
content: `コミット履歴とdiffからPR説明文を生成。##変更概要, ##詳細, ##テスト方法 のセクションで記載:\n\nコミット: ${commits}\n変更: ${diff}`,
}],
}),
});
const data = await response.json();
const description = data.content[0].text;
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
body: description,
});
コスト最適化のポイント
# モデルの使い分けでコストを最適化
- name: Quick check → claude-haiku-4-5-20251001 # $0.25/1M(安価・高速)
# コメント文法チェック・簡単なバリデーション
- name: Code review → claude-sonnet-4-6 # $3/1M(バランス)
# 通常のコードレビュー
- name: Security audit → claude-opus-4-6 # $15/1M(高精度)
# セキュリティクリティカルな審査
実際の導入効果
| 指標 | 導入前 | 導入後 |
|---|---|---|
| PRレビュー待ち時間 | 平均4時間 | 即時 |
| テスト失敗デバッグ時間 | 平均45分 | 15分 |
| PR説明文の作成時間 | 10分 | 0分 |
| セキュリティ問題検出率 | 手動62% | AI+手動89% |
Matrix戦略:複数環境での並列テスト
AI自動化と組み合わせて、複数のNode.jsバージョンやOSで並列テストを実行する方法です。
# .github/workflows/matrix-test.yml
name: Matrix Test with AI Analysis
on:
pull_request:
branches: [main]
jobs:
test:
strategy:
matrix:
node-version: [20, 22]
os: [ubuntu-latest, macos-latest]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
- name: テスト失敗時にAIで環境差分を分析
if: failure()
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
echo "失敗環境: ${{ matrix.os }} / Node ${{ matrix.node-version }}"
fail-fast: false を設定すると、1つの環境で失敗しても他のテストは最後まで実行されます。
Secrets管理のベストプラクティス
AI APIキーを安全にGitHub Actionsで使うための設定方法です。
Secretsの階層設計
| レベル | 用途 | 設定場所 |
|---|---|---|
| Repository secrets | リポジトリ固有のAPIキー | Settings > Secrets |
| Environment secrets | 本番/ステージング別のキー | Settings > Environments |
| Organization secrets | 組織共通のキー | Org Settings > Secrets |
注意: Forkからのプルリクエストではsecretsにアクセスできません。APIキーのローテーションを四半期ごとに実施し、GITHUB_TOKENの権限はpermissionsで最小限に設定しましょう。
Reusable Workflows:AI処理の再利用
複数リポジトリで同じAIワークフローを使い回すための設計です。
共通ワークフローの定義
# .github/workflows/reusable-ai-review.yml
name: Reusable AI Review
on:
workflow_call:
inputs:
model:
required: false
default: 'claude-sonnet-4-6'
type: string
secrets:
ANTHROPIC_API_KEY:
required: true
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: AI Review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# Claude APIでコードレビューを実行
呼び出し側
jobs:
ai-review:
uses: your-org/shared-workflows/.github/workflows/reusable-ai-review.yml@main
secrets:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
この方式なら、プロンプト改善を1箇所で行うだけで全リポジトリに反映されます。