This is an automated email from the ASF dual-hosted git repository.
jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 437f46a2e0 [#9889] improvement(build): Use safer implementation for
cherry-pick workflow (#9890)
437f46a2e0 is described below
commit 437f46a2e0c6c192d995380fec6436b2141ab3fa
Author: roryqi <[email protected]>
AuthorDate: Thu Feb 5 17:34:05 2026 +0800
[#9889] improvement(build): Use safer implementation for cherry-pick
workflow (#9890)
### What changes were proposed in this pull request?
Use safer implementation for cherry-pick workflow
### Why are the changes needed?
Fix: #9889
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
I have tested it in my repo
https://github.com/qqqttt123/gravitino/pull/16
---
.github/workflows/auto-cherry-pick.yml | 143 ++++++++++++++++++++-----------
.github/workflows/cherry-pick-branch.yml | 131 ++++++++++++++++++++++++++++
2 files changed, 225 insertions(+), 49 deletions(-)
diff --git a/.github/workflows/auto-cherry-pick.yml
b/.github/workflows/auto-cherry-pick.yml
index 9e7f26783b..b3f8786985 100644
--- a/.github/workflows/auto-cherry-pick.yml
+++ b/.github/workflows/auto-cherry-pick.yml
@@ -1,65 +1,110 @@
name: Automatically cherry-pick merged PR to different branches
on:
- pull_request_target:
+ push:
branches:
- main
- types: ["closed"]
jobs:
- cherry_pick_branch_1_0:
+ detect-cherry-pick-labels:
runs-on: ubuntu-latest
- name: Cherry pick into branch_1.0
- if: ${{ contains(github.event.pull_request.labels.*.name, 'branch-1.0') &&
github.event.pull_request.merged == true }}
+ name: Detect cherry-pick labels from merged PR
+ outputs:
+ branch-1-0: ${{ steps.check-labels.outputs.branch-1-0 }}
+ branch-1-1: ${{ steps.check-labels.outputs.branch-1-1 }}
+ branch-1-2: ${{ steps.check-labels.outputs.branch-1-2 }}
+ commit-sha: ${{ steps.get-commit.outputs.commit-sha }}
+ commit-message: ${{ steps.get-commit.outputs.commit-message }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- - name: Cherry pick into branch-1.0
- uses:
carloscastrojumo/github-cherry-pick-action@503773289f4a459069c832dc628826685b75b4b3
- with:
- branch: branch-1.0
- labels: |
- cherry-pick
- reviewers: |
- jerryshao
- cherry_pick_branch_1_1:
- runs-on: ubuntu-latest
- name: Cherry pick into branch_1.1
- if: ${{ contains(github.event.pull_request.labels.*.name, 'branch-1.1') &&
github.event.pull_request.merged == true }}
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Cherry pick into branch-1.1
- uses:
carloscastrojumo/github-cherry-pick-action@503773289f4a459069c832dc628826685b75b4b3
- with:
- branch: branch-1.1
- labels: |
- cherry-pick
- reviewers: |
- jerryshao
+ - name: Get commit info
+ id: get-commit
+ run: |
+ # Get the commit message and extract PR number if available
+ COMMIT_MESSAGE=$(git log -1 --pretty=%B ${{ github.sha }})
+ COMMIT_SUBJECT=$(git log -1 --pretty=%s ${{ github.sha }})
+ echo "Commit: $COMMIT_SUBJECT"
+
+ # Try to extract PR number for later use
+ PR_NUMBER=$(echo "$COMMIT_MESSAGE" | grep -oE '#[0-9]+' | head -1 |
sed 's/#//')
+
+ if [ -z "$PR_NUMBER" ]; then
+ echo "No PR number found, will skip label check"
+ echo "pr-number=" >> $GITHUB_OUTPUT
+ else
+ echo "Found PR number: $PR_NUMBER"
+ echo "pr-number=$PR_NUMBER" >> $GITHUB_OUTPUT
+ fi
+
+ # Save commit info
+ echo "commit-sha=${{ github.sha }}" >> $GITHUB_OUTPUT
+ {
+ echo "commit-message<<EOF"
+ echo "$COMMIT_SUBJECT"
+ echo "EOF"
+ } >> $GITHUB_OUTPUT
- cherry_pick_branch_1_2:
- runs-on: ubuntu-latest
- name: Cherry pick into branch_1.2
- if: ${{ contains(github.event.pull_request.labels.*.name, 'branch-1.2') &&
github.event.pull_request.merged == true }}
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Cherry pick into branch-1.2
- uses:
carloscastrojumo/github-cherry-pick-action@503773289f4a459069c832dc628826685b75b4b3
- with:
- branch: branch-1.2
- labels: |
- cherry-pick
- reviewers: |
- jerryshao
+ - name: Check PR labels
+ id: check-labels
+ if: steps.get-commit.outputs.pr-number != ''
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ PR_NUMBER=${{ steps.get-commit.outputs.pr-number }}
+
+ # Get PR labels using GitHub CLI
+ LABELS=$(gh pr view $PR_NUMBER --json labels --jq '.labels[].name'
|| echo "")
+ echo "PR #$PR_NUMBER labels: $LABELS"
+
+ # Check for each branch label
+ if echo "$LABELS" | grep -q "branch-1.0"; then
+ echo "branch-1-0=true" >> $GITHUB_OUTPUT
+ else
+ echo "branch-1-0=false" >> $GITHUB_OUTPUT
+ fi
+
+ if echo "$LABELS" | grep -q "branch-1.1"; then
+ echo "branch-1-1=true" >> $GITHUB_OUTPUT
+ else
+ echo "branch-1-1=false" >> $GITHUB_OUTPUT
+ fi
+
+ if echo "$LABELS" | grep -q "branch-1.2"; then
+ echo "branch-1-2=true" >> $GITHUB_OUTPUT
+ else
+ echo "branch-1-2=false" >> $GITHUB_OUTPUT
+ fi
+
+ cherry-pick-branch-1-0:
+ needs: detect-cherry-pick-labels
+ if: needs.detect-cherry-pick-labels.outputs.branch-1-0 == 'true'
+ uses: ./.github/workflows/cherry-pick-branch.yml
+ with:
+ target-branch: branch-1.0
+ commit-sha: ${{ needs.detect-cherry-pick-labels.outputs.commit-sha }}
+ commit-message: ${{
needs.detect-cherry-pick-labels.outputs.commit-message }}
+ secrets: inherit
+
+ cherry-pick-branch-1-1:
+ needs: detect-cherry-pick-labels
+ if: needs.detect-cherry-pick-labels.outputs.branch-1-1 == 'true'
+ uses: ./.github/workflows/cherry-pick-branch.yml
+ with:
+ target-branch: branch-1.1
+ commit-sha: ${{ needs.detect-cherry-pick-labels.outputs.commit-sha }}
+ commit-message: ${{
needs.detect-cherry-pick-labels.outputs.commit-message }}
+ secrets: inherit
-env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ cherry-pick-branch-1-2:
+ needs: detect-cherry-pick-labels
+ if: needs.detect-cherry-pick-labels.outputs.branch-1-2 == 'true'
+ uses: ./.github/workflows/cherry-pick-branch.yml
+ with:
+ target-branch: branch-1.2
+ commit-sha: ${{ needs.detect-cherry-pick-labels.outputs.commit-sha }}
+ commit-message: ${{
needs.detect-cherry-pick-labels.outputs.commit-message }}
+ secrets: inherit
diff --git a/.github/workflows/cherry-pick-branch.yml
b/.github/workflows/cherry-pick-branch.yml
new file mode 100644
index 0000000000..d5a3b89e87
--- /dev/null
+++ b/.github/workflows/cherry-pick-branch.yml
@@ -0,0 +1,131 @@
+#
+# 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: Cherry-pick to branch
+
+on:
+ workflow_call:
+ inputs:
+ target-branch:
+ description: 'Target branch to cherry-pick to'
+ required: true
+ type: string
+ commit-sha:
+ description: 'Commit SHA to cherry-pick'
+ required: true
+ type: string
+ commit-message:
+ description: 'Original commit message'
+ required: true
+ type: string
+
+jobs:
+ cherry-pick:
+ runs-on: ubuntu-latest
+ name: Cherry-pick to ${{ inputs.target-branch }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up Git
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+
+ - name: Cherry-pick commit
+ id: cherry-pick
+ run: |
+ # Fetch all branches
+ git fetch origin
+
+ # Checkout target branch
+ git checkout ${{ inputs.target-branch }}
+
+ # Create a new branch for the cherry-pick (use short SHA)
+ SHORT_SHA=$(echo "${{ inputs.commit-sha }}" | cut -c1-8)
+ BRANCH_NAME="cherry-pick-${SHORT_SHA}-to-${{ inputs.target-branch }}"
+ git checkout -b $BRANCH_NAME
+
+ # Cherry-pick the commit
+ if git cherry-pick ${{ inputs.commit-sha }}; then
+ echo "Cherry-pick successful"
+ echo "success=true" >> $GITHUB_OUTPUT
+ echo "branch-name=$BRANCH_NAME" >> $GITHUB_OUTPUT
+ else
+ echo "Cherry-pick failed, creating conflict PR"
+ echo "success=false" >> $GITHUB_OUTPUT
+ echo "branch-name=$BRANCH_NAME" >> $GITHUB_OUTPUT
+
+ # Add all files (including conflicts)
+ git add .
+ git commit --no-edit || git commit -m "Cherry-pick ${{
inputs.commit-sha }} to ${{ inputs.target-branch }} (with conflicts)"
+ fi
+
+ - name: Push branch
+ if: steps.cherry-pick.outputs.branch-name != ''
+ run: |
+ git push origin ${{ steps.cherry-pick.outputs.branch-name }}
+
+ - name: Create Pull Request
+ if: steps.cherry-pick.outputs.branch-name != ''
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ COMMIT_MESSAGE: ${{ inputs.commit-message }}
+ TARGET_BRANCH: ${{ inputs.target-branch }}
+ COMMIT_SHA: ${{ inputs.commit-sha }}
+ SUCCESS: ${{ steps.cherry-pick.outputs.success }}
+ run: |
+ # Use original commit message with branch prefix
+ TITLE="[Cherry-pick to ${TARGET_BRANCH}] ${COMMIT_MESSAGE}"
+
+ # Prepare body with cherry-pick info
+ if [ "${SUCCESS}" = "true" ]; then
+ BODY=$(cat <<'EOF'
+ **Cherry-pick Information:**
+ - Original commit: ${COMMIT_SHA}
+ - Target branch: `${TARGET_BRANCH}`
+ - Status: ✅ Clean cherry-pick (no conflicts)
+ EOF
+ )
+ else
+ BODY=$(cat <<'EOF'
+ **Cherry-pick Information:**
+ - Original commit: ${COMMIT_SHA}
+ - Target branch: `${TARGET_BRANCH}`
+ - Status: ⚠️ **Has conflicts - manual resolution required**
+
+ Please review and resolve the conflicts before merging.
+ EOF
+ )
+ fi
+
+ # Replace placeholders with actual values
+ BODY="${BODY//\$\{COMMIT_SHA\}/${COMMIT_SHA}}"
+ BODY="${BODY//\$\{TARGET_BRANCH\}/${TARGET_BRANCH}}"
+
+ gh pr create \
+ --title "$TITLE" \
+ --body "$BODY" \
+ --base ${{ inputs.target-branch }} \
+ --head ${{ steps.cherry-pick.outputs.branch-name }} \
+ --label cherry-pick \
+ --reviewer jerryshao || echo "Failed to create PR, may already
exist"