Skip to content

Commit 7281863

Browse files
committed
2022.08.14:
* fixed: bash/github: utils.sh, set-env-from-args.sh: missed to ignore `GITHUB_*` builtin variables, execution fixup * new: bash/github: init-basic-workflow.sh, enable-github-env-autoeval.sh: Ability to apply GitHub Actions job environment variables by the `GITHUB_ENV` file path automatically on each GitHub Actions job step line instead of on the next step only. A workflow does require to enable this explicitly using the `enable-github-env-autoeval.sh` script run. * changed: bash/github: utils.sh, set-env-from-args.sh: added global bash variables assign additionally to `GITHUB_ENV` file update to apply variables assign immediately for the same GitHub Actions job step line * refactor: bash/github: `GH_*` global environment variables renamed into `GHWF_*`, added prefix to the rest
1 parent 48c9ba5 commit 7281863

File tree

11 files changed

+306
-158
lines changed

11 files changed

+306
-158
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#!/bin/bash
2+
3+
# NOTE:
4+
# This is a composite script to use from a composite GitHub action.
5+
#
6+
7+
# Script both for execution and inclusion.
8+
[[ -z "$BASH" || (-n "$SOURCE_GHWF_ENABLE_GITHUB_ENV_AUTOEVAL_SH" && SOURCE_GHWF_ENABLE_GITHUB_ENV_AUTOEVAL_SH -ne 0) ]] && return
9+
10+
SOURCE_GHWF_ENABLE_GITHUB_ENV_AUTOEVAL_SH=1 # including guard
11+
12+
[[ -z "$GH_WORKFLOW_ROOT" ]] && {
13+
echo "$0: error: \`GH_WORKFLOW_ROOT\` variable must be defined." >&2
14+
exit 255
15+
}
16+
17+
source "$GH_WORKFLOW_ROOT/_externals/tacklelib/bash/tacklelib/bash_tacklelib" || exit $?
18+
19+
tkl_include_or_abort "$GH_WORKFLOW_ROOT/bash/github/utils.sh"
20+
21+
22+
function gh_enable_github_auto_eval()
23+
{
24+
[[ -z "$GITHUB_ACTIONS" ]] && return 0
25+
26+
if [[ -z "${GHWF_GITHUB_ENV_AUTOEVAL:+x}" ]]; then # to save veriable between workflow steps
27+
gh_set_env_var GHWF_GITHUB_ENV_AUTOEVAL 1
28+
fi
29+
}
30+
31+
function gh_disable_github_auto_eval()
32+
{
33+
[[ -z "$GITHUB_ACTIONS" ]] && return 0
34+
35+
gh_unset_env_var GHWF_GITHUB_ENV_AUTOEVAL
36+
}
37+
38+
# Reads and evaluates `GITHUB_ENV` file to setup environment variables immediately
39+
# and avoids wait for the next GitHub Actions job step to use them.
40+
#
41+
# CAUTION:
42+
# The function can has differences with the internal load logic and so can
43+
# has incorrect or deviated results.
44+
#
45+
function gh_eval_github_env_file()
46+
{
47+
local __vars_file="$1"
48+
49+
local IFS
50+
local __line
51+
local __line_filtered
52+
local __empty
53+
local __prefix
54+
local __var
55+
local __value
56+
local __eof
57+
local __read_var=0
58+
59+
while IFS=$'\r\n' read -r __line; do
60+
if [[ -z "$__line" ]]; then
61+
continue
62+
fi
63+
64+
gh_trim_trailing_line_return_chars "$__line"
65+
66+
__line_filtered="$RETURN_VALUE"
67+
68+
if (( ! __read_var )); then
69+
IFS='<' read -r __var __empty __eof <<< "$__line_filtered"
70+
if [[ -z "$__eof" ]]; then
71+
IFS='=' read -r __var empty <<< "$__line_filtered"
72+
IFS='=' read -r empty __value <<< "$__line"
73+
74+
case "$__var" in
75+
# ignore system and builtin variables
76+
__* | GITHUB_* | 'IFS') ;;
77+
*) tkl_declare_global "$__var" "$__value" ;;
78+
esac
79+
else
80+
case "$__var" in
81+
# ignore system and builtin variables
82+
__* | GITHUB_* | 'IFS') ;;
83+
*)
84+
__read_var=1
85+
__value=''
86+
;;
87+
esac
88+
fi
89+
elif [[ "$__line_filtered" != "$__eof" ]]; then
90+
__value="$__value$__line"$'\n'
91+
else
92+
tkl_declare_global "$__var" "$__value"
93+
__read_var=0
94+
fi
95+
done < "$__vars_file"
96+
}
97+
98+
function gh_eval_github_env()
99+
{
100+
[[ -z "$GITHUB_ACTIONS" ]] && return 0
101+
102+
gh_eval_github_env_file "$GITHUB_ENV"
103+
}
104+
105+
if [[ -z "$BASH_LINENO" || BASH_LINENO[0] -eq 0 ]]; then
106+
# Script was not included, then execute it.
107+
gh_enable_github_auto_eval "$@"
108+
fi

