github.com/argoproj/argo-cd/v3@v3.2.1/.github/workflows/cherry-pick-single.yml (about) 1 name: Cherry Pick Single 2 3 on: 4 workflow_call: 5 inputs: 6 merge_commit_sha: 7 required: true 8 type: string 9 description: "The merge commit SHA to cherry-pick" 10 version_number: 11 required: true 12 type: string 13 description: "The version number (from cherry-pick/ label)" 14 pr_number: 15 required: true 16 type: string 17 description: "The original PR number" 18 pr_title: 19 required: true 20 type: string 21 description: "The original PR title" 22 secrets: 23 CHERRYPICK_APP_ID: 24 required: true 25 CHERRYPICK_APP_PRIVATE_KEY: 26 required: true 27 28 jobs: 29 cherry-pick: 30 name: Cherry Pick to ${{ inputs.version_number }} 31 runs-on: ubuntu-latest 32 steps: 33 - name: Generate a token 34 id: generate-token 35 uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1 36 with: 37 app-id: ${{ secrets.CHERRYPICK_APP_ID }} 38 private-key: ${{ secrets.CHERRYPICK_APP_PRIVATE_KEY }} 39 40 - name: Checkout repository 41 uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 42 with: 43 fetch-depth: 0 44 token: ${{ steps.generate-token.outputs.token }} 45 46 - name: Configure Git 47 run: | 48 git config --global user.name "github-actions[bot]" 49 git config --global user.email "github-actions[bot]@users.noreply.github.com" 50 51 - name: Cherry pick commit 52 id: cherry-pick 53 run: | 54 set -e 55 56 MERGE_COMMIT="${{ inputs.merge_commit_sha }}" 57 TARGET_BRANCH="release-${{ inputs.version_number }}" 58 59 echo "🍒 Cherry-picking commit $MERGE_COMMIT to branch $TARGET_BRANCH" 60 61 # Check if target branch exists 62 if ! git show-ref --verify --quiet "refs/remotes/origin/$TARGET_BRANCH"; then 63 echo "❌ Target branch '$TARGET_BRANCH' does not exist" 64 exit 1 65 fi 66 67 # Create new branch for cherry-pick 68 CHERRY_PICK_BRANCH="cherry-pick-${{ inputs.pr_number }}-to-${TARGET_BRANCH}" 69 git checkout -b "$CHERRY_PICK_BRANCH" "origin/$TARGET_BRANCH" 70 71 # Perform cherry-pick 72 if git cherry-pick -m 1 "$MERGE_COMMIT"; then 73 echo "✅ Cherry-pick successful" 74 75 # Extract Signed-off-by from the cherry-pick commit 76 SIGNOFF=$(git log -1 --pretty=format:"%B" | grep -E '^Signed-off-by:' || echo "") 77 78 # Push the new branch 79 git push origin "$CHERRY_PICK_BRANCH" 80 81 # Save data for PR creation 82 echo "branch_name=$CHERRY_PICK_BRANCH" >> "$GITHUB_OUTPUT" 83 echo "signoff=$SIGNOFF" >> "$GITHUB_OUTPUT" 84 echo "target_branch=$TARGET_BRANCH" >> "$GITHUB_OUTPUT" 85 else 86 echo "❌ Cherry-pick failed due to conflicts" 87 git cherry-pick --abort 88 exit 1 89 fi 90 91 - name: Create Pull Request 92 run: | 93 # Create cherry-pick PR 94 gh pr create \ 95 --title "${{ inputs.pr_title }} (cherry-pick #${{ inputs.pr_number }} for ${{ inputs.version_number }})" \ 96 --body "Cherry-picked ${{ inputs.pr_title }} (#${{ inputs.pr_number }}) 97 98 ${{ steps.cherry-pick.outputs.signoff }}" \ 99 --base "${{ steps.cherry-pick.outputs.target_branch }}" \ 100 --head "${{ steps.cherry-pick.outputs.branch_name }}" 101 102 # Comment on original PR 103 gh pr comment ${{ inputs.pr_number }} \ 104 --body "🍒 Cherry-pick PR created for ${{ inputs.version_number }}: #$(gh pr list --head ${{ steps.cherry-pick.outputs.branch_name }} --json number --jq '.[0].number')" 105 env: 106 GH_TOKEN: ${{ steps.generate-token.outputs.token }} 107 108 - name: Comment on failure 109 if: failure() 110 run: | 111 gh pr comment ${{ inputs.pr_number }} \ 112 --body "❌ Cherry-pick failed for ${{ inputs.version_number }}. Please check the workflow logs for details." 113 env: 114 GH_TOKEN: ${{ steps.generate-token.outputs.token }}