Wir lieben Automation. Wir nutzen sie, um unsere Infrastruktur zu betreiben, Workloads auf Null zu skalieren und – zunehmend – um den menschlichen Aufwand zu verringern, der nötig ist, um qualitativ hochwertigen Code auszuliefern. Ein Bereich, der sich bisher noch hartnäckig manuell anfühlte, waren Pull-Request-Reviews. Zwischen Cursor als unserer IDE, ChatGPT/Codex für Prototyping und gemini-cli für schnelle Checks waren unsere lokalen Workflows schnell – aber CI wartete immer noch auf einen Menschen.
Also stellten wir eine einfache Frage: Könnten wir ein großes Sprachmodell den Diff lesen lassen, Probleme erkennen und direkt im PR kommentieren lassen?
Es stellt sich heraus: ja. Es brauchte nur ein paar Zeilen GitHub Actions-Kleber, um bei jedem Pull Request hilfreiche, strukturierte Reviews zu erhalten.
Wir wollten Menschen nicht ersetzen. Wir wollten einen ersten Durchlauf, der:
Wenn eine Änderung in Ordnung ist, soll der Bot das einfach sagen und sich zurückziehen.
@google/gemini-cli in der CI, um den automatisierten Review-Schritt durchzuführen.gh), um im PR zu kommentieren.Hier ist die komplette Action, die wir ausführen. Einfach in .github/workflows/gemini-pr.yml einfügen:
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: >
please review the changes of @pr.diff (this pull request) and suggest improvements or provide insights into potential issues.
do not document or comment on existing changes, if everything looks good, just say so.
can you categorise the changes and improvesments into low, medium and high priority?
Whenever you find an issue, please always provide an file and line number as reference information. if multiple files are affected, please provide a list of files and line numbers.
provide the output in markdown format and do not include any other text.
Checkout mit fetch-depth: 0, damit wir zuverlässig gegen den Basis-Branch des PR diffen können.
Rust Toolchain installiert rustfmt und clippy, weil unsere Repos oft Rust-Code enthalten; diese Tools laufen auch woanders in unserer Pipeline, aber die Toolchain hier einzurichten vermeidet Überraschungen.
Node wird für das gemini-cli benötigt.
Wir installieren @google/gemini-cli global im Runner.
Wir erzeugen eine Diff-Datei:
git diff origin/${{ github.base_ref }} > pr.diff
So sieht das Modell nur die zur Review stehenden Änderungen.
Wir geben den Prompt an gemini weiter (das CLI liest @pr.diff inline als Dateireferenz) und speichern die Markdown-Ausgabe des Modells in review.md.
Wir fügen die Review in die Job-Zusammenfassung ($GITHUB_STEP_SUMMARY) ein, sodass sie in der Actions-Oberfläche sichtbar ist.
Wir kommentieren im PR mit gh pr comment ... --body-file review.md.
LLM-Ausgaben sind nur so gut wie die Anweisungen. Unsere sind pragmatisch:
Wir haben ein wenig iteriert, um dies zu erreichen. Die wirkungsvollsten Anpassungen waren: auf Datei-/Zeilenverweise zu bestehen und ausschweifenden Text zu verbieten.
In einem typischen PR sehen wir Abschnitte wie:
Wenn alles in Ordnung ist, erhalten wir eine Einzeiler: “Looks good.” Perfekt – genau das wollen wir.
GEMINI_API_KEY und GITHUB_TOKEN als Repo- oder Organisations-Geheimnisse. Halten Sie die Berechtigungen eng. Die Action setzt permissions: write-all, da sie Kommentare postet; schränken Sie dies ein, wenn Ihre Policies das erfordern.git diff origin/${{ github.base_ref }} den richtigen Kontext. Wenn Ihr Workflow nur den Merge-Commit abholt, stellen Sie sicher, dass der Basis-Branch verfügbar ist oder passen Sie auf github.event.pull_request.base.sha an.pull_request_target mit sorgfältiger Härtung ausführen oder die Review hinter Labels absichern.pull_request (nicht bei jedem Push) aus.Automatisierte Reviews machen Menschen wählerischer 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 auch überraschend gut in Sachen Konsistenz. Ein LLM vergisst nicht das vereinbarte Fehlerbehandlungsmuster zwischen Diensten oder unsere bevorzugte Log-Struktur; es wendet diese Prüfungen bei jedem PR einheitlich an.
Dieses Muster funktioniert mit fast jedem Modell oder CLI. Einige einfache Erweiterungen:
failed setzen, um Merges bis zur Behebung zu blockieren.gh CLI unterstützt das) für noch präziseres Feedback.ai-review-Label hinzufügen, oder automatisch needs-attention hinzufügen, wenn hochprioritäre Funde erscheinen.Das ersetzt keine menschliche Merge-Freigabe. Es ist ein leichter Filter, der sich am ersten Tag bezahlt macht.