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 1d4f5f0..e00a03b 100644 --- a/.github/workflows/coderabbit-approval.yml +++ b/.github/workflows/coderabbit-approval.yml @@ -5,129 +5,44 @@ on: 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: ${{ 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; - + 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}`); - 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.EXTERNAL_LABELLER_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; - } + 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: ${{ secrets.EXTERNAL_LABELLER_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; - } + 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: ${{ secrets.EXTERNAL_LABELLER_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)); + console.log(`✅ Dispatched 'coderabbit_approved' event for PR #${prNumber}`);