Skip to content

ci(smoke): Build (macOS) always fails — timeout is GNU coreutils, absent on macOS runners #380

Description

@laurigates

Problem

The Build (macOS) job added in #374 has never passed. It fails at the zsh-load step:

/Users/runner/work/_temp/….sh: line 1: timeout: command not found
##[error]Process completed with exit code 127

smoke.yml:139 calls timeout 60s zsh -c "…" unconditionally. timeout is GNU coreutils — macOS runners ship neither timeout nor gtimeout unless coreutils is brewed. The Ubuntu job passes because coreutils is the system default there.

Impact

Every PR opened since #374 shows a red Build (macOS), and main itself is red:

Run Head Result
2026-08-19 18:19Z fe31477b"ci(smoke): add a macOS build job alongside Ubuntu (#374)" failure
2026-08-19 17:39Z 3ff358b5 success (pre-macOS-job)

Found while driving #378 to green — its Build (macOS) failure reproduces on main with an untouched smoke.yml, so it is this, not that PR.

Fix

Two options.

A — install coreutils on macOS (keeps the run step identical across platforms):

- name: Install coreutils (macOS)
  if: runner.os == 'macOS'
  run: brew install coreutils

…then timeout resolves via the gnubin path, or call gtimeout explicitly.

B — drop the coreutils dependency (no install step, works on both):

- run: |
    perl -e 'alarm 60; exec @ARGV' zsh -c '
      source ~/.zshrc
      [[ -n "$ZSH_VERSION" ]] || { echo "❌ zsh configuration failed to load"; exit 1; }
      echo "✅ zsh $ZSH_VERSION configuration loaded successfully"
    '

Recommend B. perl is preinstalled on both runner images, it adds no Homebrew step to every macOS run, and it preserves the "60 s is the ceiling" intent that the comment above line 139 spells out. The alarm fires SIGALRM and the process dies non-zero, so the job still fails on a hang — same semantics as timeout.

Acceptance

  • Build (macOS) passes on main.
  • A deliberately hanging ~/.zshrc still fails the job rather than running to the 6-hour job limit — worth verifying once, since that is the whole point of the ceiling.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions