Nous aimons l’automatisation. Nous l’utilisons pour alimenter notre infrastructure, pour réduire les charges de travail à zéro, et — de plus en plus — pour diminuer la quantité d’attention humaine nécessaire pour livrer du code de haute qualité. Un domaine qui restait obstinément manuel était les revues de pull requests. Entre Cursor comme IDE, ChatGPT/Codex pour le prototypage, et gemini-cli pour des vérifications rapides, nos workflows locaux étaient rapides — mais le CI attendait encore un humain.
Nous nous sommes donc posé une question simple : pourrait-on laisser un grand modèle de langage lire le diff, repérer des problèmes et commenter directement la PR ?
Il s’avère que : oui. Il a suffi de quelques lignes de colle GitHub Actions pour obtenir des revues utiles et structurées sur chaque pull request.
Nous n’essayions pas de remplacer les humains. Nous voulions une première passe qui :
Si un changement est correct, nous voulons que le bot le dise simplement et se retire.
@google/gemini-cli dans le CI pour exécuter l’étape de revue automatisée.gh) pour commenter la PR.Voici l’Action complète que nous exécutons. Déposez-la dans .github/workflows/gemini-pr.yml:
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 avec fetch-depth: 0 afin de pouvoir faire un diff contre la branche de base de la PR de manière fiable.
Chaîne d’outils Rust installe rustfmt et clippy parce que nos dépôts incluent souvent du code Rust ; ces outils s’exécutent ailleurs dans notre pipeline, mais conserver la configuration de la toolchain ici évite les surprises.
Node est requis pour le gemini-cli.
Nous installons @google/gemini-cli globalement à l’intérieur du runner.
Nous créons un fichier diff :
git diff origin/${{ github.base_ref }} > pr.diff
Cela garantit que le modèle voit seulement les modifications à l’examen.
Nous envoyons le prompt dans gemini (la CLI lit @pr.diff inline comme référence de fichier) et capturons la sortie Markdown du modèle dans review.md.
Nous ajoutons la revue au Job Summary ($GITHUB_STEP_SUMMARY) pour qu’elle soit visible dans l’UI des Actions.
Nous commentons la PR en utilisant gh pr comment … --body-file review.md.
Les sorties des LLM ne sont aussi bonnes que les instructions. Le nôtre reste pratique :
Nous avons itéré un peu pour parvenir à cela. Les ajustements les plus impactants ont été : insister sur les références fichier/ligne et interdire la prose superflue.
Sur une PR typique, nous voyons des sections comme :
Si tout va bien, nous obtenons une ligne : « Looks good. » Parfait — c’est exactement ce que nous voulons.
GEMINI_API_KEY et GITHUB_TOKEN dans les secrets du dépôt ou de l’organisation. Gardez les permissions réduites. L’Action définit permissions: write-all parce qu’elle publie un commentaire ; restreignez cela si votre politique l’exige.git diff origin/${{ github.base_ref }} donne le bon contexte. Si votre workflow ne récupère que le commit de merge, assurez-vous que la branche de base est disponible ou adaptez à github.event.pull_request.base.sha.pull_request_target avec un renforcement attentif, ou conditionner la revue à des labels.pull_request (pas à chaque push).Les revues automatisées rendent les humains plus sélectifs dans leur attention. Nous passons moins de temps sur « renommez cette variable » et plus de temps sur l’architecture, les flux de données et les frontières de sécurité. Cela signifie :
C’est aussi étonnamment bon en matière de cohérence. Un LLM n’oubliera pas le pattern de gestion d’erreurs convenu entre les services ni notre structure de logs préférée ; il applique ces vérifications de manière uniforme sur chaque PR.
Ce schéma fonctionne avec presque n’importe quel modèle ou CLI. Quelques extensions faciles :
failed pour bloquer les merges jusqu’à résolution.gh le supporte) pour un retour encore plus précis.ai-review, ou ajouter automatiquement un label needs-attention quand des constats à haute priorité apparaissent.Rien de tout cela ne remplace un humain approuvant une fusion. C’est un filtre léger qui s’amortit dès le premier jour.