diff --git a/.github/workflows/coderabbit-approval.yml b/.github/workflows/coderabbit-approval.yml new file mode 100644 index 0000000..9efc338 --- /dev/null +++ b/.github/workflows/coderabbit-approval.yml @@ -0,0 +1,133 @@ +name: CodeRabbit Approval Handler + +on: + pull_request_review: + types: [submitted] + +permissions: + contents: read + pull-requests: write + issues: write + +jobs: + remove-pending-label: + if: ${{ github.repository_owner == 'AOSSIE-Org' }} + runs-on: ubuntu-latest + steps: + - name: Check if CodeRabbit approved + id: check-approval + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const review = context.payload.review; + const reviewer = review.user.login; + const state = review.state; + const prNumber = context.payload.pull_request.number; + + console.log(`Reviewer: ${reviewer}`); + console.log(`Review state: ${state}`); + console.log(`PR number: ${prNumber}`); + + // Check if the reviewer is CodeRabbit and the review is approved + const isCodeRabbit = reviewer === 'coderabbitai' || reviewer === 'coderabbitai[bot]'; + const isApproved = state === 'approved'; + + core.setOutput('is_coderabbit_approved', isCodeRabbit && isApproved); + + return { + isCodeRabbit, + isApproved, + shouldRemoveLabel: isCodeRabbit && isApproved + }; + + - name: Remove pending CodeRabbit review label + id: remove-label + if: steps.check-approval.outputs.is_coderabbit_approved == 'true' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.payload.pull_request.number; + const labelToRemove = 'pending-coderabbit-review'; + + try { + // Check if label exists on the PR + const pr = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber + }); + + const hasLabel = pr.data.labels.some(label => label.name === labelToRemove); + + if (hasLabel) { + console.log(`Removing label: ${labelToRemove}`); + + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + name: labelToRemove + }); + + console.log(`✅ Successfully removed '${labelToRemove}' label from PR #${prNumber}`); + core.setOutput('label_was_present', 'true'); + } else { + console.log(`Label '${labelToRemove}' not found on PR #${prNumber}`); + core.setOutput('label_was_present', 'false'); + } + } catch (error) { + if (error.status === 404) { + console.log(`Label '${labelToRemove}' does not exist on PR #${prNumber}`); + core.setOutput('label_was_present', 'false'); + } else { + console.error(`Error removing label: ${error.message}`); + throw error; + } + } + + - name: Add CodeRabbit approved label + if: steps.check-approval.outputs.is_coderabbit_approved == 'true' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.payload.pull_request.number; + + try { + console.log('Adding coderabbit-approved label'); + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['coderabbit-approved'] + }); + + console.log(`✅ Added 'coderabbit-approved' label to PR #${prNumber}`); + } catch (error) { + console.error(`Error adding label: ${error.message}`); + throw error; + } + + - name: Summary + if: steps.check-approval.outputs.is_coderabbit_approved == 'true' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.payload.pull_request.number; + const labelWasPresent = '${{ steps.remove-label.outputs.label_was_present }}' === 'true'; + + console.log('='.repeat(50)); + console.log('CodeRabbit Approval Handler Complete'); + console.log('='.repeat(50)); + console.log(`✅ PR #${prNumber} has been approved by CodeRabbit`); + if (labelWasPresent) { + console.log(`✅ Removed 'pending-coderabbit-review' label`); + } else { + console.log(`ℹ️ 'pending-coderabbit-review' label was not present`); + } + console.log(`✅ Added 'coderabbit-approved' label`); + console.log('='.repeat(50)); diff --git a/.github/workflows/sync-pr-labels.yml b/.github/workflows/sync-pr-labels.yml index 8e137cf..9960e77 100644 --- a/.github/workflows/sync-pr-labels.yml +++ b/.github/workflows/sync-pr-labels.yml @@ -315,6 +315,24 @@ jobs: console.log(`Error applying contributor labels: ${error.message}`); } + # STEP 5: CodeRabbit review status + - name: Add pending CodeRabbit review label + if: github.event.action != 'edited' + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.payload.pull_request.number; + + console.log('Adding pending-coderabbit-review label'); + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['pending-coderabbit-review'] + }); + # Summary step - name: Label sync summary uses: actions/github-script@v7