Ein LLM unsere Pull Requests prüfen lassen (damit du es nicht tun musst)

created: Freitag, Aug. 8, 2025

We lieben Automatisierung. Wir nutzen sie, um unsere Infrastruktur zu betreiben, Workloads auf null zu skalieren und—zunehmend—um die Menge an menschlicher Aufmerksamkeit zu verringern, die nötig ist, um qualitativ hochwertigen Code auszuliefern. Ein Bereich, der sich bisher hartnäckig manuell anfühlte, waren die Pull-Request-Reviews. Zwischen Cursor als IDE, ChatGPT/Codex für Prototyping und gemini-cli für schnelle Checks waren unsere lokalen Workflows schnell—aber CI wartete trotzdem noch auf einen Menschen.

Also stellten wir eine einfache Frage: Können wir ein großes Sprachmodell den Diff lesen lassen, Probleme finden und direkt im PR kommentieren lassen?

Es stellte sich heraus: ja. Es brauchte nur ein paar Zeilen GitHub Actions-Kleber, um hilfreiche, strukturierte Reviews für jeden Pull Request zu bekommen.


The goal

Wir wollten Menschen nicht ersetzen. Wir wollten einen ersten Durchgang, der:

Wenn eine Änderung in Ordnung ist, soll der Bot das einfach so sagen und sich aus dem Weg halten.


The tools in our stack


The workflow, end to end

Hier ist die vollständige Action, die wir laufen lassen. Leg sie in .github/workflows/gemini-pr.yml ab:

name: gemini-pr
on:
  workflow_dispatch:
  pull_request:
jobs:
  build:
    permissions: write-all
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: 'true'
        fetch-depth: 0
    - uses: actions-rust-lang/setup-rust-toolchain@v1
      with:
        components: rustfmt, clippy
        cache: false
    - uses: actions/setup-node@v4
      with:
        node-version: 20
    - name: install gemini
      run: |
        npm install -g @google/gemini-cli
    - name: gemini
      run: |
        echo "merging into ${{ github.base_ref }}"
        git diff origin/${{ github.base_ref }} > pr.diff
        echo $PROMPT | gemini > review.md
        cat review.md >> $GITHUB_STEP_SUMMARY
        gh pr comment ${{ github.event.pull_request.number }} --body-file review.md
      env:
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        PROMPT: >
          bitte überprüfe die änderungen in @pr.diff (dieser Pull Request) und schlage verbesserungen vor oder gib einblicke in mögliche probleme. 
          dokumentiere oder kommentiere bestehende änderungen nicht; wenn alles gut aussieht, sag es einfach.
          kannst du die änderungen und verbesserungen in niedrig, mittel und hoch priorität kategorisieren?
          Wann immer du ein Problem findest, gib bitte immer eine Datei- und Zeilennummer als Referenzinformation an. Wenn mehrere Dateien betroffen sind, gib bitte eine Liste von Dateien und Zeilennummern an.
          gib die Ausgabe im Markdown-Format aus und füge keinen weiteren Text hinzu.

What each part does


The prompt that makes it useful

LLM-Ausgaben sind nur so gut wie die Anweisungen. Unseres hält die Dinge praktisch:

Wir haben etwas iteriert, um dorthin zu kommen. Die wirkungsvollsten Anpassungen waren: das Bestehen auf Datei-/Zeilenreferenzen und das Verbot von zusätzlichem Fließtext.


What the review looks like

GitHub Action-Kommentar, der verschiedene Fehler zeigt

Bei einem typischen PR sehen wir Abschnitte wie:

Wenn alles in Ordnung ist, bekommen wir eine Einzeilige: “Looks good.” Perfekt—genau das wollen wir.


Gotchas and practical notes


Why this matters (beyond convenience)

Automatisierte Reviews machen Menschen selektiver mit ihrer Aufmerksamkeit. Wir verbringen weniger Zeit mit “benenne diese Variable um” und mehr Zeit mit Architektur, Datenflüssen und Sicherheitsgrenzen. Das bedeutet:

Es ist außerdem überraschend gut in Sachen Konsistenz. Ein LLM vergisst nicht das vereinbarte Fehlerbehandlungs-Muster zwischen Services oder unsere bevorzugte Log-Struktur; es wendet diese Prüfungen bei jedem PR einheitlich an.


Variations you might try

Dieses Muster funktioniert mit fast jedem Modell oder CLI. Ein paar einfache Erweiterungen:


Results so far

Nichts davon ersetzt einen Menschen, der einen Merge approvt. Es ist ein leichter Filter, der sich bereits am ersten Tag bezahlt macht.