bash/github/init-basic-workflow.sh

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,19 @@ source "$GH_WORKFLOW_ROOT/_externals/tacklelib/bash/tacklelib/bash_tacklelib" ||
5353
tkl_include_or_abort "$GH_WORKFLOW_ROOT/bash/github/init-print-workflow.sh"
5454
tkl_include_or_abort "$GH_WORKFLOW_ROOT/bash/github/utils.sh"
5555

56+
# does not enable or disable by default, just does include a functionality
57+
tkl_include_or_abort "$GH_WORKFLOW_ROOT/bash/github/enable-github-env-autoeval.sh"
58+
5659

5760
function init_basic_workflow()
5861
{
59-
if [[ -z "${CHANGELOG_BUF_STR:+x}" ]]; then # to save buffer between workflow steps
60-
tkl_declare_global CHANGELOG_BUF_STR ''
62+
# load GitHub Actions variables at first
63+
if (( GHWF_GITHUB_ENV_AUTOEVAL )); then
64+
gh_eval_github_env
65+
fi
6166

62-
# update GitHub pipeline variable
63-
gh_set_env_var CHANGELOG_BUF_STR "$CHANGELOG_BUF_STR"
67+
if [[ -z "${GHWF_CHANGELOG_BUF_STR:+x}" ]]; then # to save buffer between workflow steps
68+
gh_set_env_var GHWF_CHANGELOG_BUF_STR ''
6469
fi
6570

6671
[[ -z "$CONTINUE_ON_INVALID_INPUT" ]] && CONTINUE_ON_INVALID_INPUT=0
@@ -83,20 +88,17 @@ init_basic_workflow || exit $?
8388
function gh_prepend_changelog_file()
8489
{
8590
(( ! ENABLE_GENERATE_CHANGELOG_FILE )) && return 0
86-
[[ -z "$CHANGELOG_BUF_STR" ]] && return 0
91+
[[ -z "$GHWF_CHANGELOG_BUF_STR" ]] && return 0
8792

8893
if [[ -f "$CHANGELOG_FILE" && -s "$CHANGELOG_FILE" ]]; then
89-
local changelog_buf="${CHANGELOG_BUF_STR}"$'\r\n'"$(< "$CHANGELOG_FILE")"
94+
local changelog_buf="${GHWF_CHANGELOG_BUF_STR}"$'\r\n'"$(< "$CHANGELOG_FILE")"
9095
else
91-
local changelog_buf="${CHANGELOG_BUF_STR}"
96+
local changelog_buf="${GHWF_CHANGELOG_BUF_STR}"
9297
fi
9398

9499
echo -n "$changelog_buf" > "$CHANGELOG_FILE"
95100

96-
CHANGELOG_BUF_STR=''
97-
98-
# update GitHub pipeline variable
99-
gh_set_env_var CHANGELOG_BUF_STR "$CHANGELOG_BUF_STR"
101+
gh_set_env_var GHWF_CHANGELOG_BUF_STR ''
100102
}
101103

102104
tkl_set_return

bash/github/init-print-workflow.sh

Lines changed: 42 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,16 @@ function init_print_workflow()
3030

3131
if [[ -n "$GITHUB_ACTIONS" ]]; then
3232
# to save variables between workflow steps
33-
if [[ -z "${GH_ANNOTATIONS_PRINT_BUF_STR:+x}" ]]; then
34-
tkl_declare_global GH_ANNOTATIONS_PRINT_BUF_STR ''
35-
36-
# update GitHub pipeline variables
37-
gh_set_env_var GH_ANNOTATIONS_PRINT_BUF_STR "$GH_ANNOTATIONS_PRINT_BUF_STR"
33+
if [[ -z "${GHWF_ANNOTATIONS_PRINT_BUF_STR:+x}" ]]; then
34+
gh_set_env_var GHWF_ANNOTATIONS_PRINT_BUF_STR ''
3835
fi
3936

4037
# to save variables between workflow steps
41-
if [[ -z "${GH_ANNOTATIONS_GROUP_ANNOT_TYPE:+x}" ]]; then
42-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_TYPE ''
43-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_PREFIX ''
44-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_MSG ''
45-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_INDEX 0
46-
47-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_TYPE "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE"
48-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_PREFIX "$GH_ANNOTATIONS_GROUP_ANNOT_PREFIX"
49-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_MSG "$GH_ANNOTATIONS_GROUP_ANNOT_MSG"
50-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_INDEX "$GH_ANNOTATIONS_GROUP_ANNOT_INDEX"
38+
if [[ -z "${GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE:+x}" ]]; then
39+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE ''
40+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_PREFIX ''
41+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_MSG ''
42+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX 0
5143
fi
5244
fi
5345

@@ -73,23 +65,23 @@ function gh_flush_print_buffers()
7365
local line
7466

7567
# notices
76-
if [[ -n "${PRINT_NOTICE_BUF_STR+x}" ]]; then
77-
line="${PRINT_NOTICE_BUF_STR}"
78-
unset PRINT_NOTICE_BUF_STR
68+
if [[ -n "${GHWF_PRINT_NOTICE_BUF_STR+x}" ]]; then
69+
line="${GHWF_PRINT_NOTICE_BUF_STR}"
70+
gh_unset_env_var GHWF_PRINT_NOTICE_BUF_STR
7971
gh_print_notices_buffer "$line"
8072
fi
8173

8274
# warnings
83-
if [[ -n "${PRINT_WARNING_BUF_STR+x}" ]]; then
84-
line="${PRINT_WARNING_BUF_STR}"
85-
unset PRINT_WARNING_BUF_STR
75+
if [[ -n "${GHWF_PRINT_WARNING_BUF_STR+x}" ]]; then
76+
line="${GHWF_PRINT_WARNING_BUF_STR}"
77+
gh_unset_env_var GHWF_PRINT_WARNING_BUF_STR
8678
gh_print_warnings_buffer "$line"
8779
fi
8880

8981
# errors
90-
if [[ -n "${PRINT_ERROR_BUF_STR+x}" ]]; then
91-
line="${PRINT_ERROR_BUF_STR}"
92-
unset PRINT_ERROR_BUF_STR
82+
if [[ -n "${GHWF_PRINT_ERROR_BUF_STR+x}" ]]; then
83+
line="${GHWF_PRINT_ERROR_BUF_STR}"
84+
gh_unset_env_var GHWF_PRINT_ERROR_BUF_STR
9385
gh_print_errors_buffer "$line"
9486
fi
9587
}
@@ -100,10 +92,7 @@ function gh_write_to_changelog_text_ln()
10092

