macos-ci-recipeslisted
Install: claude install-skill patrickserrano/lacquer
# macOS CI Recipes
Two shapes, depending on whether an iOS target coexists in the same project.
Both reuse the lacquer's existing iOS CI conventions (dedicated runner,
`CODE_SIGNING_ALLOWED=NO` for non-release jobs, the exit-65 spurious-failure
handling, the error-tail grep on real failures) — nothing here is a new
pattern, just the iOS pattern applied to `-destination 'platform=macOS'`.
**Why the dedicated runner, not a GitHub-hosted macOS one:** these jobs (and
any other Xcode-touching job you add) must run on
`runs-on: [self-hosted, macOS, ARM64, dedicated]` — never `macos-latest` or a
stray label like `mac-mini`. Release jobs hold App Store Connect keys and
unlock the login keychain, so signing must only ever happen on infrastructure
you control; the pinned Xcode + simulator runtime lives only on the dedicated
runner (GitHub-hosted macOS images drift); and GitHub-hosted macOS minutes are
billed while the dedicated runner isn't. A pure script/REST-call job with no
Xcode dependency uses `ubuntu-latest` instead.
## Which recipe
- **No iOS target at all** (a macOS-only app on the `ios` profile): use
"macOS-only app" below. It replaces the synced `ios-ci.yml` outright —
`exclude` it in `.lacquer.toml` and add this file to your project's `root/`
tree instead (the lacquer already supports excluding a synced file; this
is that mechanism, just pointed at CI instead of release/testflight).
- **An iOS target plus a separate macOS scheme sharing code** (e.g. a shared
`C