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 réduire l’attention humaine nécessaire à la livraison d’un code de haute qualité. Un domaine qui semblait encore 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 l’intégration continue attendait toujours un humain.
Nous avons donc posé une question simple : pouvait-on laisser un grand modèle linguistique lire le diff, repérer les problèmes, et commenter directement sur la PR ?
Il s’avère que oui. Il a suffi de quelques lignes de code glue GitHub Actions pour obtenir des revues structurées et utiles sur chaque pull request.
Nous ne cherchions pas à remplacer les humains. Nous voulions un premier passage qui :
Si un changement est correct, nous voulons que le bot le dise simplement et s’efface.
@google/gemini-cli
dans CI pour exécuter l’étape de revue automatisée.gh
) pour commenter sur la PR.Voici l’Action complète que nous utilisons. 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 -a > 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 fiablement avec la branche de base de la PR.
Rust toolchain installe rustfmt
et clippy
car nos dépôts contiennent souvent du code Rust ; ces outils tournent ailleurs dans notre pipeline, mais rester consistants évite des surprises.
Node est nécessaire pour le 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
Cela garantit que le modèle ne voit que les changements à revoir.
Nous piped le prompt dans gemini -a
(le CLI lit @pr.diff
inline en référence fichier) et capturons la sortie markdown du modèle dans review.md
.
Nous ajoutons la revue au résumé du job ($GITHUB_STEP_SUMMARY
) pour qu’elle soit visible dans l’interface Actions.
Nous commentons la PR via gh pr comment … --body-file review.md
.
Les sorties d’un LLM ne sont aussi bonnes que les instructions. La nôtre reste pratique :
Nous avons itéré un peu pour arriver là. Les ajustements les plus impactants : insister sur les références fichier/ligne et interdire des propos superflus.
Sur une PR typique, on voit des sections comme :
Si tout va bien, on obtient une ligne : « Ça a l’air bon. » Parfait — c’est exactement ce qu’on veut.
GEMINI_API_KEY
et GITHUB_TOKEN
dans les secrets du repo ou de l’organisation. Restreignez les scopes au strict nécessaire. L’Action définit permissions: write-all
car elle poste 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 accessible ou adaptez sur github.event.pull_request.base.sha
.pull_request_target
avec une sécurisation poussée, ou conditionner la revue à des labels.pull_request
(pas à chaque push).Les revues automatisées rendent les humains plus sélectifs dans leur attention. On passe moins de temps sur « renomme 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 pour la cohérence. Un LLM n’oubliera pas le pattern convenu de gestion d’erreur entre services ou notre structure préférée de logs ; il applique ces contrôles uniformément à chaque PR.
Ce pattern fonctionne avec presque tous les modèles ou CLI. Quelques extensions simples :
failed
pour bloquer les merges jusqu’à résolution.gh
le permet) pour un retour encore plus précis.ai-review
, ou ajouter automatiquement un label needs-attention
quand des constats hautement prioritaires apparaissent.Rien de tout cela ne remplace un humain pour valider un merge. C’est un filtre léger qui s’amortit dès le premier jour.