Skip to main content

Fehlgeschlagene CI-Builds automatisch beheben

Füge eine GitHub Action hinzu, die Devin aufruft, um fehlgeschlagene CI-Builds in deinen PRs zu beheben.
AuthorCognition
CategoryAutomatisierungen
FeaturesAPI
1

Speichern Sie Ihren Devin API key auf GitHub

Der Workflow ruft Devin’s v3 API auf, um Sitzungen programmgesteuert zu erstellen. Erstelle einen Service User und speichere dessen Token als GitHub-Actions-Secret:
  1. Gehe zu app.devin.ai > Settings > Service Users und erstelle einen Service User mit der Berechtigung ManageOrgSessions.
  2. Kopiere das nach der Erstellung angezeigte API-Token — es wird nur einmal angezeigt.
  3. Navigiere in deinem GitHub-Repository zu Settings > Secrets and variables > Actions.
  4. Füge zwei Secrets hinzu: DEVIN_API_KEY (das Token) und DEVIN_ORG_ID (deine Organisations-ID — du erhältst sie, indem du GET https://api.devin.ai/v3/enterprise/organizations mit deinem Token aufrufst).
Stelle sicher, dass das Repository bereits in Devin’s Machine einrichtet ist, damit Devin es klonen, bauen und Änderungen pushen kann.
2

Workflow-Datei hinzufügen

Erstelle .github/workflows/devin-ci-fix.yml. Dieser Workflow wird immer dann ausgelöst, wenn dein bestehender CI-Workflow fehlschlägt, extrahiert die Namen der fehlgeschlagenen Jobs und ruft die Devin API auf, um eine Fehlerbehebungs-Session zu starten:
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.\"
            }"
Ersetzen Sie "CI" im workflows-Array durch den genauen name: aus Ihrer bestehenden CI-Workflow-Datei (z. B. "Tests", "Build & Test").Verwenden Sie das Feld tags im Request-Body (z. B. "tags": ["ci-fix", "pr-312"]), um nachzuverfolgen, bei welchen CI-Fehlern bereits Sitzungen ausgelöst wurden, und Duplikate zu vermeiden.
3

Was passiert, wenn CI fehlschlägt

Wenn der CI-Lauf eines PR fehlschlägt, extrahiert die Action die Fehlerdetails und übergibt sie als Prompt für eine Sitzung an Devin. So sieht ein typischer Auto-Fix-Workflow aus:
  1. Liest die CI-Logs — Devin öffnet die URL des Laufs und parst die Fehlerausgabe, Stacktraces und Testergebnisse der fehlgeschlagenen Jobs
  2. Verfolgt den Fehler bis zum Code — Lokalisiert die relevante Datei und Zeile im PR-Branch (z. B. UserList.tsx:34) und liest den umgebenden Code sowie den jüngsten Diff
  3. Pusht einen Fix — Committet eine gezielte Änderung direkt in den PR-Branch, wodurch CI automatisch erneut ausgelöst wird
  4. Kommentiert im PR — Postet eine Zusammenfassung, die die Ursache und die vorgenommenen Änderungen erklärt
Beispiel-PR-Kommentar von Devin:
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

Auf die relevanten Fehler eingrenzen

Nicht jeder CI-Fehlschlag lässt sich sinnvoll automatisch beheben – Infrastruktur-Timeouts und Docker-Build-Probleme werden nicht durch eine Code-Änderung gelöst. Fügen Sie eine Bedingung hinzu, sodass nur relevante Jobfehler Devin auslösen:
      - 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" \
          ...

Korrekturen überprüfbar halten

Devin pusht einen Fix-Commit, aber der PR muss weiterhin von einer Person überprüft werden, bevor er gemergt wird. Automatische Fixes sind als Starthilfe für Entwickler gedacht, nicht als Ersatz für Code-Reviews. Wenn Devin den Fehler nicht beheben kann, hinterlässt es einen Kommentar im PR und erklärt, was es festgestellt hat, damit ein Entwickler von dort übernehmen kann.