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 }}