10193
local changelog_msg="$1"
10294

103-
CHANGELOG_BUF_STR="${CHANGELOG_BUF_STR}${changelog_msg}"$'\r\n'
104-
105-
# update GitHub pipeline variable
106-
gh_set_env_var CHANGELOG_BUF_STR "$CHANGELOG_BUF_STR"
95+
gh_set_env_var GHWF_CHANGELOG_BUF_STR "${GHWF_CHANGELOG_BUF_STR}${changelog_msg}"$'\r\n'
10796
}
10897

10998
function gh_print_args()
@@ -129,17 +118,15 @@ function gh_print_annotation()
129118
local msg="$3"
130119

131120
#gh_decode_line_return_chars "$msg"
121+
RETURN_VALUE="${RETURN_VALUE//%0D%0A/$'\r\n'\| }"
132122

133123
# stdout redirection must be issued outside
134124
echo "::$annot_type $annot_prefix::$msg"
135125

136126
gh_process_annotation_print "$annot_type" "$annot_prefix" "$msg"
137127

138-
# duplicate output into `GH_ANNOTATIONS_PRINT_BUF_STR` variable to reuse later
139-
GH_ANNOTATIONS_PRINT_BUF_STR="${GH_ANNOTATIONS_PRINT_BUF_STR}${GH_ANNOTATIONS_PRINT_BUF_STR:+"${RETURN_VALUES[0]}"}${RETURN_VALUES[1]}"
140-
141-
# update GitHub pipeline variable
142-
gh_set_env_var GH_ANNOTATIONS_PRINT_BUF_STR "$GH_ANNOTATIONS_PRINT_BUF_STR"
128+
# duplicate output into `GHWF_ANNOTATIONS_PRINT_BUF_STR` variable to reuse later
129+
gh_set_env_var GHWF_ANNOTATIONS_PRINT_BUF_STR "${GHWF_ANNOTATIONS_PRINT_BUF_STR}${GHWF_ANNOTATIONS_PRINT_BUF_STR:+"${RETURN_VALUES[0]}"}${RETURN_VALUES[1]}"
143130
}
144131

