-
Notifications
You must be signed in to change notification settings - Fork 438
127 lines (109 loc) · 4.35 KB
/
testmerge.yml
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
name: 'Testmerge Worker'
concurrency:
group: testmerge
on:
workflow_dispatch:
env:
BASE_BRANCH: master220
TESTMERGE_BRANCH: testmerge2
REQUIRED_LABEL: testmerge
jobs:
process:
runs-on: ubuntu-latest
steps:
- name: Get pull requests with required label and check for merge conflicts
id: get_labeled_prs
uses: actions/github-script@v7
with:
script: |
const label_needed = '${{ env.REQUIRED_LABEL }}';
const { data: pullRequests } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
});
const labeledPRs = [];
for (const pr of pullRequests) {
if (pr.labels.some(label => label.name === label_needed)) {
const prInfo = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number
});
if (prInfo.data.mergeable) {
labeledPRs.push({
number: pr.number,
title: pr.title
});
}
}
}
const prDetails = JSON.stringify(labeledPRs);
console.log(`Pull Requests with the label "${label_needed}" and no merge conflicts: ${prDetails}`);
if (prDetails.length == 0) {
core.setFailed(`No pull requests with the label "${label_needed}" and no merge conflicts found.`);
}
core.setOutput('labeled_pr_details', prDetails);
- name: Git checkout
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
ref: ${{ env.BASE_BRANCH }}
- uses: actions/setup-python@v5
with:
python-version: '3.11.6'
cache: 'pip'
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'
cache-dependency-path: ./tgui/yarn.lock
- name: Install python packages
run: |
pip3 install -r tools/requirements.txt
pip3 install GitPython
- name: Iterate over PRs and perform actions
id: prepare_testmerge_branch
run: |
set -e
git config --local user.email "[email protected]"
git config --local user.name "Testmerge Worker"
git switch ${{ env.TESTMERGE_BRANCH }} || git switch -c ${{ env.TESTMERGE_BRANCH }}
git reset --hard ${{ env.BASE_BRANCH }}
./tools/hooks/install.sh
./tgui/bin/tgui --install-git-hooks
# Print debug information
echo "PR details JSON:"
echo '${{ steps.get_labeled_prs.outputs.labeled_pr_details }}'
echo '${{ steps.get_labeled_prs.outputs.labeled_pr_details }}' | jq -c '.[]' | while read -r PR_DETAIL; do
PR_NUMBER=$(echo "$PR_DETAIL" | jq -r '.number')
PR_TITLE=$(echo "$PR_DETAIL" | jq -r '.title')
git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
PR_LAST_COMMIT=$(git rev-parse --short pr-$PR_NUMBER | head -c 7)
PR_STRING="$PR_TITLE (#$PR_NUMBER) [$PR_LAST_COMMIT]"
echo "$PR_STRING: Preparing..."
# Check for merge conflicts
git merge --no-commit --no-ff pr-$PR_NUMBER || true
CONFLICTS=$(git ls-files -u | wc -l)
if [ "$CONFLICTS" -gt 0 ] ; then
echo "$PR_STRING: There is a merge conflict. Skipping!"
git merge --abort
continue
fi
git merge --abort
git merge --squash pr-$PR_NUMBER
git commit -m "$PR_TITLE (#$PR_NUMBER) [testmerge][$PR_LAST_COMMIT]"
# Perform your git actions here, for example:
echo "$PR_STRING: Successfully merged!"
done
# Generate changelog
python3 tools/changelog/gen_changelog.py
git add html/changelogs/archive/\*.yml
CHANGES=$(git diff --name-only --cached | wc -l)
if [ "$CHANGES" -gt 0 ] ; then
git config --local user.email "[email protected]"
git config --local user.name "Changelog Generation"
git commit -m "Automatic changelog generation"
fi
git push -f origin ${{ env.TESTMERGE_BRANCH }}