fix(.github/workflows): run windows mise install under bash, tolerate missing mtimehash (#28020)

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`_
This commit is contained in:
Thomas Kosiewski
2026-08-11 16:46:37 +02:00
committed by GitHub
parent d7953bd046
commit 2c35d33a28
2 changed files with 13 additions and 1 deletions
+8 -1
View File
@@ -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
+5
View File
@@ -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