Nous adorons l’automatisation. Nous l’utilisons pour alimenter notre infrastructure, réduire les charges à zéro, et — de plus en plus — diminuer l’attention humaine nécessaire pour livrer un code de haute qualité. Une étape qui restait encore très manuelle était la revue des 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 l’intégration continue attendait toujours un humain.
Alors nous avons posé une question simple : pourrait-on laisser un grand modèle de langage lire le diff, repérer les problèmes, et commenter directement sur la PR ?
Finalement : oui. Quelques lignes de glue GitHub Actions ont suffi pour obtenir des revues utiles et structurées à chaque pull request.
Nous ne voulions pas remplacer les humains. Nous voulions un premier passage qui :
Si un changement est bon, 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. Placez-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 pour pouvoir comparer correctement avec la base de la PR.
Toolchain Rust installe rustfmt et clippy car nos repos contiennent souvent du Rust ; ces outils s’exécutent ailleurs dans la pipeline, mais configurer ici évite les surprises.
Node est requis pour gemini-cli.
Nous installons @google/gemini-cli globalement dans le runner.
Nous créons un fichier diff :
git diff origin/${{ github.base_ref }} > pr.diff
Ceci garantit que le modèle voit seulement les changements en revue.
Nous pipedons le prompt dans gemini (le CLI lit @pr.diff inline comme référence fichier) et capturons la sortie markdown dans review.md.
Nous ajoutons la revue au résumé du job ($GITHUB_STEP_SUMMARY) pour qu’elle soit visible dans l’UI Actions.
Nous commentons la PR via gh pr comment … --body-file review.md.
Les sorties LLM sont aussi bonnes que les instructions. La nôtre reste pragmatique :
Nous avons itéré un peu pour atteindre ce résultat. Les ajustements les plus impactants furent : insister sur les références fichier/ligne et interdire tout texte superflu.
Sur une PR typique, on voit des sections comme :
Si tout va bien, on a une ligne : « Looks good. » Parfait — c’est exactement ce que nous voulons.
GEMINI_API_KEY et GITHUB_TOKEN dans les secrets repo ou org. Gardez les scopes serrés. L’Action met permissions: write-all car elle poste un commentaire ; restreignez si votre politique l’exige.git diff origin/${{ github.base_ref }} donne le contexte correct. Si votre workflow récupère seulement le commit de merge, assurez-vous que la branche de base est disponible ou ajustez avec github.event.pull_request.base.sha.pull_request_target avec des protections strictes, ou verrouiller la revue derrière 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 « renommer cette variable » et plus sur l’architecture, les flux de données et les frontières de sécurité. Cela signifie :
C’est aussi étonnamment bon en cohérence. Un LLM n’oubliera pas le pattern convenu de gestion d’erreur entre services ni notre structure de logs préférée ; il applique ces règles uniformément à chaque PR.
Ce pattern fonctionne avec presque tous les modèles ou CLI. Quelques extensions simples :
gh le permet) pour un retour encore plus ciblé.ai-review, ou ajouter automatiquement un label needs-attention si des problèmes haute priorité sont trouvés.Rien de tout cela ne remplace un humain validant une fusion. C’est un filtre léger qui s’amortit dès le premier jour.