From a9c23a9dc05d94ea7ecbcc409282887b0ac5f018 Mon Sep 17 00:00:00 2001 From: Malcolm Daigle Date: Tue, 17 Mar 2026 11:49:36 -0700 Subject: [PATCH 1/2] Validate milestone assignment on pull requests. --- .github/workflows/check-milestone.yml | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/check-milestone.yml diff --git a/.github/workflows/check-milestone.yml b/.github/workflows/check-milestone.yml new file mode 100644 index 0000000000..61afa4def2 --- /dev/null +++ b/.github/workflows/check-milestone.yml @@ -0,0 +1,31 @@ +name: Check Milestone + +on: + pull_request: + types: [opened, edited, synchronize, milestoned, demilestoned] + +jobs: + check-milestone: + name: Validate milestone + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - name: Check milestone is set and open + env: + MILESTONE: ${{ toJson(github.event.pull_request.milestone) }} + run: | + if [ "$MILESTONE" = "null" ] || [ -z "$MILESTONE" ]; then + echo "::error::This PR does not have a milestone set. Please assign a milestone before merging." + exit 1 + fi + + STATE=$(echo "$MILESTONE" | jq -r '.state') + TITLE=$(echo "$MILESTONE" | jq -r '.title') + + if [ "$STATE" != "open" ]; then + echo "::error::Milestone '$TITLE' is $STATE. Please assign an open milestone." + exit 1 + fi + + echo "Milestone '$TITLE' is set and open." From 6dbc593bfd12bbe68a2b6f0d2a18157ca267dcd7 Mon Sep 17 00:00:00 2001 From: Malcolm Daigle Date: Tue, 17 Mar 2026 11:57:54 -0700 Subject: [PATCH 2/2] Update json checks to avoid jq. --- .github/workflows/check-milestone.yml | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/.github/workflows/check-milestone.yml b/.github/workflows/check-milestone.yml index 61afa4def2..da4681fd7b 100644 --- a/.github/workflows/check-milestone.yml +++ b/.github/workflows/check-milestone.yml @@ -11,21 +11,14 @@ jobs: permissions: pull-requests: read steps: - - name: Check milestone is set and open - env: - MILESTONE: ${{ toJson(github.event.pull_request.milestone) }} + - name: Check milestone is set + if: github.event.pull_request.milestone == null run: | - if [ "$MILESTONE" = "null" ] || [ -z "$MILESTONE" ]; then - echo "::error::This PR does not have a milestone set. Please assign a milestone before merging." - exit 1 - fi + echo "::error::This PR does not have a milestone set. Please assign a milestone before merging." + exit 1 - STATE=$(echo "$MILESTONE" | jq -r '.state') - TITLE=$(echo "$MILESTONE" | jq -r '.title') - - if [ "$STATE" != "open" ]; then - echo "::error::Milestone '$TITLE' is $STATE. Please assign an open milestone." - exit 1 - fi - - echo "Milestone '$TITLE' is set and open." + - name: Check milestone is open + if: github.event.pull_request.milestone != null && github.event.pull_request.milestone.state != 'open' + run: | + echo "::error::Milestone '${{ github.event.pull_request.milestone.title }}' is ${{ github.event.pull_request.milestone.state }}. Please assign an open milestone." + exit 1