| name: Notify Reverted PR |
| |
| on: |
| push: |
| branches: [master] |
| |
| permissions: |
| contents: read |
| |
| jobs: |
| notify-revert: |
| if: github.repository == 'bazelbuild/bazel' |
| runs-on: ubuntu-latest |
| permissions: |
| contents: read |
| issues: write |
| steps: |
| - name: Harden Runner |
| uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0 |
| with: |
| egress-policy: audit |
| |
| - name: Notify PR author on revert |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 |
| with: |
| script: | |
| const { owner, repo } = context.repo; |
| for (const commit of context.payload.commits ?? []) { |
| const match = commit.message.match(/^Automated rollback of commit ([0-9a-f]{40})/); |
| if (!match) continue; |
| const rolledBackSha = match[1]; |
| try { |
| // Copybara closes (rather than merges) PRs, so GitHub does not associate |
| // the commit with its PR. Follow the trailer and confirm this commit closed it. |
| const { data: original } = await github.rest.repos.getCommit({ owner, repo, ref: rolledBackSha }); |
| const closes = [...original.commit.message.matchAll(/^Closes #(\d+)\.$/gm)]; |
| if (!closes.length) continue; |
| const issue_number = Number(closes.at(-1)[1]); |
| const events = await github.paginate(github.rest.issues.listEvents, { owner, repo, issue_number, per_page: 100 }); |
| if (!events.some((e) => e.event === 'closed' && e.commit_id === rolledBackSha)) continue; |
| |
| const { data: pr } = await github.rest.issues.get({ owner, repo, issue_number }); |
| await github.rest.issues.createComment({ |
| owner, |
| repo, |
| issue_number, |
| body: [ |
| `⚠️ **Notice**: Commit ${rolledBackSha}, which closed this pull request, was rolled back on \`master\` in commit ${commit.id}.`, |
| '', |
| 'Please check the rollback commit for details.', |
| '', |
| `cc @${pr.user.login}`, |
| ].join('\n'), |
| }); |
| } catch (e) { |
| core.warning(`Could not notify for rollback ${commit.id}: ${e.message}`); |
| } |
| } |