fix: openbao-fetch breaks when apt transiently fails #57
Labels
No labels
priority/P0
priority/P1
priority/P2
priority/P3
size/L
size/M
size/S
size/XL
size/XS
state/blocked
state/done
state/in-progress
state/in-review
state/needs-refinement
state/ready
type/bug
type/chore
type/feature
type/refactor
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
amtronics/platform-actions#57
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
openbao-fetch installs its two runtime dependencies (
curl,jq) with an in-jobapt-getwhen the job container lacks them. On 2026-09-07 ahmad/trip's main run 2462 went red because Debian's bullseye-securityInReleasewas momentarily expired ("invalid since 34s"): apt failed,jqstayed absent, the OpenBao fetch exited 127, and the downstream notify-telegram step never ran. A transient mirror or clock hiccup at any consumer thus fails jobs that need no network beyond the vault and Telegram — and it will strike deploy jobs the same way, not just notifications. The action already runs inside node images, where a JSON parser is guaranteed without any package install; report-job-failure shed its jq dependency for the same class of reason (#53).Scope
Acceptance criteria
check-actions.pyruns, then it passes.Second occurrence within the hour, widening the evidence beyond openbao-fetch: ahmad/expiro PR #66's
imagejob died at its own in-workflowapt-geton the identical signature —Release file for …/bullseye-security/InRelease is expired (invalid since 3min 50s)(job 6329, 21:16Z; trip's notify wasinvalid since 34sat 21:13Z). The invalid-since delta tracking wall time says the mirror's Valid-Until lapsed and the runner kept fetching the stale file — so every in-jobapt-getin the fleet shares this failure mode, not just this action's. Worth keeping this issue scoped to openbao-fetch (guaranteed-parser fix), but the general pattern is: an apt failure inside a job is a transient signature, and jobs should not depend on apt at runtime where the image already carries what they need.Permanence update, third repo and fifth failure: this is not a lazy CDN. suhba/khitta run 2468 (21:43Z) and two more expiro re-runs show the identical signature with the invalid-since delta still tracking wall time (now 30min+). Debian 11 LTS ended 2026-08-31; the affected jobs run in the runner's default bullseye-based container, and bullseye-security's final InRelease has now aged out for good — no retry will ever fix an in-job
apt-get updatethere again. Fleet fix filed as an infrastructure issue (runner default image); this issue remains the right action-level fix: openbao-fetch runs on node images where a JSON parser needs no package install at all.Plan. One file, openbao-fetch/action.yml, the fetch step. The deciding fact, read from the runner config: the default job label maps to
node:20-bullseye, and every declared container in the fleet is a node image too — sonodeis on PATH wherever this action runs, and both jq parses (login token extract, kv-to-KEY=VALUE render) becomenode -eone-liners with no package install at all. curl stays required (present in every node Debian image); the on-demand apt fallback shrinks to curl-only and is effectively dead code on the fleet, kept as a last resort. A missing node fails fast with a message naming the requirement rather than reaching for apt. Behavioural note recorded here: a malformed vault response now fails the step (JSON.parse throws) where jq would emit empty output and exit 0 — stricter, and the right direction. Verification: bash -n via check-actions.py, plus a local round trip of both parsers against captured-shape fixtures (login response with and without client_token; kv response with several field types), and the existing consumers' inputs untouched — criterion 2.