-
Notifications
You must be signed in to change notification settings - Fork 7
159 lines (150 loc) · 6.14 KB
/
version_bump.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
name: Bump version
on:
pull_request:
types:
- opened
jobs:
# Run only for branches that start with pattern 'bump_version'
# This job checks if only version.txt changed and pull request
# creator has write permission.
branch_verification:
name: Verify user and changes
if: startsWith(github.head_ref, 'bump_version')
runs-on: ubuntu-latest
outputs:
files_ok: ${{ steps.changed_files.outputs.files_ok }}
steps:
- name: Git checkout
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
with:
fetch-depth: 2
# Check if creator of pull request has write permission
- name: Verify user
id: check_user
uses: actions-cool/check-user-permission@cd622002ff25c2311d2e7fb82107c0d24be83f9b # v2.2.0
with:
require: 'write'
# Check all changed files between master and pull request head
- name: Get diff of head to master
id: get_diff
uses: tj-actions/changed-files@54479c37f5eb47a43e595c6b71e1df2c112ce7f1 # v36
# Check passed if only version.txt changed and user has write permission
- name: Verify changed files
id: changed_files
if: |
steps.get_diff.outputs.all_changed_and_modified_files == 'version.txt' &&
steps.get_diff.outputs.modified_files == 'version.txt' &&
steps.check_user.outputs.require-result == 'true'
run: |
echo "files_ok=true" >> $GITHUB_OUTPUT
# Check the contents of version.txt
content_verification:
name: Verify version.txt content
needs: branch_verification
if: needs.branch_verification.outputs.files_ok == 'true'
runs-on: ubuntu-latest
outputs:
content_ok: ${{ steps.check_content.outputs.content_ok }}
version_number: ${{ steps.get_content.outputs.version }}
version_date: ${{ steps.get_content.outputs.date }}
steps:
- name: Git checkout head
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
with:
ref: ${{ github.event.pull_request.head.ref }}
- name: Read version file
id: get_content
run: |
cd ${{runner.workspace}}/potku
echo "version=$(awk 'NR==1' version.txt)" >> $GITHUB_OUTPUT
echo "date=$(awk 'NR==2' version.txt)" >> $GITHUB_OUTPUT
- name: Match file content
id: match_content
if: |
steps.get_content.outputs.version != '' &&
steps.get_content.outputs.date != ''
run: |
if [[ ${{ steps.get_content.outputs.version }} =~ ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?(\+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$ ]]; then
echo "version_match=true" >> $GITHUB_OUTPUT
fi
if [[ ${{ steps.get_content.outputs.date }} =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "date_match=true" >> $GITHUB_OUTPUT
fi
- name: Verify file content
id: check_content
if: |
steps.match_content.outputs.version_match == 'true' &&
steps.match_content.outputs.date_match == 'true'
run: |
echo "content_ok=true" >> $GITHUB_OUTPUT
# If branch_verification and content_verification jobs returns true
# then the pull request is automatically approved by github-actions-bot.
auto_approve:
name: Auto approve
needs: [branch_verification, content_verification]
runs-on: ubuntu-latest
permissions:
pull-requests: write
if: |
needs.branch_verification.outputs.files_ok == 'true' &&
needs.content_verification.outputs.content_ok == 'true'
steps:
- name: Auto approve
uses: hmarr/auto-approve-action@a2e6f2a0ccf5c63ef8754de360464edbf47e66ee # v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# Automatically merge the approved version bump pull request. Version
# bump branch is automatically deleted after merging.
auto_merge:
name: Auto merge
needs: [branch_verification, content_verification, auto_approve]
runs-on: ubuntu-latest
if: |
needs.branch_verification.outputs.files_ok == 'true' &&
needs.content_verification.outputs.content_ok == 'true'
steps:
- name: Auto merge
uses: pascalgn/automerge-action@22948e0bc22f0aa673800da838595a3e7347e584 # v0.15.6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MERGE_METHOD: "merge"
MERGE_LABELS: ""
MERGE_DELETE_BRANCH: "true"
# Automatically create an annotated tag of master branch after
# merging version bump pull request.
auto_tag:
name: Auto tag
needs: [branch_verification, content_verification, auto_approve, auto_merge]
runs-on: ubuntu-latest
if: |
needs.branch_verification.outputs.files_ok == 'true' &&
needs.content_verification.outputs.content_ok == 'true'
steps:
- name: Git checkout
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
with:
ref: master
submodules: recursive
- name: git commands
run: |
cd ${{runner.workspace}}/potku
git config user.name "GitHub Actions Bot"
git config user.email "<>"
git tag -a ${{ needs.content_verification.outputs.version_number}} -m "Automatic tag for version ${{ needs.content_verification.outputs.version_number}}"
git push origin ${{ needs.content_verification.outputs.version_number}}
# Building the C apps is run as a sub workflow in here.
build_c:
name: Build C apps
needs: [branch_verification, content_verification, auto_approve, auto_merge, auto_tag]
if: |
needs.branch_verification.outputs.files_ok == 'true' &&
needs.content_verification.outputs.content_ok == 'true'
uses: ./.github/workflows/compile_c_apps.yml
# Packaging Potku is run as a sub workflow in here.
package_Potku:
name: Package Potku
needs: [branch_verification, content_verification, auto_approve, auto_merge, auto_tag, build_c]
if: |
needs.branch_verification.outputs.files_ok == 'true' &&
needs.content_verification.outputs.content_ok == 'true'
uses: ./.github/workflows/package_potku.yml