check-merge.yml 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. name: Check mergeability
  2. on: pull_request
  3. permissions:
  4. pull-requests: write
  5. checks: write
  6. statuses: write
  7. jobs:
  8. check:
  9. runs-on: ubuntu-latest
  10. steps:
  11. - name: Check if there is already a block on this PR
  12. id: blocked
  13. uses: actions/github-script@v7
  14. env:
  15. issue_number: ${{ github.event.number }}
  16. with:
  17. script: |
  18. const { data: reviews } = await github.rest.pulls.listReviews({
  19. owner: context.repo.owner,
  20. repo: context.repo.repo,
  21. pull_number: process.env.issue_number,
  22. });
  23. for (const review of reviews) {
  24. if (review.user.login === 'github-actions[bot]' && review.state === 'CHANGES_REQUESTED') {
  25. return 'true'
  26. }
  27. }
  28. return 'false'
  29. result-encoding: string
  30. - uses: actions/checkout@v4
  31. if: steps.blocked.outputs.result != 'true'
  32. with:
  33. fetch-depth: 0
  34. - name: Get changed files in the .changeset folder
  35. id: changed-files
  36. uses: tj-actions/changed-files@v42
  37. if: steps.blocked.outputs.result != 'true'
  38. with:
  39. files: |
  40. .changeset/**/*.md
  41. - name: Check if any changesets contain minor or major changes
  42. id: check
  43. if: steps.blocked.outputs.result != 'true'
  44. run: |
  45. echo "Checking for changesets marked as minor or major"
  46. echo "found=false" >> $GITHUB_OUTPUT
  47. regex="[\"']astro[\"']: (minor|major)"
  48. for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
  49. if [[ $(cat $file) =~ $regex ]]; then
  50. version="${BASH_REMATCH[1]}"
  51. echo "version=$version" >> $GITHUB_OUTPUT
  52. echo "found=true" >> $GITHUB_OUTPUT
  53. echo "$file has a $version release tag"
  54. fi
  55. done
  56. - name: Add label
  57. uses: actions/github-script@v7
  58. if: steps.check.outputs.found == 'true'
  59. env:
  60. issue_number: ${{ github.event.number }}
  61. with:
  62. script: |
  63. github.rest.issues.addLabels({
  64. issue_number: process.env.issue_number,
  65. owner: context.repo.owner,
  66. repo: context.repo.repo,
  67. labels: ['semver: ${{ steps.check.outputs.version }}']
  68. });
  69. - name: Change PR Status
  70. uses: actions/github-script@v7
  71. if: steps.check.outputs.found == 'true'
  72. env:
  73. issue_number: ${{ github.event.number }}
  74. with:
  75. script: |
  76. github.rest.pulls.createReview({
  77. owner: context.repo.owner,
  78. repo: context.repo.repo,
  79. pull_number: process.env.issue_number,
  80. event: 'REQUEST_CHANGES',
  81. body: 'This PR is blocked because it contains a `${{ steps.check.outputs.version }}` changeset. A reviewer will merge this at the next release if approved.'
  82. });