145132
function gh_flush_print_annotations()
@@ -151,10 +138,11 @@ function gh_flush_print_annotations()
151138

152139
[[ -z "$GITHUB_ACTIONS" ]] && return 0
153140

154-
IFS=$'\n'; for line in "$GH_ANNOTATIONS_PRINT_BUF_STR"; do
141+
IFS=$'\n'; for line in "$GHWF_ANNOTATIONS_PRINT_BUF_STR"; do
155142
gh_trim_trailing_line_return_chars "$line"
156143

157-
#gh_decode_line_return_chars "$RETURN_VALUE"
144+
# gh_decode_line_return_chars "$RETURN_VALUE"
145+
RETURN_VALUE="${RETURN_VALUE//%0D%0A/$'\r\n'\| }"
158146

159147
IFS=':' read -r empty empty annot_type <<< "$RETURN_VALUE"
160148
IFS=$'\t ' read -r annot_type empty <<< "$annot_type"
@@ -165,10 +153,7 @@ function gh_flush_print_annotations()
165153
esac
166154
done
167155

168-
unset GH_ANNOTATIONS_PRINT_BUF_STR
169-
170-
# update GitHub pipeline variable
171-
gh_set_env_var GH_ANNOTATIONS_PRINT_BUF_STR "$GH_ANNOTATIONS_PRINT_BUF_STR"
156+
gh_unset_env_var GHWF_ANNOTATIONS_PRINT_BUF_STR
172157
}
173158

174159
# NOTE: Groups only annotations with the same type.
@@ -200,40 +185,28 @@ function gh_flush_print_annotations()
200185
function gh_begin_print_annotation_group()
201186
{
202187
[[ -z "$GITHUB_ACTIONS" ]] && return 0
203-
[[ -n "${GH_ANNOTATIONS_GROUP_ANNOT_TYPE:+x}" ]] && return 0 # ignore if previous group is not closed/ended
188+
[[ -n "${GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE:+x}" ]] && return 0 # ignore if previous group is not closed/ended
204189

205190
local annot_type="$1" # required
206191
local annot_prefix="$2"
207192
local msg="$3"
208193

209194
[[ -z "$annot_type" ]] && return 0
210195

211-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_TYPE "$annot_type"
212-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_PREFIX "$annot_prefix"
213-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_MSG "$msg"
214-
tkl_declare_global GH_ANNOTATIONS_GROUP_ANNOT_INDEX 0
215-
216-
# update GitHub pipeline variable
217-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_TYPE "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE"
218-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_PREFIX "$GH_ANNOTATIONS_GROUP_ANNOT_PREFIX"
219-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_MSG "$GH_ANNOTATIONS_GROUP_ANNOT_MSG"
220-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_INDEX "$GH_ANNOTATIONS_GROUP_ANNOT_INDEX"
196+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE "$annot_type"
197+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_PREFIX "$annot_prefix"
198+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_MSG "$msg"
199+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX 0
221200
}
222201

223202
function gh_end_print_annotation_group()
224203
{
225204
[[ -z "$GITHUB_ACTIONS" ]] && return 0
226205

227-
unset GH_ANNOTATIONS_GROUP_ANNOT_TYPE
228-
unset GH_ANNOTATIONS_GROUP_ANNOT_PREFIX
229-
unset GH_ANNOTATIONS_GROUP_ANNOT_MSG
230-
unset GH_ANNOTATIONS_GROUP_ANNOT_INDEX
231-
232-
# update GitHub pipeline variable
233-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_TYPE "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE"
234-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_PREFIX "$GH_ANNOTATIONS_GROUP_ANNOT_PREFIX"
235-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_MSG "$GH_ANNOTATIONS_GROUP_ANNOT_MSG"
236-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_INDEX "$GH_ANNOTATIONS_GROUP_ANNOT_INDEX"
206+
gh_unset_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE
207+
gh_unset_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_PREFIX
208+
gh_unset_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_MSG
209+
gh_unset_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX
237210
}
238211

