Skip to content

Gemini review for PR 5558 - 943970977cd8d83b42cc189f3eda7e5f486ce071 #19

Gemini review for PR 5558 - 943970977cd8d83b42cc189f3eda7e5f486ce071

Gemini review for PR 5558 - 943970977cd8d83b42cc189f3eda7e5f486ce071 #19

name: Gemini CLI PR Review
on:
pull_request:
types: [opened, synchronize, ready_for_review]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
run-name: Gemini review for PR ${{ github.event.pull_request.number }} - ${{ github.event.pull_request.head.sha }}
jobs:
gemini-pr-review:
# Temporarily disabled to avoid burning API tokens
if: false
# Skip if PR is in draft
# if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
env:
GEMINI_OUTPUT_DIR: artifacts/gemini_review/${{ github.event.pull_request.number }}-${{ github.event.pull_request.head.sha }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Gemini CLI
shell: bash
run: |
npm install -g @google/gemini-cli@latest
echo "$(npm config get prefix)/bin" >> $GITHUB_PATH
- name: Verify Gemini CLI
shell: bash
run: |
which gemini
gemini --version
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install/Upgrade Google Python Client
shell: bash
run: |
python -m pip install --upgrade pip
pip install --upgrade google-generativeai
# If you have a requirements.txt file, you might use this instead:
# pip install -r requirements.txt --upgrade
- name: Run Gemini PR review
env:
#GEMINI_MODEL: gemini-1.5-flash-latest
GEMINI_API_KEY: ${{ secrets.GEMINI_TEST }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_SHA: ${{ github.event.pull_request.head.sha }}
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_HEAD_REF: ${{ github.event.pull_request.head.ref }}
run: |
python -m tools.pr_preflight_launcher --ai-backend gemini --output-dir "${GEMINI_OUTPUT_DIR}"
- name: Print Gemini error (if any)
if: always()
run: |
if [ -f "${{ env.GEMINI_OUTPUT_DIR }}/error.txt" ]; then
echo "===== Gemini error.txt ====="
sed -n '1,200p' "${{ env.GEMINI_OUTPUT_DIR }}/error.txt"
else
echo "No error.txt found in ${{ env.GEMINI_OUTPUT_DIR }}"
fi
- name: Post Gemini review to PR
if: always()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs');
const path = require('path');
const outputDir = process.env.GEMINI_OUTPUT_DIR;
const commentMarker = '<!-- gemini-pr-review-bot -->';
// Check if review failed or errored - if so, don't post comment
const errorFile = path.join(outputDir, 'error.txt');
const verdictFile = path.join(outputDir, 'review_verdict.txt');
const successFile = path.join(outputDir, 'success_raw_output.txt');
// Skip posting if error occurred
if (fs.existsSync(errorFile)) {
console.log('Review encountered an error. Skipping comment post.');
return;
}
// Skip posting if review failed
if (fs.existsSync(verdictFile)) {
const verdict = fs.readFileSync(verdictFile, 'utf8').trim();
if (verdict.includes('FAILED')) {
console.log('Review verdict: FAILED. Skipping comment post.');
return;
}
}
// Skip if no success output
if (!fs.existsSync(successFile)) {
console.log('No review output found. Skipping comment post.');
return;
}
// Read review output
const reviewContent = fs.readFileSync(successFile, 'utf8');
// Prepare comment body
const commentBody = `${commentMarker}
## 🤖 Gemini PR Review
**Commit:** ${context.payload.pull_request.head.sha}
${reviewContent}
---
*Review generated at ${new Date().toISOString()}*`;
// Find existing comment
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
});
const existingComment = comments.find(comment =>
comment.body && comment.body.includes(commentMarker)
);
// Create or update comment
if (existingComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existingComment.id,
body: commentBody,
});
console.log('Updated existing PR comment');
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: commentBody,
});
console.log('Created new PR comment');
}