Ollie is an Electron macOS app that needs to be code-signed, built, and E2E tested on real Apple Silicon hardware for every PR. GitHub's hosted macOS runners are slow and expensive for this — a self-hosted runner on a local Mac gives us fast builds with native arm64 performance and access to the macOS keychain for code signing.
| Runner | Workflow | What it does |
|---|---|---|
| Self-hosted (macOS arm64) | pr-check.yml |
Unit tests, service tests, code-signed build, Playwright E2E tests, artifact upload |
| GitHub-hosted (macos-latest) | build-electron.yml |
Release builds on push to master |
| GitHub-hosted (macos-latest) | review-pr.yml, implement-issue.yml |
AI-powered PR review and issue implementation |
| GitHub-hosted (ubuntu-latest) | issue-triage.yml, rebase-auto-prs.yml, pipeline-digest.yml, etc. |
Lightweight CI/CD automation |
The self-hosted runner is only used for PR validation — the heavy lift where build speed matters most.
When a PR is opened against master (ignoring cloud/, docs/, and *.md changes):
- Unit tests —
npm ci+vitestruns the full test suite - Service tests — Builds and tests each extracted service package (
planning-service,scheduler-service, etc.) - Code-signed build — Imports a P12 certificate into a temporary keychain, writes
.envsecrets, runsbuild-dist.cjs - Build verification — Checks the
.appbundle exists, validates the code signature withcodesign --verify, checks for DMG output - E2E tests — Playwright launches the built Electron app with
OLLIE_TEST_MODE=1and an isolated temp data dir (/tmp/ollie-e2e-*), runs 6 test suites (app launch, window behavior, navigation, tasks, brain dump, planning) - Artifact upload — DMG and zip uploaded to GitHub with 7-day retention
- PR comment — Bot posts/updates a comment with download link, commit info, and test status
- Cleanup — Temp dirs,
.env, build output, and the signing keychain are all removed
Key details:
- Concurrency: one run per PR number, cancel-in-progress (new push kills the old run)
- 30-minute timeout on the whole job
- Test isolation: each E2E suite gets its own temp
OLLIE_DATA_DIRso tests never touch real user data
The runner is registered on a local Mac (Apple Silicon) using GitHub's standard self-hosted runner registration flow — labels: self-hosted, macos, arm64. There's no containerization or custom service wrapper; it runs the stock actions/runner agent. Code signing secrets (CSC_LINK, CSC_KEY_PASSWORD, APPLE_ID, etc.) are stored as GitHub repo secrets.