auto-merge-pr #132
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Auto-merge on Repository Dispatch | |
| on: | |
| repository_dispatch: | |
| types: [auto-merge-pr] | |
| jobs: | |
| auto-merge: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| pull-requests: write | |
| contents: write | |
| actions: write | |
| steps: | |
| - name: Get PR information | |
| id: pr-info | |
| uses: actions/github-script@v9 | |
| with: | |
| script: | | |
| const prNumber = context.payload.client_payload.pr_number; | |
| if (!prNumber) { | |
| core.setFailed('PR number not provided in client_payload'); | |
| return; | |
| } | |
| try { | |
| const { data: pr } = await github.rest.pulls.get({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| pull_number: prNumber | |
| }); | |
| core.setOutput('pr-number', pr.number); | |
| core.setOutput('pr-title', pr.title); | |
| core.setOutput('pr-head-branch', pr.head.ref); | |
| core.setOutput('pr-base-branch', pr.base.ref); | |
| console.log(`Processing PR #${pr.number}: ${pr.title}`); | |
| console.log(`From ${pr.head.ref} to ${pr.base.ref}`); | |
| // Check if PR is open | |
| if (pr.state !== 'open') { | |
| core.setFailed(`PR #${prNumber} is not open (state: ${pr.state})`); | |
| return; | |
| } | |
| // Check if PR is ready for merge | |
| if (!pr.mergeable) { | |
| core.setFailed(`PR #${prNumber} is not mergeable`); | |
| return; | |
| } | |
| if (pr.mergeable_state === 'blocked') { | |
| core.setFailed(`PR #${prNumber} is blocked from merging`); | |
| return; | |
| } | |
| // Check if CI checks are passing | |
| const { data: checks } = await github.rest.checks.listForRef({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| ref: pr.head.sha | |
| }); | |
| const requiredChecks = checks.check_runs.filter(check => | |
| check.conclusion === 'success' || check.status === 'completed' | |
| ); | |
| if (requiredChecks.length === 0) { | |
| core.setFailed(`No successful CI checks found for PR #${prNumber}`); | |
| return; | |
| } | |
| console.log(`PR #${prNumber} is ready for merge`); | |
| } catch (error) { | |
| console.error('Error getting PR information:', error.message); | |
| core.setFailed(`Failed to get PR #${prNumber} information: ${error.message}`); | |
| } | |
| - name: Merge PR | |
| uses: actions/github-script@v9 | |
| with: | |
| script: | | |
| const prNumber = ${{ steps.pr-info.outputs.pr-number }}; | |
| const prTitle = '${{ steps.pr-info.outputs.pr-title }}'; | |
| try { | |
| const result = await github.rest.pulls.merge({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| pull_number: prNumber, | |
| merge_method: 'merge', | |
| commit_title: `Merge PR #${prNumber}: ${prTitle}`, | |
| commit_message: 'Auto-merged by GitHub Actions workflow' | |
| }); | |
| console.log(`Successfully merged PR #${prNumber}`); | |
| console.log(`Merge SHA: ${result.data.sha}`); | |
| // Set output for next step | |
| core.setOutput('merge-sha', result.data.sha); | |
| } catch (error) { | |
| console.error('Failed to merge PR:', error.message); | |
| core.setFailed(`Failed to merge PR #${prNumber}: ${error.message}`); | |
| } | |
| - name: Notify about successful merge | |
| run: | | |
| echo "Successfully auto-merged PR #${{ steps.pr-info.outputs.pr-number }}" | |
| echo "Merge SHA: ${{ steps.merge-sha }}" | |
| echo "The merge commit will trigger the CI workflow on the main branch." | |
| - name: Trigger CD workflow | |
| uses: actions/github-script@v9 | |
| with: | |
| script: | | |
| const prNumber = ${{ steps.pr-info.outputs.pr-number }}; | |
| const mergeSha = '${{ steps.merge-sha }}'; | |
| try { | |
| await github.rest.repos.createDispatchEvent({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| event_type: 'PR-merged', | |
| client_payload: { | |
| pr_number: prNumber, | |
| merge_sha: mergeSha, | |
| merged_by: 'github-actions[bot]', | |
| merged_at: new Date().toISOString() | |
| } | |
| }); | |
| console.log('Repository dispatch event sent to trigger CD workflow'); | |
| console.log(`PR #${prNumber} was merged successfully`); | |
| } catch (error) { | |
| console.error('Failed to trigger CD workflow:', error.message); | |
| core.setFailed(`Failed to trigger CD workflow: ${error.message}`); | |
| } |