Getting Started
This tutorial walks you through installing elastic-fruit-runner on a macOS Apple Silicon machine, configuring it, and running your first GitHub Actions workflow on an ephemeral Tart VM.
By the end, you will have a working self-hosted runner that automatically scales up VMs for incoming jobs and destroys them after completion.
Prerequisites
Section titled “Prerequisites”- A Mac with Apple Silicon (M1 or later)
- Homebrew installed
- Tart installed (
brew install cirruslabs/cli/tart) - A GitHub organization or repository where you have admin access
- A GitHub Personal Access Token (PAT) with Organization > Self-hosted runners: Read and write scope
Step 1: Install elastic-fruit-runner
Section titled “Step 1: Install elastic-fruit-runner”brew install boring-design/tap/elastic-fruit-runnerVerify the installation:
elastic-fruit-runner --helpStep 2: Create a configuration file
Section titled “Step 2: Create a configuration file”mkdir -p ~/.elastic-fruit-runnerCreate ~/.elastic-fruit-runner/config.yaml with the following content. Replace your-org with your GitHub organization name and ghp_xxx with your PAT:
orgs: - org: your-org auth: pat_token: ghp_xxx runner_group: Default runner_sets: # macOS runners via Tart VMs (Apple Silicon only) - name: efr-macos-arm64 backend: tart image: ghcr.io/cirruslabs/macos-tahoe-xcode:26.3 labels: [self-hosted, macos, arm64] max_runners: 2
# Linux arm64 runners via Docker - name: efr-linux-arm64 backend: docker image: ghcr.io/actions-runner-controller/actions-runner-controller/actions-runner-dind:latest labels: [self-hosted, linux, arm64] max_runners: 4 platform: linux/arm64
# Linux amd64 runners via Docker (Rosetta 2 emulation on Apple Silicon) - name: efr-linux-amd64 backend: docker image: ghcr.io/actions-runner-controller/actions-runner-controller/actions-runner-dind:latest labels: [self-hosted, linux, amd64] max_runners: 4 platform: linux/amd64
idle_timeout: 15mlog_level: infoStep 3: Start the service
Section titled “Step 3: Start the service”Start elastic-fruit-runner as a background service that auto-starts on login:
brew services start elastic-fruit-runnerCheck that it is running:
brew services info elastic-fruit-runnerYou should see elastic-fruit-runner listed as started.
Step 4: Verify in the logs
Section titled “Step 4: Verify in the logs”Watch the logs to confirm the daemon connected to GitHub:
tail -f /opt/homebrew/var/log/elastic-fruit-runner.logYou should see log lines indicating the scale set was registered and the daemon is polling for jobs.
Step 5: Run a workflow
Section titled “Step 5: Run a workflow”In your GitHub repository, create a workflow file .github/workflows/test-efr.yaml:
name: Test elastic-fruit-runneron: workflow_dispatch
jobs: hello: runs-on: efr-macos-arm64 steps: - run: | echo "Hello from elastic-fruit-runner!" sw_vers uname -mGo to your repository on GitHub, navigate to Actions, select the Test elastic-fruit-runner workflow, and click Run workflow.
Switch back to the log output. You should see:
- The daemon detecting the new job
- A Tart VM being cloned and started
- The runner registering and executing the job
- The VM being destroyed after completion
Step 6: Check the workflow result
Section titled “Step 6: Check the workflow result”Go back to GitHub Actions. The workflow run should show a green checkmark, with output displaying the macOS version and arm64 architecture.
Next steps
Section titled “Next steps”- Configure GitHub App auth for production org deployments
- Deploy on Linux with Docker for Linux arm64/amd64 runners
- What is elastic-fruit-runner? to understand the project