Skip to content

D997 — macOS is tested on a real runner when it can break

Decision. A test-macos job on macos-latest runs three scripts under test/macos/: the launchd service installed, restarted, stopped and removed for real; install.sh install and update over a real running service (the fake curl of test/install/ serves the release, nothing touches the network); and the Cask GoReleaser renders in snapshot mode, installed by Homebrew from a local tap where only the url is rewritten. The job runs on the release PR, on a PR touching its inputs (the macos output of scripts/ci-filters.sh), on main and on workflow_dispatch; it is not a required check and main-status watches it. The scripts run with the runner's real $HOME, never a sandbox one, and refuse to run outside CI unless CARTOGRAPHER_MACOS_E2E=1.

Why. The primary desktop target was never run on macOS by CI: launchd was asserted through a stub runner, install.sh against a fake binary, the Cask by a grep of .goreleaser.yaml. A break in any of them reached users on a release day.

Alternatives rejected. Running on every PR: macOS runners queue slowly, and the Windows leg already shows the cost of an always-on slow leg. A sandbox HOME: the service code registers a job only when $HOME is the account's own home (#683), so a sandbox would test nothing. A second harness: the existing shell harness already serves the release list and the asset.

Consequences. make gate stays side-effect-free: nothing registers a launchd job outside this job. Running the scripts on a Mac that has its own Cartographer service would replace it (same label), hence the CI guard.