thermograph/.forgejo/workflows
emi de8e847f9f
All checks were successful
Build + push backend image (Forgejo registry) / build-push (push) Successful in 1m23s
Build + push frontend image (Forgejo registry) / build-push (push) Successful in 1m22s
Sync infra to hosts / sync-beta (push) Successful in 9s
Sync infra to hosts / sync-prod (push) Successful in 8s
secrets-guard / encrypted (push) Successful in 6s
shell-lint / shellcheck (push) Successful in 9s
Deploy backend to beta VPS / deploy (push) Successful in 2m4s
Deploy frontend to beta VPS / deploy (push) Successful in 1m8s
shell: add shellcheck CI guard and drive the tree to zero findings (#19)
Adds .forgejo/workflows/shell-lint.yml (pinned shellcheck v0.11.0 + sha256, -x,
default severity, fail on any finding, not path-filtered) and drives all 26
scripts to zero findings.

Two defects shellcheck cannot see:

render-secrets.sh left DECRYPTED vault contents in /tmp whenever a sops decrypt
failed -- the caller's set -e aborted the function before either cleanup ran.
Now removed on every exit path, with `|| return 1` on both sops calls so a
decrypt failure can never write a partial /etc/thermograph.env regardless of the
caller's shell options. Explicitly not a `trap ... RETURN`: such a trap set in a
sourced function persists into the caller's shell and re-fires when the caller's
next `.`/source completes, where the function-local tmp is unset -- fatal and
silent under deploy.sh's set -u. The file now records that reasoning.

autoscale.sh ran `set -eu` without pipefail while piping docker stats into awk,
so a failed left side was swallowed and the loop autoscaled on empty input.
Promoted to pipefail with a missed sample treated as a skip; verified busybox ash
in docker:27-cli supports it.

Also: capture-fixtures.sh's `jq . || cat` ran cat after jq had consumed stdin,
silently writing truncated fixtures; deploy.sh/deploy-stack.sh `# shellcheck
source=` paths corrected for the monorepo layout.
2026-07-23 22:26:05 +00:00
..
backend-build-push.yml Key image tags to the last domain-touching commit, not the branch tip (#3) 2026-07-23 13:42:28 +00:00
backend-deploy-dev.yml Key image tags to the last domain-touching commit, not the branch tip (#3) 2026-07-23 13:42:28 +00:00
backend-deploy-prod.yml Finish the domain-sha tag keying: three deploy workflows were missed (#6) 2026-07-23 13:58:57 +00:00
backend-deploy.yml Key image tags to the last domain-touching commit, not the branch tip (#3) 2026-07-23 13:42:28 +00:00
build.yml CI: port the dev-branch in-image test step into the reusable build check 2026-07-22 22:24:31 -07:00
frontend-build-push.yml Key image tags to the last domain-touching commit, not the branch tip (#3) 2026-07-23 13:42:28 +00:00
frontend-deploy-dev.yml Key image tags to the last domain-touching commit, not the branch tip (#3) 2026-07-23 13:42:28 +00:00
frontend-deploy-prod.yml Finish the domain-sha tag keying: three deploy workflows were missed (#6) 2026-07-23 13:58:57 +00:00
frontend-deploy.yml Finish the domain-sha tag keying: three deploy workflows were missed (#6) 2026-07-23 13:58:57 +00:00
infra-sync.yml CI: port the split repos' workflows to per-domain path-filtered monorepo pipelines 2026-07-22 22:11:33 -07:00
observability-validate.yml CI: port the split repos' workflows to per-domain path-filtered monorepo pipelines 2026-07-22 22:11:33 -07:00
ops-cron.yml CI: port the split repos' workflows to per-domain path-filtered monorepo pipelines 2026-07-22 22:11:33 -07:00
pr-build.yml CI: port the split repos' workflows to per-domain path-filtered monorepo pipelines 2026-07-22 22:11:33 -07:00
secrets-guard.yml CI: port the split repos' workflows to per-domain path-filtered monorepo pipelines 2026-07-22 22:11:33 -07:00
shell-lint.yml shell: add shellcheck CI guard and drive the tree to zero findings (#19) 2026-07-23 22:26:05 +00:00