|
8 | 8 | types: [published] |
9 | 9 |
|
10 | 10 | permissions: |
11 | | - id-token: write # Required for OIDC |
12 | | - contents: read |
| 11 | + id-token: write # Required for OIDC |
| 12 | + contents: read |
13 | 13 |
|
14 | 14 | jobs: |
15 | 15 | build: |
|
34 | 34 | registry-url: https://registry.npmjs.org/ |
35 | 35 | - run: npm publish |
36 | 36 |
|
| 37 | + - name: Close release milestone if empty |
| 38 | + env: |
| 39 | + GH_TOKEN: ${{ github.token }} |
| 40 | + REPO: ${{ github.repository }} |
| 41 | + RELEASE_TAG: ${{ github.event.release.tag_name }} |
| 42 | + run: | |
| 43 | + set -euo pipefail |
| 44 | +
|
| 45 | + owner="${REPO%%/*}" |
| 46 | + repo="${REPO##*/}" |
| 47 | +
|
| 48 | + milestone_title="${RELEASE_TAG#v}" |
| 49 | +
|
| 50 | + if [ -z "${milestone_title}" ]; then |
| 51 | + echo "Could not parse milestone version from release tag (tag=${RELEASE_TAG})." |
| 52 | + exit 0 |
| 53 | + fi |
| 54 | +
|
| 55 | + milestones_json="$(gh api "repos/${owner}/${repo}/milestones?state=open&per_page=100")" |
| 56 | +
|
| 57 | + milestone_number="$(echo "$milestones_json" | jq -r \ |
| 58 | + --arg milestone_title "$milestone_title" \ |
| 59 | + '.[] | select(.title == $milestone_title) | .number' \ |
| 60 | + | head -n1)" |
| 61 | +
|
| 62 | + if [ -z "${milestone_number}" ] || [ "${milestone_number}" = "null" ]; then |
| 63 | + echo "No matching open milestone found for parsed version '${milestone_title}'." |
| 64 | + exit 0 |
| 65 | + fi |
| 66 | +
|
| 67 | + milestone="$(gh api "repos/${owner}/${repo}/milestones/${milestone_number}")" |
| 68 | + state="$(echo "$milestone" | jq -r '.state')" |
| 69 | + open_issues="$(echo "$milestone" | jq -r '.open_issues')" |
| 70 | + title="$(echo "$milestone" | jq -r '.title')" |
| 71 | +
|
| 72 | + echo "Matched milestone #${milestone_number} '${title}' (state=${state}, open_issues=${open_issues})." |
| 73 | +
|
| 74 | + if [ "$state" != "open" ]; then |
| 75 | + echo "Milestone is already closed. Nothing to do." |
| 76 | + exit 0 |
| 77 | + fi |
| 78 | +
|
| 79 | + if [ "$open_issues" -ne 0 ]; then |
| 80 | + echo "Milestone has open items. Skipping close." |
| 81 | + exit 0 |
| 82 | + fi |
| 83 | +
|
| 84 | + gh api -X PATCH "repos/${owner}/${repo}/milestones/${milestone_number}" -f state="closed" >/dev/null |
| 85 | + echo "Milestone #${milestone_number} closed." |
0 commit comments