This is an automated email from the ASF dual-hosted git repository.

kgyrtkirk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 35caa6254b2 Update milestone on PR close and ensure they are visible 
for the originally desired milestone (#18935)
35caa6254b2 is described below

commit 35caa6254b2b84baa44bbba283e2e8388e9b1d1e
Author: Zoltan Haindrich <[email protected]>
AuthorDate: Wed Jan 21 19:38:33 2026 +0100

    Update milestone on PR close and ensure they are visible for the originally 
desired milestone (#18935)
---
 .github/scripts/auto-add-milestone.sh | 86 +++++++++++++++++++++++++++++++++++
 .github/scripts/backport-pr.sh        | 43 ++++++++++++++++++
 .github/workflows/backport.yml        | 71 +++++++++++++++++++++++++++++
 .github/workflows/pr-merged.yml       | 47 +++++++++++++++++++
 4 files changed, 247 insertions(+)

diff --git a/.github/scripts/auto-add-milestone.sh 
b/.github/scripts/auto-add-milestone.sh
new file mode 100755
index 00000000000..7b1dacdc2a9
--- /dev/null
+++ b/.github/scripts/auto-add-milestone.sh
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+get_milestone_number() {
+  local milestone_title="$1"
+  local number=$(gh api "repos/$REPOSITORY/milestones" --jq ".[] | 
select(.title==\"$milestone_title\") | .number")
+
+  if [ -z "$number" ]; then
+    echo "Creating milestone: $milestone_title"
+    number=$(gh api "repos/$REPOSITORY/milestones" -f title="$milestone_title" 
--jq '.number')
+  fi
+
+  echo "$number"
+}
+
+create_backport_issue() {
+  local pr_number="$1"
+  local pr_title="$2"
+  local target_milestone="$3"
+
+  local milestone_number=$(get_milestone_number "$target_milestone")
+  local message="Backport #$pr_number to release branch for version 
$target_milestone"
+  local note="Add the \`approved\` label to start the automatic backport 
process."
+  local body=$(jq -n --arg source_pr "$pr_number" --arg target_version 
"$target_milestone" --arg message "$message" --arg note "$note" '$ARGS.named')
+
+  gh api "repos/$REPOSITORY/issues" \
+    -f title="[$target_milestone] $pr_title" \
+    -f body="$body" \
+    -f milestone="$milestone_number" \
+    -f labels[]="backport" \
+    --jq '.number'
+}
+
+if [ "$#" -ne 2 ]; then
+  echo "Usage: $0 <pr_number> <repository>"
+  echo "Example: $0 12345 apache/druid"
+  exit 1
+fi
+
+PR_NUMBER="$1"
+REPOSITORY="$2"
+
+VERSION=$(xmllint --xpath 
"/*[local-name()='project']/*[local-name()='version']/text()" pom.xml | sed 
's/-SNAPSHOT//')
+
+if [ -z "$VERSION" ]; then
+  echo "Error: Could not extract version from pom.xml"
+  exit 1
+fi
+
+echo "Extracted version: $VERSION"
+
+EXISTING_MILESTONE=$(gh api "repos/$REPOSITORY/issues/$PR_NUMBER" --jq 
'.milestone.title // empty')
+
+if [ -n "$EXISTING_MILESTONE" ] && [ "$EXISTING_MILESTONE" != "$VERSION" ]; 
then
+  echo "PR #$PR_NUMBER has milestone $EXISTING_MILESTONE, but should be 
$VERSION"
+
+  PR_TITLE=$(gh api "repos/$REPOSITORY/issues/$PR_NUMBER" --jq '.title')
+  BACKPORT_ISSUE=$(create_backport_issue "$PR_NUMBER" "$PR_TITLE" 
"$EXISTING_MILESTONE")
+
+  echo "Created backport issue #$BACKPORT_ISSUE for milestone 
$EXISTING_MILESTONE"
+elif [ -n "$EXISTING_MILESTONE" ]; then
+  echo "PR #$PR_NUMBER already has correct milestone: $EXISTING_MILESTONE"
+  exit 0
+fi
+
+MILESTONE_NUMBER=$(get_milestone_number "$VERSION")
+
+echo "Adding PR #$PR_NUMBER to milestone $VERSION"
+gh api "repos/$REPOSITORY/issues/$PR_NUMBER" -f milestone="$MILESTONE_NUMBER" 
-X PATCH
+echo "Successfully added PR #$PR_NUMBER to milestone $VERSION"
diff --git a/.github/scripts/backport-pr.sh b/.github/scripts/backport-pr.sh
new file mode 100755
index 00000000000..1d7599674bc
--- /dev/null
+++ b/.github/scripts/backport-pr.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+if [ "$#" -lt 3 ] || [ "$#" -gt 4 ]; then
+  echo "Usage: $0 <commit_hash> <target_branch> <pr_title> [body]"
+  echo "Example: $0 abc123def456 37.0.0 'Fix bug in query engine' 
'{\"backport_issue\": \"12345\"}'"
+  exit 1
+fi
+
+COMMIT_HASH="$1"
+TARGET_BRANCH="$2"
+PR_TITLE="$3"
+BODY="${4:-Automatic backport to $TARGET_BRANCH}"
+
+BACKPORT_BRANCH="backport-$COMMIT_HASH-to-$TARGET_BRANCH"
+
+git fetch origin "$TARGET_BRANCH"
+git checkout -b "$BACKPORT_BRANCH" "origin/$TARGET_BRANCH"
+git cherry-pick -x "$COMMIT_HASH"
+git push origin "$BACKPORT_BRANCH"
+
+gh pr create \
+  --base "$TARGET_BRANCH" \
+  --head "$BACKPORT_BRANCH" \
+  --title "$PR_TITLE" \
+  --body "$BODY" \
+  --label "backport"
diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
new file mode 100644
index 00000000000..757ce3768c4
--- /dev/null
+++ b/.github/workflows/backport.yml
@@ -0,0 +1,71 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name: "Backport PR"
+
+on:
+  issues:
+    types: [labeled]
+
+env:
+  ISSUE_NUMBER: ${{ github.event.issue.number }}
+  ISSUE_TITLE: ${{ github.event.issue.title }}
+
+jobs:
+  backport:
+    if: github.repository == 'apache/druid' && github.event.label.name == 
'approved' && contains(github.event.issue.labels.*.name, 'backport')
+    permissions:
+      contents: write
+      pull-requests: write
+      issues: write
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+
+      - name: Parse issue and create backport PR
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          SOURCE_PR: ${{ fromJson(github.event.issue.body).source_pr }}
+          TARGET_VERSION: ${{ fromJson(github.event.issue.body).target_version 
}}
+        run: |
+          MERGE_COMMIT=$(gh api "repos/${{ github.repository 
}}/pulls/$SOURCE_PR" --jq '.merge_commit_sha')
+
+          if [ -z "$MERGE_COMMIT" ]; then
+            echo "Error: Could not find merge commit for PR #$SOURCE_PR"
+            exit 1
+          fi
+
+          git config user.name "github-actions[bot]"
+          git config user.email "github-actions[bot]@users.noreply.github.com"
+
+          MESSAGE="Backport for #$ISSUE_NUMBER"
+          BODY=$(jq -n --arg backport_issue "$ISSUE_NUMBER" --arg message 
"$MESSAGE" '$ARGS.named')
+
+          .github/scripts/backport-pr.sh "$MERGE_COMMIT" "$TARGET_VERSION" 
"[Backport] $ISSUE_TITLE" "$BODY"
+
+      - name: Comment on failure
+        if: failure()
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          gh api "repos/${{ github.repository 
}}/issues/$ISSUE_NUMBER/comments" \
+            -f body="❌ Automatic backport failed. See workflow run: ${{ 
github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
diff --git a/.github/workflows/pr-merged.yml b/.github/workflows/pr-merged.yml
new file mode 100644
index 00000000000..9e62d726706
--- /dev/null
+++ b/.github/workflows/pr-merged.yml
@@ -0,0 +1,47 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+name: "PR Merged"
+
+on:
+  pull_request:
+    types: [closed]
+
+jobs:
+  add-milestone:
+    if: github.repository == 'apache/druid' && 
github.event.pull_request.merged == true && github.event.pull_request.base.ref 
== 'master'
+    permissions:
+      contents: read
+      pull-requests: write
+      issues: write
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Install xmllint
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y libxml2-utils
+
+      - name: Add milestone to PR
+        env:
+          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: |
+          .github/scripts/auto-add-milestone.sh "${{ 
github.event.pull_request.number }}" "${{ github.repository }}"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to