name: PR
on:
pull_request:
types: [opened, synchronize, reopened]
env:
CARGO_TERM_COLOR: always
jobs:
dispatch:
if: github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
command: ${{ steps.extract.outputs.command }}
steps:
- name: Extract command
id: extract
uses: actions/github-script@v7
with:
script: |
core.setOutput('command', 'review');
ci:
needs: dispatch
if: ${{ needs.dispatch.outputs.command == 'review' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Check formatting
run: cargo fmt --all -- --check
- name: Lint
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Run tests
run: cargo test --all-targets --all-features --verbose
e2e:
needs: [dispatch, ci]
if: ${{ needs.dispatch.outputs.command == 'review' && needs.ci.result == 'success' }}
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Build release artifacts
run: cargo build --release --verbose
review:
needs: [dispatch, ci, e2e]
if: needs.dispatch.outputs.command == 'review' && needs.ci.result == 'success' && needs.e2e.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 7
permissions:
contents: read
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Get PR diff and build prompt
id: prep
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_NUMBER=${{ github.event.pull_request.number || github.event.issue.number }}
echo "pr_number=${PR_NUMBER}" >> $GITHUB_OUTPUT
DIFF=$(gh pr diff "${PR_NUMBER}" --repo ${{ github.repository }})
PROMPT="You are an expert Rust code reviewer. Review the pull request diff below and provide a detailed review. Focus on: Rust safety issues, code quality, performance concerns, test coverage, and potential bugs. Return ONLY the review in markdown format.
=== DIFF ===
${DIFF}"
echo "prompt<<EOF_PROMPT" >> $GITHUB_OUTPUT
echo "${PROMPT}" >> $GITHUB_OUTPUT
echo "EOF_PROMPT" >> $GITHUB_OUTPUT
- name: Run Gemini review
id: gemini
uses: google-github-actions/run-gemini-cli@v0
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
gemini_model: gemini-2.5-flash-lite
prompt: ${{ steps.prep.outputs.prompt }}
- name: Post review comment
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REVIEW: ${{ steps.gemini.outputs.summary }}
run: |
PR_NUMBER=${{ steps.prep.outputs.pr_number }}
printf '%s' "${REVIEW}" > /tmp/review.txt
printf "## Gemini Code Review\n\n" | cat - /tmp/review.txt > /tmp/full_review.txt
gh pr comment "${PR_NUMBER}" --repo ${{ github.repository }} --body-file /tmp/full_review.txt
approve:
needs: [dispatch, ci, e2e, review]
if: >
needs.dispatch.outputs.command == 'review' &&
needs.ci.result == 'success' &&
needs.e2e.result == 'success' &&
needs.review.result == 'success'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Approve PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_NUMBER=${{ github.event.pull_request.number || github.event.issue.number }}
gh pr review "${PR_NUMBER}" --repo ${{ github.repository }} --approve