Amiamo l’automazione. La usiamo per alimentare la nostra infrastruttura, per scalare i carichi di lavoro fino a zero e—sempre più spesso—per ridurre la quantità di attenzione umana necessaria per consegnare codice di alta qualità. Un ambito che restava ostinatamente manuale erano le review delle pull request. Tra Cursor come IDE, ChatGPT/Codex per il prototipaggio e gemini-cli per controlli rapidi, i nostri flussi locali erano veloci—ma la CI continuava a dipendere da un umano.
Ci siamo quindi posti una domanda semplice: potevamo permettere a un modello di linguaggio di leggere il diff, individuare problemi e commentare direttamente la PR?
Risultato: sì. Sono bastate poche righe di “colla” in GitHub Actions per ottenere revisioni utili e strutturate su ogni pull request.
Non cercavamo di sostituire gli esseri umani. Volevamo un primo passaggio che:
Se una modifica va bene, vogliamo che il bot lo dica semplicemente e si tolga di mezzo.
@google/gemini-cli dentro la CI per eseguire il passaggio di revisione automatico.gh) per commentare la PR.Ecco l’Action completa che eseguiamo. Inseriscila in .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 con fetch-depth: 0 così possiamo fare il diff rispetto al branch base della PR in modo affidabile.
Toolchain Rust installa rustfmt e clippy perché i nostri repository spesso contengono codice Rust; quelli girano altrove nella pipeline, ma impostare la toolchain qui evita sorprese.
Node è necessario per il gemini-cli.
Installiamo @google/gemini-cli globalmente nel runner.
Creiamo un file diff:
git diff origin/${{ github.base_ref }} > pr.diff
Questo garantisce che il modello veda solo le modifiche in revisione.
Iniettiamo il prompt in gemini (il CLI legge @pr.diff inline come riferimento file) e catturiamo l’output markdown del modello in review.md.
Applichiamo la review al Job Summary ($GITHUB_STEP_SUMMARY) così è visibile nell’interfaccia delle Actions.
Comentiamo la PR usando gh pr comment … --body-file review.md.
Gli output degli LLM sono buoni quanto le istruzioni. Il nostro mantiene le cose pratiche:
Abbiamo iterato un po’ per arrivarci. Le modifiche più influenti sono state: insistere sulle referenze file/linea e vietare prose extra.
Su una PR tipica, vediamo sezioni come:
Se tutto va bene, otteniamo una riga: “Looks good.” Perfetto—è esattamente ciò che vogliamo.
GEMINI_API_KEY e GITHUB_TOKEN nei segreti del repo o dell’organizzazione. Mantieni gli scope ristretti. L’Action imposta permissions: write-all perché pubblica un commento; limita questo se la tua policy lo richiede.git diff origin/${{ github.base_ref }} dà il contesto giusto. Se il tuo workflow scarica solo il commit di merge, assicurati che il branch base sia disponibile o aggiusta su github.event.pull_request.base.sha.pull_request_target con attenta hardening, o porre la review dietro a etichette.pull_request (non ad ogni push).Le revisioni automatiche rendono gli esseri umani più selettivi con la loro attenzione. Diminuiamo il tempo speso su “rinomina questa variabile” e lo rivediamo su architettura, flussi di dati e confini di sicurezza. Questo significa:
È anche sorprendentemente efficace per la coerenza. Un LLM non dimenticherà il pattern concordato di gestione degli errori tra i servizi o la nostra struttura di logging preferita; applica quei controlli in modo uniforme su ogni PR.
Questo schema funziona con quasi qualsiasi modello o CLI. Alcune estensioni semplici:
gh lo supporta) per feedback ancora più mirati.ai-review, o aggiungi automaticamente needs-attention quando compaiono riscontri ad alta priorità.Niente di tutto questo sostituisce l’approvazione umana di un merge. È un filtro leggero che si ripaga già dal primo giorno.