-
Notifications
You must be signed in to change notification settings - Fork 31
135 lines (124 loc) · 5.34 KB
/
label-cherry-pick.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
name: Label Cherry Pick
on:
pull_request_target:
types:
- labeled
- closed
jobs:
prepare_branch_list:
runs-on: ubuntu-latest
if: |
github.event.pull_request.merged == true &&
github.event.pull_request.merge_commit_sha != null
outputs:
target_branch: ${{ steps.set-branches.outputs.target_branch }}
steps:
- name: Set Branches
id: set-branches
env:
PR_LABELS: ${{ toJson(github.event.pull_request.labels) }}
EVENT_ACTION: ${{ github.event.action }}
LABEL_NAME: ${{ github.event.label.name }}
BASE_REF: ${{ github.base_ref }}
run: |
if [[ $EVENT_ACTION == 'closed' ]]; then
# Get a list of the labels from the PR.
labels=$(echo "$PR_LABELS" | jq -r '.[].name')
else
# Or get the label that was added on the merged PR.
labels=$LABEL_NAME
fi
branches=("25.lts.1+" "24.lts.1+" "23.lts.1+" "22.lts.1+" "21.lts.1+" "20.lts.1+" "19.lts.1+" "rc_11" "COBALT_9")
filtered_branches=()
for branch in "${branches[@]}"; do
if [[ $branch == $BASE_REF ]]; then
continue
fi
if [[ ${labels[@]} =~ "cp-$branch" ]]; then
filtered_branches+=("$branch")
fi
done
echo "target_branch=$(echo -n "${filtered_branches[@]}" | jq -cRs 'split(" ")')" >> $GITHUB_OUTPUT
cherry_pick:
runs-on: ubuntu-latest
permissions:
issues: write
needs: prepare_branch_list
if: needs.prepare_branch_list.outputs.target_branch != '[]'
strategy:
matrix:
target_branch: ${{ fromJson(needs.prepare_branch_list.outputs.target_branch) }}
env:
ACCESS_TOKEN: ${{ secrets.CHERRY_PICK_TOKEN }}
REPOSITORY: ${{ github.repository }}
GITHUB_REF: ${{ github.ref }}
MERGE_COMMIT_SHA: ${{ github.event.pull_request.merge_commit_sha }}
CHERRY_PICK_BRANCH: cherry-pick-${{ matrix.target_branch }}-${{ github.event.pull_request.number }}
steps:
- name: Checkout repository
uses: kaidokert/[email protected]
timeout-minutes: 30
with:
ref: ${{ matrix.target_branch }}
fetch-depth: 0
persist-credentials: false
- name: Setup Git
run: |
git config --global user.name "GitHub Release Automation"
git config --global user.email "[email protected]"
- name: Cherry pick merge commit
id: cherry-pick
continue-on-error: true
run: |
set -x
git fetch origin ${{ matrix.target_branch }}
set +e
# Select the first parent as the mainline tree. This is necessary if
# the commit has multiple parents as the cherry-pick will fail otherwise.
git cherry-pick -x --mainline=1 ${MERGE_COMMIT_SHA}
RES=$?
set -e
if [ ${RES} -ne 0 ]; then
# If the cherry pick failed due to a merge conflict we can
# add the conflicting file and create the commit anyway.
git add .
git cherry-pick --continue
fi
exit ${RES}
- name: Create Pull Request
id: create-pr
continue-on-error: true
uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04 # v4.2.3
with:
token: ${{ secrets.CHERRY_PICK_TOKEN }}
draft: ${{ steps.cherry-pick.outcome == 'failure' }}
base: ${{ matrix.target_branch }}
branch: ${{ env.CHERRY_PICK_BRANCH }}
committer: GitHub Release Automation <[email protected]>
reviewers: ${{ github.event.pull_request.user.login }}
title: "Cherry pick PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}"
body: |
Refer to the original PR: https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}
${{ github.event.pull_request.body }}
- name: Comment on failure
uses: actions/github-script@v6
with:
github-token: ${{ secrets.CHERRY_PICK_TOKEN }}
script: |
if ('${{ steps.create-pr.outputs.pull-request-number }}' == '') {
// Comment on the originating PR if creating a cherry pick PR failed.
github.rest.issues.createComment({
issue_number: context.payload.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '> [!IMPORTANT]\n> Creating the cherry pick PR failed! Check the log at ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} for details.'
});
} else if ('${{ steps.cherry-pick.outcome }}' == 'failure') {
// Comment on the new PR if the cherry pick failed.
github.rest.issues.createComment({
issue_number: '${{ steps.create-pr.outputs.pull-request-number }}',
owner: context.repo.owner,
repo: context.repo.repo,
body: '> [!IMPORTANT]\n> There were merge conflicts while cherry picking! Check out [${{ env.CHERRY_PICK_BRANCH }}](${{ github.repository }}/tree/${{ env.CHERRY_PICK_BRANCH }}) and fix the conflicts before proceeding. Check the log at ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} for details.'
});
}