239212
# prefixes a print message with annotation data
@@ -243,27 +216,23 @@ function gh_process_annotation_print()
243216
local annot_prefix="$2"
244217
local msg="$3"
245218

246-
if [[ -n "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE" && "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE" == "$annot_type" ]]; then
247-
if (( GH_ANNOTATIONS_GROUP_ANNOT_INDEX )); then
248-
tkl_declare_global_array RETURN_VALUES "%0A" "$msg"
219+
if [[ -n "$GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE" && "$GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE" == "$annot_type" ]]; then
220+
if (( GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX )); then
221+
tkl_declare_global_array RETURN_VALUES "%0D%0A" "$msg"
249222
else
250-
tkl_declare_global_array RETURN_VALUES $'\r\n' "::$GH_ANNOTATIONS_GROUP_ANNOT_TYPE $GH_ANNOTATIONS_GROUP_ANNOT_PREFIX::${GH_ANNOTATIONS_GROUP_ANNOT_MSG}${GH_ANNOTATIONS_GROUP_ANNOT_MSG:+"%0A"}$msg"
223+
tkl_declare_global_array RETURN_VALUES $'\r\n' "::$GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE $GHWF_ANNOTATIONS_GROUP_ANNOT_PREFIX::${GHWF_ANNOTATIONS_GROUP_ANNOT_MSG}${GHWF_ANNOTATIONS_GROUP_ANNOT_MSG:+"%0D%0A"}$msg"
251224
fi
252225

253-
(( GH_ANNOTATIONS_GROUP_ANNOT_INDEX++ ))
226+
(( GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX++ ))
227+
228+
gh_update_github_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX
254229
else
255-
if [[ -n "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE" ]]; then
256-
# reset index only to group next prints
257-
GH_ANNOTATIONS_GROUP_ANNOT_INDEX=0
230+
if [[ -n "$GHWF_ANNOTATIONS_GROUP_ANNOT_TYPE" ]]; then
231+
gh_set_env_var GHWF_ANNOTATIONS_GROUP_ANNOT_INDEX 0
258232
fi
259233

260234
tkl_declare_global_array RETURN_VALUES $'\r\n' "::$annot_type $annot_prefix::$msg"
261235
fi
262-
263-
if [[ -n "$GH_ANNOTATIONS_GROUP_ANNOT_TYPE" ]]; then
264-
# update GitHub pipeline variable
265-
gh_set_env_var GH_ANNOTATIONS_GROUP_ANNOT_INDEX "$GH_ANNOTATIONS_GROUP_ANNOT_INDEX"
266-
fi
267236
}
268237

269238
tkl_set_return

bash/github/init-yq-workflow.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,17 @@
3434
# Usage example:
3535
#
3636
# >
37-
# yq_edit '<prefix-name>' 'edit' "<input-yaml>" "$TEMP_DIR/<output-yaml-edited>" \
37+
# yq_edit "<prefix-name>" "<suffix-name>" "<input-yaml>" "$TEMP_DIR/<output-yaml-edited>" \
3838
# <list-of-yq-eval-strings> && \
3939
# yq_diff "$TEMP_DIR/<output-yaml-edited>" "<input-yaml>" "$TEMP_DIR/<output-diff-edited>" && \
4040
# yq_restore_edited_uniform_diff "$TEMP_DIR/<output-diff-edited>" "$TEMP_DIR/<output-diff-edited-restored>" && \
4141
# yq_patch "$TEMP_DIR/<output-yaml-edited>" "$TEMP_DIR/<output-diff-edited-restored>" "$TEMP_DIR/<output-yaml-edited-restored>" "<output-yaml>" ["<input-yaml>"]
4242
#
4343
# , where:
4444
#
45+
# <prefix-name> - prefix name part for files in the temporary directory
46+
# <suffix-name> - suffix name part for files in the temporary directory
47+
#
4548
# <input-yaml> - input yaml file path
4649
# <output-yaml> - output yaml file path
4750
#

0 commit comments

Comments
 (0)