-
Notifications
You must be signed in to change notification settings - Fork 0
169 lines (152 loc) · 6.56 KB
/
gh-release.yaml
File metadata and controls
169 lines (152 loc) · 6.56 KB
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
160
161
162
163
164
165
166
167
168
169
name: 'Github release'
on:
push:
tags:
- '*'
workflow_dispatch:
inputs:
# If enabled, respects commits between semver tag build num iterations instead of previous commited tag (eg: X.X.X-y_2 -> X.X.X-y_3)
tag_num:
description: 'Take into account build number'
type: boolean
default: false
fetch_depth:
description: 'Commit history depth to fetch'
type: string
default: '30'
changelog_file:
description: 'Changelog file name'
type: string
default: 'CHANGELOG.md'
runs_on:
description: 'Set runner, default ubuntu-latest'
type: string
default: 'ubuntu-latest'
workflow_call:
inputs:
release_tag:
description: 'Tag which release is created from, if empty, use last commited tag'
type: string
default: ''
# If enabled, respects commits between semver tag build num iterations instead of previous commited tag (eg: X.X.X-y_2 -> X.X.X-y_3)
tag_num:
description: 'Take into account build number'
type: boolean
default: false
fetch_depth:
description: 'Commit history depth to fetch'
type: string
default: '30'
changelog_file:
description: 'Changelog file name'
type: string
default: 'CHANGELOG.md'
runs_on:
description: 'Set runner, default ubuntu-latest'
type: string
default: 'ubuntu-latest'
jobs:
gh-release:
runs-on: ${{ inputs.runs_on || 'ubuntu-latest' }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
fetch-depth: ${{ inputs.fetch_depth || '30' }}
fetch-tags: true
- name: Get tags
id: tag
env:
RELEASE_TAG: ${{ inputs.release_tag || '' }}
run: |
if [[ "${GITHUB_REF_TYPE}" == tag ]]; then
CURRENT_TAG=${GITHUB_REF##*/}
elif [[ "${{ env.RELEASE_TAG }}" != '' ]]; then
CURRENT_TAG=${RELEASE_TAG}
else
CURRENT_TAG=$(git describe --abbrev=0 --tags 2>/dev/null || true)
fi
PREVIOUS_TAG=$(git describe --abbrev=0 --tags $(git rev-list --tags --skip=1 --max-count=1) 2>/dev/null || true)
echo "previous tag: ${PREVIOUS_TAG}"
echo "current tag: ${CURRENT_TAG}"
echo "previous_tag=${PREVIOUS_TAG}" >> $GITHUB_OUTPUT
echo "current_tag=${CURRENT_TAG}" >> $GITHUB_OUTPUT
# Exit if there's any tag
if [[ ! -n "${CURRENT_TAG}" ]]; then
# Create annotation
echo "::error::Can't get any tag."
exit 1
fi
- name: Parse semver tag
if: ${{ inputs.tag_num || false }}
id: tag_semver
uses: pixelfederation/gh-action-semver-parser@v0.4.0
with:
tag: ${{ steps.tag.outputs.current_tag }}
- name: Parse semver tag iteration number
if: ${{ inputs.tag_num || false }}
id: tag_semver_num
env:
CURRENT_TAG: ${{ steps.tag.outputs.current_tag }}
CURRENT_TAG_UT: ${{ steps.tag_semver.outputs.ut }}
run: |
CURRENT_TAG_SEMVER_NUM=$(echo "${{ env.CURRENT_TAG }}" | sed -E 's/(.+)_([[:digit:]]+)/\2/' | grep -E '^[[:digit:]]+$')
if [[ "${CURRENT_TAG_SEMVER_NUM}" -ge 1 ]]; then
PREVIOUS_TAG_SEMVER_NUM=$((${CURRENT_TAG_SEMVER_NUM} - 1))
PREVIOUS_TAG=$(git tag -l "${{ env.CURRENT_TAG_UT }}_${PREVIOUS_TAG_SEMVER_NUM}")
fi
echo "previous_tag=${PREVIOUS_TAG}" >> $GITHUB_OUTPUT
- name: Changelog presence
id: changelog
env:
CHANGELOG_FILE: ${{ inputs.changelog_file || 'CHANGELOG.md' }}
run: |
if [[ -f ${{ env.CHANGELOG_FILE }} ]]; then
echo "changelog=true" >> $GITHUB_OUTPUT
fi
- name: Release commits
id: commits
env:
PREVIOUS_TAG: ${{ (inputs.tag_num && steps.tag_semver_num.outputs.previous_tag != '') && steps.tag_semver_num.outputs.previous_tag || steps.tag.outputs.previous_tag }}
CURRENT_TAG: ${{ steps.tag.outputs.current_tag }}
run: |
COMMITS=$(git log --first-parent --oneline --no-decorate $([[ "${{ env.PREVIOUS_TAG }}" ]] && echo "${{ env.PREVIOUS_TAG }}..") ${{ env.CURRENT_TAG }} | tr '"' "'" | while read LINE; do echo -n ${LINE}\\n; done)
echo "commits=${COMMITS}" >> $GITHUB_OUTPUT
# Export commits output through javascript to properly process multiline string
- name: Commits output
id: commits_output
uses: actions/github-script@v7.0.1
with:
script: |
core.setOutput("commits", `${{ steps.commits.outputs.commits }}`);
- name: Release
uses: softprops/action-gh-release@v2
env:
CHANGELOG_FILE: ${{ inputs.changelog_file || 'CHANGELOG.md' }}
PREVIOUS_TAG: ${{ (inputs.tag_num && steps.tag_semver_num.outputs.previous_tag != '') && steps.tag_semver_num.outputs.previous_tag || steps.tag.outputs.previous_tag }}
CURRENT_TAG: ${{ steps.tag.outputs.current_tag }}
with:
tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || steps.tag.outputs.current_tag }}
draft: false
prerelease: false
body: |
#### Commits in this release:
${{ steps.commits_output.outputs.commits }}
#### Changelog:
${{ format('[`{0}..{1}`]({2}/{3}/compare/{0}..{1})', env.PREVIOUS_TAG, env.CURRENT_TAG, github.server_url, github.repository) }}
${{ steps.changelog.outputs.changelog == 'true' && format('[{0}]({1}/{2}/blob/{3}/{0})', env.CHANGELOG_FILE, github.server_url, github.repository, github.ref_name) || '' }}
- name: Remove draft releases for current tag
env:
RELEASES_URL: ${{ format('https://api.github.com/repos/{0}/releases', github.repository) }}
CURRENT_TAG: ${{ steps.tag.outputs.current_tag }}
run: |
DRAFT_ID=$(curl -Ss -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ github.token }}" ${{ env.RELEASES_URL }} | jq '.[] | select(.tag_name == "${{ env.CURRENT_TAG }}" and .draft == true) | .id')
if [[ ! -z "${DRAFT_ID}" ]]; then
for ID in ${DRAFT_ID}; do
echo "Delete draft release ID ${ID}"
curl -Ss -L -X DELETE -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${{ github.token }}" ${{ env.RELEASES_URL }}/${ID}
done
else
echo "No draft releases found"
fi