Skip to content

Implement diamond pattern for CV Strategy #234

Implement diamond pattern for CV Strategy

Implement diamond pattern for CV Strategy #234

name: "Code Review by Gemini AI"
on:
issue_comment:
types:
- created
- updated
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: read
steps:
- uses: actions/checkout@v3
- name: Only PR comments
if: ${{ !github.event.issue.pull_request || !contains(github.event.comment.body,'!ai') }}
run: exit 1
- name: Put a reaction to the comment
run: gh api graphql --silent --raw-field query="mutation AddReaction {addReaction(input:{subjectId:\"$NODE_ID\",content:EYES}){reaction{content}subject{id}}}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_ID: ${{ github.event.comment.node_id }}
- name: Fetch filtered PR diff (only .ts, .tsx, .sol files)
id: pr-diff
uses: actions/github-script@v6
with:
script: |
const pr_number = context.payload.issue.number;
const pr = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr_number
});
const { data: diff } = await github.request('GET /repos/{owner}/{repo}/pulls/{pull_number}', {
headers: {
accept: 'application/vnd.github.v3.diff'
},
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr_number
});
// Initialize variables to store filtered diff and a flag for capturing lines
let filteredDiff = '';
let capture = false;
// Iterate over each line in the diff
diff.split('\n').forEach(line => {
// Check if the line is a diff line for the relevant file types
if (line.startsWith('diff --git')) {
capture = line.endsWith('.ts') || line.endsWith('.tsx') || line.endsWith('.sol');
}
// If capturing, append the current line to the filtered diff
if (capture) {
filteredDiff += line + '\n';
}
});
// Get the head commit SHA
const headSha = pr.data.head.sha;
// Set outputs for the filtered diff and head SHA
core.setOutput("diff", filteredDiff);
core.setOutput("headSha", headSha);
- name: Log filtered diff to file
id: log-diff
continue-on-error: true
run: |
echo "${{ steps.pr-diff.outputs.diff }}"
- uses: rubensflinco/[email protected]
name: "Code Review by Gemini AI"
id: review
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
github_repository: ${{ github.repository }}
github_pull_request_number: ${{ github.event.issue.number }}
git_commit_hash: ${{ steps.pr-diff.outputs.headSha }}
model: "gemini-1.5-pro-latest"
pull_request_diff: |-
${{ steps.pr-diff.outputs.diff }}
pull_request_chunk_size: "5000"
extra_prompt: |-
Make a pull request review in regards of the added and removed code.
Start with a summary of the changes and then list detail the review and suggestions.
Focus on code quality, security, performance, best practices and potential mistakes.
Never ask to provide more code and only review the code you received even if its partial.
When a line start with a minus (`-`) it means that the line was removed, when it starts with plus (`+`) it means that the line was added.
log_level: "DEBUG"
- name: Add thumbs down reaction if something went wrong
if: steps.review.outcome == 'failure'
run: gh api graphql --silent --raw-field query="mutation AddReaction {addReaction(input:{subjectId:\"$NODE_ID\",content:THUMBS_DOWN}){reaction{content}subject{id}}}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_ID: ${{ github.event.comment.node_id }}
- name: Get Gemini step log
if: steps.review.outcome == 'failure'
id: get-gemini-log
run: |
echo "gemini_log<<EOF" >> $GITHUB_OUTPUT
gh run view ${{ steps.review.outputs.run_id }} --log >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Add comment with log
if: failure()
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Gemini Code Review encountered an error. Here is the step log:\n\n```\n${{ steps.get-gemini-log.outputs.gemini_log }}\n```'
});