Skip to main content

失敗しているCIビルドを自動修正

PRのCI失敗を修正するためにDevinを呼び出すGitHub Actionを追加します。
AuthorCognition
Category自動化
FeaturesAPI
1

GitHub に Devin の APIキーを保存する

このワークフローは、セッションをプログラム的に作成するために Devin の v3 API を呼び出します。サービスユーザーを作成し、そのトークンを GitHub Actions のシークレットとして保存します。
  1. app.devin.ai > Settings > Service Users に移動し、ManageOrgSessions 権限を持つサービスユーザーを作成してください
  2. 作成後に表示される API トークンをコピーしてください — 一度しか表示されません
  3. GitHub リポジトリで Settings > Secrets and variables > Actions に移動してください
  4. 2 つのシークレットを追加してください: DEVIN_API_KEY(トークン)と DEVIN_ORG_ID(組織 ID — トークンを使って GET https://api.devin.ai/v3/enterprise/organizations を呼び出して取得します)
Devin がリポジトリをクローン、ビルド、プッシュできるように、リポジトリがすでに Devin の Machine でセットアップ済み であることを確認してください。
2

ワークフローファイルを追加する

.github/workflows/devin-ci-fix.yml を作成します。このワークフローは、既存の CI ワークフローが失敗で終了するたびに起動し、失敗したジョブ名を抽出して、Devin API を呼び出して修正用セッションを開始します。
name: Auto-fix CI with Devin

on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  trigger-devin-fix:
    if: >
      github.event.workflow_run.conclusion == 'failure' &&
      github.event.workflow_run.pull_requests[0]
    runs-on: ubuntu-latest
    steps:
      - name: Get failure details
        id: failure
        uses: actions/github-script@v7
        with:
          script: |
            const run = context.payload.workflow_run;
            const pr = run.pull_requests[0];
            const jobs = await github.rest.actions.listJobsForWorkflowRun({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: run.id
            });
            const failed = jobs.data.jobs
              .filter(j => j.conclusion === 'failure')
              .map(j => j.name);
            core.setOutput('pr_number', pr.number);
            core.setOutput('branch', pr.head.ref);
            core.setOutput('failed_jobs', failed.join(', '));
            core.setOutput('run_url', run.html_url);

      - name: Trigger Devin session
        run: |
          curl -s -X POST "https://api.devin.ai/v3/organizations/${{ secrets.DEVIN_ORG_ID }}/sessions" \
            -H "Authorization: Bearer ${{ secrets.DEVIN_API_KEY }}" \
            -H "Content-Type: application/json" \
            -d "{
              \"prompt\": \"CI failed on PR #${{ steps.failure.outputs.pr_number }} in ${{ github.repository }}. Failed jobs: ${{ steps.failure.outputs.failed_jobs }}. Run: ${{ steps.failure.outputs.run_url }}. Branch: ${{ steps.failure.outputs.branch }}. Read the CI logs, identify the root cause, and push a fix to the branch.\"
            }"
workflows 配列内の "CI" を、既存の CI ワークフローファイルで設定されている正確な name: の値(例: "Tests""Build & Test")に置き換えます。リクエストボディ内の tags フィールド(例: "tags": ["ci-fix", "pr-312"])を使用して、どの CI 障害で既にセッションがトリガーされたかを追跡し、重複を防ぎます。
3

CI が失敗した場合

PR の CI 実行が失敗したとき、Action は失敗の詳細を抽出し、それをセッションプロンプトとして Devin に渡します。典型的な自動修正フローは次のとおりです。
  1. CI ログを読む — Devin は実行 URL を開き、失敗したジョブのエラー出力、スタックトレース、テスト結果を解析します
  2. エラーをコードまでトレースする — PR ブランチ上の該当ファイルと行(例: UserList.tsx:34)を特定し、その周辺のコードや直近の差分を読みます
  3. 修正をプッシュする — PR ブランチに対して対象を絞った変更を直接コミットし、自動的に CI を再実行させます
  4. PR にコメントする — 根本原因と、何がどのように変更されたかを説明する要約を投稿します
Devin による PR コメントの例:
CI failure in test-unit — fixed

Root cause: `UserList.tsx:34` calls `.map()` on `props.users`, which is
undefined when the API returns an empty response body instead of `[]`.

Fix: Added a fallback — `const users = props.users ?? [];`
Added a test case for the empty-response scenario.
All 312 tests passing.
4

対象を適切な失敗に絞る

すべての CI の失敗が自動修正の恩恵を受けられるわけではありません。インフラのタイムアウトや Docker ビルドの問題は、コード変更では解決できません。関連するジョブの失敗のときにだけ Devin がトリガーされるよう、条件を追加してください。
      - name: Trigger Devin session
        if: >
          contains(steps.failure.outputs.failed_jobs, 'test') ||
          contains(steps.failure.outputs.failed_jobs, 'lint') ||
          contains(steps.failure.outputs.failed_jobs, 'typecheck')
        run: |
          curl -s -X POST "https://api.devin.ai/v3/organizations/${{ secrets.DEVIN_ORG_ID }}/sessions" \
          ...

修正はレビューしやすい状態に保つ

Devin は修正コミットをプッシュしますが、PR をマージする前には引き続き人間によるレビューが必要です。自動修正はコードレビューの代替ではなく、開発者にとってのたたき台として扱ってください。Devin が失敗を解決できない場合は、PR 上にコメントして判明した内容を説明し、エンジニアがそこから引き継げるようにします。