fix(ci): run clone-manifest shell tests with bash, not dash #3202
Reference in New Issue
Block a user
Delete Branch "fix/ops-scripts-shelltests-bash-not-dash"
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?
Problem
The two clone-manifest shell-test steps I wired into
test-ops-scripts.yml(in #3193 + #3187) have been failing onmain, keeping theOps Scripts Testslane red.Root cause — sh-vs-dash: the CI runner's
/bin/shis dash, and the test harnesses invokedclone-manifest.shviash.clone-manifest.shusesset -o pipefail, which dash rejects:So the script died immediately and the tests failed. It passed locally only because macOS
/bin/shis bash (accepts pipefail) — the bug was masked. Production always runsclone-manifest.shviabash(publish-workspace-server-image.yml,harness-replays.yml), so the tests should too.Fix
clone-manifest.shwithbash(notsh).bash.Verification (local)
Before this change, both FAILED under dash.
dash -nsyntax clean, yaml valid.Note:
Ops Scripts Testsiscontinue-on-error: true(advisory, RFC §1) so this was never merge-blocking — but it kept the lane red, which masks real regressions.🤖 Generated with Claude Code
APPROVED: focused CI harness fix on
d07e585. The bash invocation is complete: test-ops-scripts.yml runs both clone-manifest harnesses with bash, and both harnesses invoke clone-manifest.sh with bash, matching the script's use ofset -o pipefailand avoiding dash on the runner. No clone-manifest production logic or token/provider behavior changed; this is limited to test harness execution/comments. Ops Scripts Tests and CI/all-required are green on this head; remaining gate/review reds are non-code gate state, not a blocker to this verdict.APPROVED on
d07e585.5-axis review: this is a CI/test-harness-only fix. It does not alter clone-manifest production logic. The workflow now invokes both clone-manifest shell harnesses with bash, and each harness now invokes clone-manifest.sh with bash as well, matching production usage and avoiding dash rejecting
set -o pipefail.Correctness/robustness: the change is complete for the two affected harnesses, preserving the established clone-manifest guarantees being tested: tokenless mode still only skips private:true repos and public failures abort; provider-specific token selection and unknown-provider fail-closed remain covered by the provider harness. Security: no secret-handling behavior is changed. Readability: the comments explain why bash is required so this does not regress back to sh/dash.
Verification: live CI shows Ops Scripts Tests green and CI / all-required green on this head. My local container lacks jq, so I did not use the local harness run as signal.