chore(github-actions): update ppat/github-workflows (v4.4.0 -> v5.0.1) - #877
Conversation
Bumps every ppat/github-workflows ref (renovate.yaml, lint.yaml x11, release.yaml x2) to the v5.0.1 tag. No workflow_call.inputs used by this repo were renamed or removed between v4.4.0 and v5.0.1. Supersedes #876 (the Renovate PR proposing v4.4.0 -> v5.0.0), which is left untouched.
…hellcheck
v5's lint-github-actions.yaml turns on actionlint's shellcheck integration
(actionlint v1.7.4 -> v1.7.12), which was previously inert. That surfaces
the first real shellcheck pass over this repo's own workflow `run:`
blocks (lint.yaml, release.yaml) - actionlint appends --norc, so
.shellcheckrc does not filter these.
18 findings total, all fixed by quoting or declare/assign-separation,
never by changing what arguments a command receives:
- lint.yaml (terraform-dirs job): 1x SC2086 on `>> $GITHUB_OUTPUT`. This
is a redirection target, not argv, so bash never word-splits it -
quoting is behavior-preserving.
- release.yaml (Login to Coder step): 4x SC2086 on `${CODER_URL}`
(curl/coder login args) + 2x SC2155 on `export VAR=$(curl ...)`.
CODER_URL is a single secret URL, never a list, so quoting cannot
change argv count; declare/assign-separation only changes when the
subshell's exit status would be masked, and nothing here checks it.
- release.yaml (Publish template step): 8x SC2086 on
${TEMPLATE_DIR}/${TEMPLATE_VERSION}/${TEMPLATE_NAME}/${WORKSPACE_IMAGE}
(all scalars, never space-separated lists) + 3x SC2155 on `export
VAR=$(...)`. Verified with an argv-echoing stub that `coder template
push` and the `curl`/jq calls receive byte-identical argv before and
after, for representative values.
`--var test_mode=${TEST_MODE}` was left unquoted deliberately: shellcheck
does not flag it (TEST_MODE is only ever assigned the literal `true` or
`false`), and quoting it would be an unrequested change with no finding
behind it.
No inline `# shellcheck disable=` was needed: none of this repo's local
run: blocks build an argv list from a space-separated variable the way
upstream's ${ACTIONS_FILES}/${SHELLSCRIPT_FILES}-style callers do, so
none of the findings fall under the word-splitting-is-intentional
carve-out.
CI statusPR event run (https://github.com/ppat/coder/actions/runs/32340670273 + the paired
Path-gated out of the PR event (no Dispatched run (
Every job this repo's |
Summary
Bumps every
ppat/github-workflowsref from v4.4.0 to v5.0.1(
667d20d10c8756b11feeab1ee691825ccea8f991, verified to resolve to thev5.0.1tag) and fixes what v5 breaks in this repo, minimally.Supersedes #876 (
chore(github-actions): update ppat/github-workflows (v4.4.0 -> v5.0.0)) — left open/untouched per instructions; please closeit manually once this merges.
Per standing instruction for this batch: this PR does not touch
commitlint.config.js/scope-enumand does not bump therenovate-presetspin (staysv0.2.1).Refs bumped (14 occurrences, all confirmed gone from the old pin)
1e8ca1b00b6e69bdf5aef8b33111c594c051ff65 # v4.4.0→667d20d10c8756b11feeab1ee691825ccea8f991 # v5.0.1.github/workflows/renovate.yaml— 1x (renovate.yaml).github/workflows/lint.yaml— 11x (detect-changed-files.yaml,lint-commit-messages.yaml,lint-github-actions.yaml,lint-markdown.yaml,lint-hadolint.yaml,lint-pre-commit.yaml,lint-renovate-config-check.yaml,lint-shellcheck.yaml,lint-terraform.yaml,lint-yaml.yaml,lint-zizmor.yaml).github/workflows/release.yaml— 2x (release-semantic.yaml,build-docker-image.yaml)workflow_call.inputsfor every called workflow was diffed v4.4.0→v5.0.1:no renames or removals affect any call site here.
lint-zizmor.yamlgained four new optional inputs (
advisory_only,min_confidence,min_severity,persona), all defaulting to current behavior — notadopted, since this batch is scoped to "make v5 work," not "adopt every
new knob."
Why anything needed fixing: actionlint's shellcheck integration
v5's
lint-github-actions.yamlbumpsactionlintv1.7.4 → v1.7.12,which turns on
actionlint -shellcheck's integration — previously inertbecause
set -xstyle debug output made it look like it ran, butactionlintnever actually invoked shellcheck under v4. This is thefirst real shellcheck pass over this repo's own workflow
run:blocks(the reusable workflows in
ppat/github-workflowswere already fixedupstream). actionlint appends
--norc, so this repo's.shellcheckrcdoes not filter these findings — every finding had tobe triaged inline.
Reproduced locally exactly as v5's
lint-github-actions.yamlruns it:actionlint -shellcheck shellcheck(mise-pinned to the exact versionsv5 pins: actionlint v1.7.12, shellcheck v0.11.0), over this repo's
.github/workflows/*.yaml.Findings (18 total) — all fixed, none suppressed
lint.yaml—terraform-dirs(pre-existing)SC2086on>> $GITHUB_OUTPUT>> "$GITHUB_OUTPUT"release.yaml— Login to CoderSC2086on${CODER_URL}(curl ×3,coder login)CODER_URLis a single secret URL, never a list — quoting a scalar can't change argv count.release.yaml— Login to CoderSC2155onexport CODER_SESSION_TOKEN=$(curl ...),export CODER_VERSION=$(curl ...)export VAR+VAR=$(...)exportline — nothing here does (noset -e, no$?check).release.yaml— Publish templateSC2086on${TEMPLATE_DIR},${TEMPLATE_VERSION},${TEMPLATE_NAME},${WORKSPACE_IMAGE}(incoder template pushargs, theif echo $TEMPLATE_VERSIONcheck, and inside ajqfilter string)release.yaml— Publish templateSC2155onexport TEMPLATE_NAME=...(×2),export SELECTED_TEMPLATE=$(...)Not touched:
--var test_mode=${TEST_MODE}was left unquoted.Shellcheck does not flag it —
TEST_MODEis only ever assigned theliteral
true/false, so shellcheck's flow analysis already proves itsafe — and quoting it would be an unrequested change with no finding
behind it.
No
# shellcheck disable=was needed anywhere. The word-splittingcarve-out (SC2086/SC2046/SC2016/SC2154 left alone when a variable
deliberately holds a space-separated list that must expand to N argv
elements — see upstream's
${ACTIONS_FILES}/${SHELLSCRIPT_FILES}/${DOCKER_FILES}handling) doesn't apply to any finding here: none ofthis repo's local
run:blocks build an argv list from aspace-separated variable.
Argv-equivalence proof
Ran a stub (
coder/curl/jqreplaced with argv-echoing functions)against representative values for every quoted variable — before vs.
after produced byte-identical argv, for both the
coder template push \ --directory ... --var ... --name ... "${TEMPLATE_NAME}"line andthe
curl/coder login/jqcalls in the Login step. Also demonstratedthe pathological case (a value containing a space) to show the fix is
strictly safer, not merely equivalent, without changing token count
for any real-world input:
For normal (space-free) values,
ARGC/ARGV[]are identical in bothforms — confirmed for
coder template push(14 argv elements, bytematch) and all three
curlcalls.Also verified
actionlint -shellcheck shellcheckover all.github/workflows/*.yaml: 0 findings, exit 0 (was 18 findings, exit 1, before the fix commit).yamllint -c .yamllint --strict(pinned 1.38.0, matches v5's pin) on the changed files: clean.zizmor --format=github --min-severity=medium --min-confidence=high --persona=regular .(pinned v1.29.0, matches v5's pin): 0 findings.pre-commithooks (as configured in this repo) passed on both commits.Other v5 changes not applicable / not adopted here
lint-shellcheck.yaml's file-selection change (executable-bit only →executable and shebang/extension-filtered): simulated both
selectors against this repo's files. Only 2 files carry the
executable bit (
script-memory-watchdog-test.sh,script-prepare-workspace.sh), and both already end in.sh, so thelinted file set is identical before and after — no coverage
change, no explanation needed beyond that. (This job is path-gated
out of this PR since no
.shfiles changed — see CI section below.)lint-shellcheck.yaml's new PASS/FAIL-per-file output andrenovate-config-validatorbump (44.14.12 → 44.30.4): internal to thereusable workflow, nothing in this repo needed to change.
lint-zizmor.yaml's four new optional inputs: not adopted (alldefault to current behavior; out of scope for "just the bump").
CI status
Job naming and which run verified what:
(filled in after push — see follow-up comment)