From 2c35d33a28082b900b0a0d050c704dcd8597ccaa Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Tue, 11 Aug 2026 16:46:37 +0200 Subject: [PATCH] fix(.github/workflows): run windows mise install under bash, tolerate missing mtimehash (#28020) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes coder/internal#1630 (Linear CODAGT-879). ## Problem `test-go-pg (windows-2022)` flaked with `mtimehash: command not found` (exit 127) before any tests ran. The `Install Go mise tools` step ran `retry.sh` (a bash script) without `shell: bash`, so Windows executed it under the default PowerShell shell, which reports success without actually running the install. A warm mise tool cache masks the defect, making it intermittent. #27483 fixed the `ci.yaml` `test-go-pg` step, but two gaps remained. ## Changes - **`nightly-gauntlet.yaml`**: add `shell: bash` to its `Install Go mise tools` step, which had the identical unfixed defect on the `windows-2022` matrix entry (installs `gotestsum` the same way). - **`ci.yaml`**: the `Normalize File and Directory Timestamps` step now warns and skips instead of failing the job when `mtimehash` is missing, since it only optimizes Go test cache hits. This is the follow-up hardening suggested in coder/internal#1630 so a cache helper can never again prevent the tests from running. ## Reproduction and verification on a real Windows runner A temporary workflow on this branch (removed in the final commit) recreated the pre-#27483 step shape on `depot-windows-2022-16` with the mise CI cache disabled to emulate the cache-miss path: - **Repro run [31484281427](https://github.com/coder/coder/actions/runs/31484281427)**: the default-shell install step reported `success` under `pwsh.EXE` with no install output; the subsequent bash step failed with `mtimehash: command not found`, pipeline exit code 127 — exactly matching the flake evidence. - **Verification run [31484905616](https://github.com/coder/coder/actions/runs/31484905616)** (all green): with `shell: bash`, mise builds mtimehash and the exact production `find . -type f ! -path ./.git/\*\* | mtimehash` command runs cleanly. ## Validation - `actionlint` and `make lint/actions/zizmor` pass on the modified workflows. - Pre-commit hooks green on all commits. --- _Generated with [`mux`](https://github.com/coder/mux) • Model: `anthropic:claude-fable-5` • Thinking: `xhigh`_ --- .github/workflows/ci.yaml | 9 ++++++++- .github/workflows/nightly-gauntlet.yaml | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e323e618e8..87eaa51632 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -605,8 +605,15 @@ jobs: # Normalize file modification timestamps so that go test can use the # cache from the previous CI run. See https://github.com/golang/go/issues/58571 # for more details. + # + # mtimehash only optimizes cache hits, so a missing binary must not + # fail the job before any tests run (coder/internal#1630). run: | - find . -type f ! -path ./.git/\*\* | mtimehash + if command -v mtimehash >/dev/null 2>&1; then + find . -type f ! -path ./.git/\*\* | mtimehash + else + echo "::warning::mtimehash not found; skipping file timestamp normalization (Go test cache may be cold)" + fi find . -type d ! -path ./.git/\*\* -exec touch -t 200601010000 {} + - name: Normalize Terraform Path for Caching diff --git a/.github/workflows/nightly-gauntlet.yaml b/.github/workflows/nightly-gauntlet.yaml index 0fd61bb9a2..9ca10e1bd0 100644 --- a/.github/workflows/nightly-gauntlet.yaml +++ b/.github/workflows/nightly-gauntlet.yaml @@ -68,6 +68,11 @@ jobs: install-args: "go terraform" - name: Install Go mise tools + # retry.sh is a bash script, so an explicit shell is required for the + # Windows matrix entry. Under the default PowerShell shell the step + # reports success without running the install, so gotestsum is + # silently missing whenever the mise cache misses (coder/internal#1630). + shell: bash run: ./.github/scripts/retry.sh -- mise install --locked go:gotest.tools/gotestsum - name: Setup Embedded Postgres Cache Paths