| 1 | name: Auto-merge on Docs Release |
| 2 | on: |
| 3 | repository_dispatch: |
| 4 | types: [<PRODUCT_RELEASE_TAG>] |
| 5 | |
| 6 | jobs: |
| 7 | merge-dependent-prs: |
| 8 | runs-on: ubuntu-latest |
| 9 | steps: |
| 10 | - name: Find and merge dependent PRs |
| 11 | uses: actions/github-script@v7 |
| 12 | with: |
| 13 | script: | |
| 14 | const version = context.payload.client_payload.version; |
| 15 | |
| 16 | // Find PRs with matching labels |
| 17 | const { data: prs } = await github.rest.pulls.list({ |
| 18 | owner: context.repo.owner, |
| 19 | repo: context.repo.repo, |
| 20 | state: 'open' |
| 21 | }); |
| 22 | |
| 23 | for (const pr of prs) { |
| 24 | const labels = pr.labels.map(l => l.name); |
| 25 | const hasLatestLabel = labels.includes('depends-on: <PRODUCT_RELEASE_TAG>@latest'); |
| 26 | const hasVersionLabel = labels.includes(`depends-on: <PRODUCT_RELEASE_TAG>@${version}`); |
| 27 | |
| 28 | if (hasLatestLabel || hasVersionLabel) { |
| 29 | // Check if PR is approved |
| 30 | const { data: reviews } = await github.rest.pulls.listReviews({ |
| 31 | owner: context.repo.owner, |
| 32 | repo: context.repo.repo, |
| 33 | pull_number: pr.number |
| 34 | }); |
| 35 | |
| 36 | const approved = reviews.some(r => r.state === 'APPROVED'); |
| 37 | |
| 38 | if (approved) { |
| 39 | await github.rest.pulls.merge({ |
| 40 | owner: context.repo.owner, |
| 41 | repo: context.repo.repo, |
| 42 | pull_number: pr.number, |
| 43 | merge_method: 'squash' |
| 44 | }); |
| 45 | |
| 46 | console.log(`Merged PR #${pr.number}: ${pr.title}`); |
| 47 | } |
| 48 | } |
| 49 | } |