-
Notifications
You must be signed in to change notification settings - Fork 1
/
action.yml
328 lines (285 loc) · 13.7 KB
/
action.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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
name: "Github release data"
author: Kevin Rohn
description: "Get all data from Github release of a given repository."
branding:
icon: 'package'
color: 'green'
inputs:
repository:
required: false
default: ${{ github.repository }}
description: >
(Optional) Repository name to fetch release data.
If no repository is passed as an input. The repository from the build workflow is used.
It's possible to fetch release data from any given repository. Just use `<org>/<repo>` as an input parameter.
It's also possible to fetch release data from private repositories. In this case just pass the `token` input parameter.
token:
required: false
default: ${{ github.token }}
description: >
(Optional) `token` of the private repository from which the release information should be retrieved.
Pass the input parameter `token` to fetch release information from private repositories.
e.g.: `secrets.GITHUB_TOKEN`
version:
required: false
default: "latest"
description: >
(Optional) The version from which the release information is to be retrieved.
If the input value is not set, the default value `latest` is used.
It's possible to fetch release data from a given tag. To fetch a specific tag just use `<tag-name>`.
body-markdown-file-path:
required: false
description: >
(Optional) Specify an output path where the body output should be saved.
If the path is valid and the file is accessible then, the body output content will be saved into the file.
Save the file in the current working directory: ./release-content.md
asset-file:
required: false
description: >
(Optional) Name of the asset files to download.
To download release asset files, just use the input parameter `asset-file`.
To download multiple release asset files use `,` comma as a separator.
Example:
Download all .PNG and .JPEG files: `*.PNG,*.JPEG`
Download release asset with a static name: `myfile-to-download.extension`
asset-output:
required: false
default: "./"
description: >
(Optional) The output path in which the downloaded asset files should be placed.
If no input is set, the workspace path is used.
outputs:
url:
description: 'Release url to use in api calls'
value: ${{ steps.release_data.outputs.url }}
html_url:
description: 'Release url'
value: ${{ steps.release_data.outputs.html_url }}
assets_url:
description: 'Asset url to use in api calls'
value: ${{ steps.release_data.outputs.assets_url }}
upload_url:
description: 'Upload url for release assets'
value: ${{ steps.release_data.outputs.upload_url }}
tarball_url:
description: 'Url to tarball content '
value: ${{ steps.release_data.outputs.tarball_url }}
zipball_url:
description: 'Url to zipball content'
value: ${{ steps.release_data.outputs.zipball_url }}
discussion_url:
description: 'Discussion url - can be `null` if discussion is deactivated'
value: ${{ steps.release_data.outputs.discussion_url }}
id:
description: 'Release id'
value: ${{ steps.release_data.outputs.id }}
node_id:
description: 'Release node id'
value: ${{ steps.release_data.outputs.node_id }}
tag_name:
description: 'Release tag name'
value: ${{ steps.release_data.outputs.tag_name }}
target_commitish:
description: 'Target from which the release is created'
value: ${{ steps.release_data.outputs.target_commitish }}
name:
description: 'Release name'
value: ${{ steps.release_data.outputs.name }}
body:
description: >
The `body` output from release. It's a multiline output, which is packed in a JSON object.
The output can be used with the `fromJSON` function `(steps.<id>.outputs.body)`.
This workaround is applied because of the following multiline output problem.
[set-output truncates multiline strings](https://github.community/t/set-output-truncates-multiline-strings/16852/9)
value: ${{ steps.release_data.outputs.body }}
draft:
description: 'Shows if the release is a draft release or not (true/false)'
value: ${{ steps.release_data.outputs.draft }}
prerelease:
description: 'Shows if the release is a pre-release (true/false)'
value: ${{ steps.release_data.outputs.prerelease }}
created_at:
description: 'Shows the release creation date'
value: ${{ steps.release_data.outputs.created_at }}
published_at:
description: 'Shows the published date of the release'
value: ${{ steps.release_data.outputs.published_at }}
assets_array_json:
description: >
The `assets_array_json` output from release. It's a multiline output, which is packed in a JSON object.
The output can be used with the `fromJSON` function `(steps.<id>.outputs.assets_array_json)`.
value: ${{ steps.release_data.outputs.assets_array_json }}
author_json:
description: >
The `author_json` output from release. It's a multiline output, which is packed in a JSON object.
The output can be used with the `fromJSON` function `(steps.<id>.outputs.assets_array_json)`.
value: ${{ steps.release_data.outputs.author_json }}
runs:
using: "composite"
steps:
- name: Get release data
id: release_data
shell: bash
run: |
echo "::group::Fetch data"
log_token_toggle=""
if [[ "$RUNNER_OS" == "Linux" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | sha256sum | head -c 64)
elif [[ "$RUNNER_OS" == "macOS" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | shasum -a 256 | head -c 64)
else
exit 1;
fi
echo "::add-mask::$log_token_toggle"
echo "::stop-commands::$log_token_toggle"
token=${{ inputs.token }}
gh_api_url="https://api.github.com/repos/${{ inputs.repository }}"
if [[ "${{ inputs.version }}" == "latest" ]]; then
gh_api_url="https://api.github.com/repos/${{ inputs.repository }}/releases/latest"
else
gh_api_url="https://api.github.com/repos/${{ inputs.repository }}/releases/tags/${{ inputs.version }}"
fi
release_json_data=$(curl ${token:+"-H"} ${token:+"Authorization: token ${token}"} "$gh_api_url")
url=$(jq -r '.url' <<< "$release_json_data")
html_url=$(jq -r '.html_url' <<< "$release_json_data")
assets_url=$(jq -r '.assets_url' <<< "$release_json_data")
upload_url=$(jq -r '.upload_url' <<< "$release_json_data")
tarball_url=$(jq -r '.tarball_url' <<< "$release_json_data")
zipball_url=$(jq -r '.zipball_url' <<< "$release_json_data")
discussion_url=$(jq -r '.discussion_url' <<< "$release_json_data")
id=$(jq -r '.id' <<< "$release_json_data")
node_id=$(jq -r '.node_id' <<< "$release_json_data")
tag_name=$(jq -r '.tag_name' <<< "$release_json_data")
target_commitish=$(jq -r '.target_commitish' <<< "$release_json_data")
name=$(jq -r '.name' <<< "$release_json_data")
body=$(jq -r '.body' <<< "$release_json_data")
body_packed_in_json=$(printf '%s' "$body" | jq --raw-input --slurp '.')
draft=$(jq -r '.draft' <<< "$release_json_data")
prerelease=$(jq -r '.prerelease' <<< "$release_json_data")
created_at=$(jq -r '.created_at' <<< "$release_json_data")
published_at=$(jq -r '.published_at' <<< "$release_json_data")
author=$(jq -r '.author' <<< "$release_json_data")
author_packed_in_json=$(printf '%s' "$author" | jq --raw-input --slurp '.')
assets=$(jq -r '.assets' <<< "$release_json_data")
assets_packed_in_json=$(printf '%s' "$assets" | jq --raw-input --slurp '.')
echo "::$log_token_toggle::"
echo "::echo::off"
echo "url=$url" >> $GITHUB_OUTPUT
echo "html_url=$html_url" >> $GITHUB_OUTPUT
echo "assets_url=$assets_url" >> $GITHUB_OUTPUT
echo "upload_url=$upload_url" >> $GITHUB_OUTPUT
echo "tarball_url=$tarball_url" >> $GITHUB_OUTPUT
echo "zipball_url=$zipball_url" >> $GITHUB_OUTPUT
echo "discussion_url=$discussion_url" >> $GITHUB_OUTPUT
echo "id=$id" >> $GITHUB_OUTPUT
echo "node_id=$node_id" >> $GITHUB_OUTPUT
echo "tag_name=$tag_name" >> $GITHUB_OUTPUT
echo "target_commitish=$target_commitish" >> $GITHUB_OUTPUT
echo "name=$name" >> $GITHUB_OUTPUT
echo "body=$body_packed_in_json" >> $GITHUB_OUTPUT
echo "draft=$draft" >> $GITHUB_OUTPUT
echo "prerelease=$prerelease" >> $GITHUB_OUTPUT
echo "created_at=$created_at" >> $GITHUB_OUTPUT
echo "published_at=$published_at" >> $GITHUB_OUTPUT
echo "author_json=$author_packed_in_json" >> $GITHUB_OUTPUT
echo "assets_array_json=$assets_packed_in_json" >> $GITHUB_OUTPUT
echo "::endgroup::"
- name: Write markdown body file
id: markdown_body
shell: bash
if: ${{ inputs.body-markdown-file-path != '' }}
run: |
echo "::group::Create release markdown file"
log_token_toggle=""
if [[ "$RUNNER_OS" == "Linux" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | sha256sum | head -c 64)
elif [[ "$RUNNER_OS" == "macOS" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | shasum -a 256 | head -c 64)
else
exit 1;
fi
echo "::add-mask::$log_token_toggle"
echo "::stop-commands::$log_token_toggle"
{
echo '${{ fromJSON(steps.release_data.outputs.body) }}'
} >> ${{ inputs.body-markdown-file-path }}
echo "::$log_token_toggle::"
echo "::notice title=Release Markdown file of ${{ inputs.repository }}::Saved body content to file '${{ inputs.body-markdown-file-path }}'"
echo "::endgroup::"
- name: Download release assets
id: release_asset_download
if: ${{ inputs.asset-file != '' }}
shell: bash
run: |
echo "::group::Download release artifacts"
if [[ ! -d "${{ inputs.asset-output }}" ]]; then
echo "::error title=Asset output path does not exist.::No ouput path definied."
exit 1
fi
log_token_toggle=""
if [[ "$RUNNER_OS" == "Linux" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | sha256sum | head -c 64)
elif [[ "$RUNNER_OS" == "macOS" ]]; then
log_token_toggle=$(echo -n ${{ inputs.token }} | shasum -a 256 | head -c 64)
else
exit 1;
fi
echo "::add-mask::$log_token_toggle"
echo "::stop-commands::$log_token_toggle"
token=${{ inputs.token }}
echo "::add-mask::$token"
auth_header="Authorization: token ${token}"
base_asset_url="https://api.github.com/repos/${{ inputs.repository }}/releases/assets/"
search_strings="${{ inputs.asset-file }}"
if [[ "$RUNNER_OS" == "macOS" ]]; then # remove wildcard character from search string on non-GNU grep search
search_strings=$(sed 's/*//g' <<< "$search_strings")
fi
IFS=',' read -ra array_search_string <<< "$search_strings"
regex_search=""
for search_string in "${array_search_string[@]}"; do
regex_search="$regex_search|$search_string"
done
regex_search=${regex_search:1}
jq -c '.[]' <<< '${{ fromJSON(steps.release_data.outputs.assets_array_json) }}' | while read i; do
asset_name=$(jq -r '.name' <<<"$i")
asset_id=$(jq -r '.id' <<<"$i")
should_download=false
if [[ $(echo "$asset_name" | grep -E -o "$regex_search") != "" ]]; then
should_download=true
fi
if [[ "$should_download" == true ]]; then
download_url=${base_asset_url}${asset_id}
curl \
-L \
-H "${auth_header}" \
-H "Accept:application/octet-stream" \
-o "${{ inputs.asset-output }}/${asset_name}" \
"${download_url}"
fi
done
echo "::$log_token_toggle::"
echo "::endgroup::"
- name: show output values
shell: bash
run: |
echo "::group::output values"
echo "INFO: Release url ${{ steps.release_data.outputs.url }}"
echo "INFO: Release html_url ${{ steps.release_data.outputs.html_url }}"
echo "INFO: Release assets_url${{ steps.release_data.outputs.assets_url }}"
echo "INFO: Release upload_url ${{ steps.release_data.outputs.upload_url }}"
echo "INFO: Release tarball_url ${{ steps.release_data.outputs.tarball_url }}"
echo "INFO: Release zipball_url ${{ steps.release_data.outputs.zipball_url }}"
echo "INFO: Release discussion_url ${{ steps.release_data.outputs.discussion_url }}"
echo "INFO: Release id ${{ steps.release_data.outputs.id }}"
echo "INFO: Release node_id ${{ steps.release_data.outputs.node_id }}"
echo "INFO: Release tag_name ${{ steps.release_data.outputs.tag_name }}"
echo "INFO: Release target_commitish ${{ steps.release_data.outputs.target_commitish }}"
echo "INFO: Release name ${{ steps.release_data.outputs.name }}"
echo "INFO: Release body ${{ fromJSON(steps.release_data.outputs.body) }}"
echo "INFO: Release draft ${{ steps.release_data.outputs.draft }}"
echo "INFO: Release prerelease ${{ steps.release_data.outputs.prerelease }}"
echo "INFO: Release created_at ${{ steps.release_data.outputs.created_at }}"
echo "INFO: Release published_at ${{ steps.release_data.outputs.published_at }}"
echo "INFO: Release assets_array_json ${{ fromJSON(steps.release_data.outputs.assets_array_json) }}"
echo "INFO: Release author_json ${{ fromJSON(steps.release_data.outputs.author_json) }}"
echo "::endgroup::"