diff --git a/.github/workflows/code-review.yml b/.github/workflows/code-review.yml index cdeb79f..d4e3963 100644 --- a/.github/workflows/code-review.yml +++ b/.github/workflows/code-review.yml @@ -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