From b22e817a7e5ffebdb28154554b17e19eab942e4f Mon Sep 17 00:00:00 2001 From: kpj2006 <24ucs074@lnmiit.ac.in> Date: Sun, 29 Mar 2026 11:42:55 +0530 Subject: [PATCH 1/2] Refactor CodeRabbit approval workflow to use pull_request_target and enhance review handling --- .github/workflows/coderabbit-approval.yml | 47 +++++++++++++++-------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/.github/workflows/coderabbit-approval.yml b/.github/workflows/coderabbit-approval.yml index 1d4f5f0..c509a4a 100644 --- a/.github/workflows/coderabbit-approval.yml +++ b/.github/workflows/coderabbit-approval.yml @@ -1,8 +1,8 @@ name: CodeRabbit Approval Handler on: - pull_request_review: - types: [submitted] + pull_request_target: + types: [opened, reopened, synchronize, ready_for_review] permissions: contents: read @@ -18,20 +18,35 @@ jobs: id: check-approval uses: actions/github-script@v7 with: - github-token: ${{ secrets.EXTERNAL_LABELLER_TOKEN || secrets.GITHUB_TOKEN }} + github-token: ${{ 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'; + + // API-only flow: do not checkout or execute PR code. + const { data: reviews } = await github.rest.pulls.listReviews({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + per_page: 100 + }); + + const isCodeRabbitReview = (review) => { + const login = review.user?.login || ''; + return login === 'coderabbitai' || login === 'coderabbitai[bot]'; + }; + + const codeRabbitReviews = reviews.filter(isCodeRabbitReview); + const latestCodeRabbitReview = codeRabbitReviews + .sort((a, b) => new Date(a.submitted_at || 0) - new Date(b.submitted_at || 0)) + .at(-1); + + const isCodeRabbit = Boolean(latestCodeRabbitReview); + const isApproved = latestCodeRabbitReview?.state === 'APPROVED'; + + console.log(`CodeRabbit reviews found: ${codeRabbitReviews.length}`); + console.log(`Latest CodeRabbit review state: ${latestCodeRabbitReview?.state || 'none'}`); core.setOutput('is_coderabbit_approved', isCodeRabbit && isApproved); @@ -46,7 +61,7 @@ jobs: if: steps.check-approval.outputs.is_coderabbit_approved == 'true' uses: actions/github-script@v7 with: - github-token: ${{ secrets.EXTERNAL_LABELLER_TOKEN || secrets.GITHUB_TOKEN }} + github-token: ${{ github.token }} script: | const prNumber = context.payload.pull_request.number; const labelToRemove = 'pending-coderabbit-review'; @@ -91,7 +106,7 @@ jobs: if: steps.check-approval.outputs.is_coderabbit_approved == 'true' uses: actions/github-script@v7 with: - github-token: ${{ secrets.EXTERNAL_LABELLER_TOKEN || secrets.GITHUB_TOKEN }} + github-token: ${{ github.token }} script: | const prNumber = context.payload.pull_request.number; @@ -115,7 +130,7 @@ jobs: if: steps.check-approval.outputs.is_coderabbit_approved == 'true' uses: actions/github-script@v7 with: - github-token: ${{ secrets.EXTERNAL_LABELLER_TOKEN || secrets.GITHUB_TOKEN }} + github-token: ${{ github.token }} script: | const prNumber = context.payload.pull_request.number; const labelWasPresent = '${{ steps.remove-label.outputs.label_was_present }}' === 'true'; From 721ca4801531be05b9d23fee49faa5893ac002f6 Mon Sep 17 00:00:00 2001 From: kpj2006 <24ucs074@lnmiit.ac.in> Date: Sun, 29 Mar 2026 12:25:55 +0530 Subject: [PATCH 2/2] Refactor CodeRabbit approval workflow to dispatch events on review approval and streamline label handling --- .../coderabbit-approval-dispatch.yml | 101 ++++++++++++ .github/workflows/coderabbit-approval.yml | 152 +++--------------- 2 files changed, 127 insertions(+), 126 deletions(-) create mode 100644 .github/workflows/coderabbit-approval-dispatch.yml diff --git a/.github/workflows/coderabbit-approval-dispatch.yml b/.github/workflows/coderabbit-approval-dispatch.yml new file mode 100644 index 0000000..ec86a46 --- /dev/null +++ b/.github/workflows/coderabbit-approval-dispatch.yml @@ -0,0 +1,101 @@ +name: CodeRabbit Approval Label Applier + +on: + repository_dispatch: + types: [coderabbit_approved] + +permissions: + pull-requests: write + issues: write + +jobs: + apply-labels: + if: ${{ github.repository_owner == 'AOSSIE-Org' }} + runs-on: ubuntu-latest + steps: + - name: Remove pending CodeRabbit review label + id: remove-label + uses: actions/github-script@v7 + with: + github-token: ${{ github.token }} + script: | + const prNumber = context.payload.client_payload?.pr_number; + const labelToRemove = 'pending-coderabbit-review'; + + if (!prNumber) { + core.setFailed('Missing pr_number in repository_dispatch payload.'); + return; + } + + try { + 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) { + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + name: labelToRemove + }); + + console.log(`✅ Removed '${labelToRemove}' from PR #${prNumber}`); + core.setOutput('label_was_present', 'true'); + } else { + console.log(`ℹ️ '${labelToRemove}' not present on PR #${prNumber}`); + core.setOutput('label_was_present', 'false'); + } + } catch (error) { + if (error.status === 404) { + console.log(`ℹ️ '${labelToRemove}' not found on PR #${prNumber}`); + core.setOutput('label_was_present', 'false'); + } else { + throw error; + } + } + + - name: Add CodeRabbit approved label + uses: actions/github-script@v7 + with: + github-token: ${{ github.token }} + script: | + const prNumber = context.payload.client_payload?.pr_number; + + if (!prNumber) { + core.setFailed('Missing pr_number in repository_dispatch payload.'); + return; + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['coderabbit-approved'] + }); + + console.log(`✅ Added 'coderabbit-approved' to PR #${prNumber}`); + + - name: Summary + uses: actions/github-script@v7 + with: + github-token: ${{ github.token }} + script: | + const prNumber = context.payload.client_payload?.pr_number; + const labelWasPresent = '${{ steps.remove-label.outputs.label_was_present }}' === 'true'; + + console.log('='.repeat(50)); + console.log('CodeRabbit Approval Label Applier Complete'); + console.log('='.repeat(50)); + console.log(`✅ Processed PR #${prNumber}`); + 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/coderabbit-approval.yml b/.github/workflows/coderabbit-approval.yml index c509a4a..e00a03b 100644 --- a/.github/workflows/coderabbit-approval.yml +++ b/.github/workflows/coderabbit-approval.yml @@ -1,148 +1,48 @@ name: CodeRabbit Approval Handler on: - pull_request_target: - types: [opened, reopened, synchronize, ready_for_review] + pull_request_review: + types: [submitted] permissions: - contents: read - pull-requests: write - issues: write + contents: write jobs: - remove-pending-label: + dispatch-coderabbit-approval: if: ${{ github.repository_owner == 'AOSSIE-Org' }} runs-on: ubuntu-latest steps: - - name: Check if CodeRabbit approved - id: check-approval + - name: Dispatch event when CodeRabbit approves uses: actions/github-script@v7 with: github-token: ${{ github.token }} script: | const prNumber = context.payload.pull_request.number; + const review = context.payload.review; + const reviewer = review?.user?.login || ''; + const state = review?.state || ''; console.log(`PR number: ${prNumber}`); + console.log(`Reviewer: ${reviewer}`); + console.log(`Review state: ${state}`); - // API-only flow: do not checkout or execute PR code. - const { data: reviews } = await github.rest.pulls.listReviews({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - per_page: 100 - }); - - const isCodeRabbitReview = (review) => { - const login = review.user?.login || ''; - return login === 'coderabbitai' || login === 'coderabbitai[bot]'; - }; + const isCodeRabbit = reviewer === 'coderabbitai' || reviewer === 'coderabbitai[bot]'; + const isApproved = state === 'approved'; - const codeRabbitReviews = reviews.filter(isCodeRabbitReview); - const latestCodeRabbitReview = codeRabbitReviews - .sort((a, b) => new Date(a.submitted_at || 0) - new Date(b.submitted_at || 0)) - .at(-1); - - const isCodeRabbit = Boolean(latestCodeRabbitReview); - const isApproved = latestCodeRabbitReview?.state === 'APPROVED'; - - console.log(`CodeRabbit reviews found: ${codeRabbitReviews.length}`); - console.log(`Latest CodeRabbit review state: ${latestCodeRabbitReview?.state || 'none'}`); - - 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: ${{ 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; - } + if (!isCodeRabbit || !isApproved) { + console.log('Not a CodeRabbit approval review. No dispatch will be sent.'); + return; } - - name: Add CodeRabbit approved label - if: steps.check-approval.outputs.is_coderabbit_approved == 'true' - uses: actions/github-script@v7 - with: - github-token: ${{ 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; - } + await github.rest.repos.createDispatchEvent({ + owner: context.repo.owner, + repo: context.repo.repo, + event_type: 'coderabbit_approved', + client_payload: { + pr_number: prNumber, + reviewer, + review_state: state + } + }); - - name: Summary - if: steps.check-approval.outputs.is_coderabbit_approved == 'true' - uses: actions/github-script@v7 - with: - github-token: ${{ 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)); + console.log(`✅ Dispatched 'coderabbit_approved' event for PR #${prNumber}`);