Gemini review for PR 5558 - 943970977cd8d83b42cc189f3eda7e5f486ce071 #19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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'); | |
| } | |