A gate for the weekly refresh, and the lever that makes it testable #248
@@ -89,12 +89,30 @@ on:
|
|||||||
# makes the milestone-362 gate verifiable at all: a gate has to be watched
|
# makes the milestone-362 gate verifiable at all: a gate has to be watched
|
||||||
# rejecting something before anyone can believe it is wired up.
|
# rejecting something before anyone can believe it is wired up.
|
||||||
#
|
#
|
||||||
# Note this is a STRING comparison, not a boolean. Forgejo delivers
|
# The input is normalised through `format()` before it is compared, and that
|
||||||
# workflow_dispatch inputs as strings, so `inputs.refresh` is 'true'/'false'
|
# is not defensive styling — the direct comparison is WRONG and fails silently.
|
||||||
# and `&&` on it would treat the string 'false' as truthy.
|
#
|
||||||
|
# `type: boolean` delivers a real boolean, and GitHub expression semantics cast
|
||||||
|
# operands to numbers when their types differ: `true == 'true'` compares 1
|
||||||
|
# against NaN and is FALSE. Measured on run 5270, whose own log says it —
|
||||||
|
#
|
||||||
|
# expression '(github.event_name == 'schedule'
|
||||||
|
# || github.event.inputs.refresh == 'true') && 'true' || 'false''
|
||||||
|
# evaluated to '%!t(string=false)'
|
||||||
|
# trigger: raw inputs refresh='true'
|
||||||
|
#
|
||||||
|
# — the input arrived as `true` and the expression still said false. The run
|
||||||
|
# then went green with every step skipped, because a refresh that evaluates
|
||||||
|
# false behaves exactly like an ordinary push. That is the whole hazard: the
|
||||||
|
# failure has no symptom.
|
||||||
|
#
|
||||||
|
# `force_build` never hit this because it never compares in an expression. It
|
||||||
|
# passes the raw value into an env var and tests it in the shell, where
|
||||||
|
# everything is already a string. `format('{0}', x)` buys the same thing here,
|
||||||
|
# where a step-level `if:` needs the answer before any shell runs.
|
||||||
env:
|
env:
|
||||||
IS_REFRESH: ${{ (github.event_name == 'schedule' || github.event.inputs.refresh == 'true') && 'true' || 'false' }}
|
IS_REFRESH: ${{ (github.event_name == 'schedule' || format('{0}', github.event.inputs.refresh) == 'true') && 'true' || 'false' }}
|
||||||
BUILD_REF: ${{ (github.event_name == 'schedule' || github.event.inputs.refresh == 'true') && 'main' || github.ref }}
|
BUILD_REF: ${{ (github.event_name == 'schedule' || format('{0}', github.event.inputs.refresh) == 'true') && 'main' || github.ref }}
|
||||||
|
|
||||||
# Requires repo secret RELEASE_TOKEN — a Forgejo PAT with scopes:
|
# Requires repo secret RELEASE_TOKEN — a Forgejo PAT with scopes:
|
||||||
# - write:package, read:package (for docker push to git.fabledsword.com)
|
# - write:package, read:package (for docker push to git.fabledsword.com)
|
||||||
|
|||||||
Reference in New Issue
Block a user