Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 80 additions & 26 deletions .github/workflows/code-review.yml
Original file line number Diff line number Diff line change
@@ -1,36 +1,90 @@
name: AI Code Review

on:
pull_request:
types: [opened, synchronize, reopened]
pull_request:
types: [opened, synchronize, reopened]

# The bot posts review comments, so we need these:
permissions:
contents: read
pull-requests: write
contents: read
pull-requests: write

concurrency:
group: ai-review-${{ github.event.pull_request.head.sha }}
cancel-in-progress: true
group: ai-review-${{ github.event.pull_request.head.sha }}
cancel-in-progress: true

jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- name: Call AI Review Bot (base → head)
env:
REVIEW_API: https://review-bot.codebucketstage.online/review
run: |
payload=$(jq -n \
--arg owner "${{ github.event.pull_request.base.repo.owner.login }}" \
--arg repo "${{ github.event.pull_request.base.repo.name }}" \
--argjson pr ${{ github.event.pull_request.number }} \
--arg baseSha "${{ github.event.pull_request.base.sha }}" \
--arg headSha "${{ github.event.pull_request.head.sha }}" \
'{owner: $owner, repo: $repo, prNumber: $pr, baseSha: $baseSha, headSha: $headSha}')

echo "Payload: $payload"

curl -sS --fail -X POST "$REVIEW_API" \
-H "Content-Type: application/json" \
-d "$payload"
ai-review:
runs-on: ubuntu-latest
steps:
- name: Enqueue AI review
id: enqueue
env:
REVIEW_API: https://review-bot.codebucketstage.online
run: |
set -euo pipefail

if [ -z "${REVIEW_API:-}" ]; then
echo "REVIEW_API secret is not set."
exit 1
fi

payload=$(jq -n \
--arg owner "${{ github.event.pull_request.base.repo.owner.login }}" \
--arg repo "${{ github.event.pull_request.base.repo.name }}" \
--argjson pr ${{ github.event.pull_request.number }} \
--arg baseSha "${{ github.event.pull_request.base.sha }}" \
--arg headSha "${{ github.event.pull_request.head.sha }}" \
'{owner: $owner, repo: $repo, prNumber: $pr, baseSha: $baseSha, headSha: $headSha}')

echo "Payload: $payload"

response=$(curl -sSf -X POST "$REVIEW_API/review-queue" \
-H "Content-Type: application/json" \
-d "$payload")

echo "Enqueue response: $response"

jobId=$(echo "$response" | jq -er '.jobId')

echo "✅ Enqueued job: $jobId"
echo "job-id=$jobId" >> "$GITHUB_OUTPUT"

- name: Wait for AI reviewer to finish
env:
REVIEW_API: https://review-bot.codebucketstage.online
JOB_ID: ${{ steps.enqueue.outputs.job-id }}
run: |
set -euo pipefail

if [ -z "${JOB_ID:-}" ] || [ -z "${REVIEW_API:-}" ]; then
echo "Missing JOB_ID or REVIEW_API."
exit 1
fi

for i in $(seq 1 60); do
response=$(curl -sSf "$REVIEW_API/status/$JOB_ID")
echo "[$i] Status response: $response"

state=$(echo "$response" | jq -r '.state // empty')

if [ -z "$state" ]; then
echo "State missing in response, retrying..."
sleep 10
continue
fi

if [ "$state" = "completed" ]; then
echo "✅ AI review finished successfully."
exit 0
elif [ "$state" = "failed" ]; then
message=$(echo "$response" | jq -r '.message // "Unknown error"')
echo "❌ AI review failed: $message"
exit 1
fi

sleep 10
done

echo "⚠️ Timed out waiting for AI review job."
exit 1