-
Notifications
You must be signed in to change notification settings - Fork 79
165 lines (139 loc) · 5.58 KB
/
gemini-cli-review.yml
File metadata and controls
165 lines (139 loc) · 5.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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');
}