Guide

Runner self-hosted de GitHub Actions pe un Mac mini

Pune un runner GitHub Actions self-hosted pe un Mac mini dedicat. Instalezi Xcode, înregistrezi runner-ul, îl rulezi ca serviciu și ții build-urile rapide și private.

30 minute, actualizat 2026-09-15

Runnerii macOS găzduiți de GitHub sunt mașini partajate. Stau la coadă la ore aglomerate, pornesc de la zero de fiecare dată și se facturează la minut.

Un runner self-hosted pe propriul tău Mac mini pornește imediat, își păstrează cache-urile între build-uri și costă la fel în fiecare lună.

Ghidul ăsta îți ia cam treizeci de minute. Îți trebuie:

  • Un Mac mini cu Apple silicon și acces prin SSH
  • Drepturi de admin pe repository-ul sau pe organizația de GitHub
  • Un Apple ID, ca să descarci Xcode

1. Pregătește Mac-ul

Intră prin SSH și oprește adormirea Mac-ului:

ssh
sudo pmset -a sleep 0 disksleep 0 displaysleep 0

Instalează Homebrew:

ssh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Recomandăm un utilizator separat pentru runner, ca build-urile să nu ruleze niciodată cu contul tău de admin:

ssh
sudo sysadminctl -addUser runner -fullName "CI Runner" -password -

Pentru pașii de mai jos, autentifică-te cu utilizatorul ăla.

2. Instalează Xcode

Cel mai simplu prin SSH e cu `xcodes`:

ssh
brew install xcodesorg/made/xcodes
xcodes install --latest
xcodes select

Acceptă licența și termină prima pornire:

ssh
sudo xcodebuild -license accept
xcodebuild -runFirstLaunch
xcodebuild -downloadPlatform iOS

3. Înregistrează runner-ul

În GitHub, deschide-ți repository-ul, apoi Settings, Actions, Runners, New self-hosted runner. Alege macOS și ARM64.

GitHub îți arată comenzile exacte, cu versiunea curentă și un token. Arată cam așa:

ssh
mkdir actions-runner && cd actions-runner
curl -o actions-runner-osx-arm64.tar.gz -L <download URL from GitHub>
tar xzf ./actions-runner-osx-arm64.tar.gz
./config.sh --url https://github.com/<owner>/<repo> --token <token>

Token-ul expiră după o oră, deci înregistrează-l imediat. Când `config.sh` cere label-uri, pune-le pe cele pe care le vei folosi în workflow-uri, de exemplu `xcode` sau `m4`.

4. Rulează-l ca serviciu

ssh
./svc.sh install
./svc.sh start
./svc.sh status
GitHubYour repositoryActions queues the jobMac mini, our rackactions.runner service, launchdXcode, simulators, signing keychainIts own diskDerivedData, SwiftPM and CocoaPods caches stay warmthe runner dials out, HTTPS 443jobs and logs come back on itNothing listens on the Mac.No inbound port, no address to expose.
Odată ce serviciul rulează, asta e toată schema.

Runner-ul pornește acum odată cu sesiunea utilizatorului. Dacă joburile tale rulează teste UI sau au nevoie de login keychain, activează autentificarea automată pentru utilizatorul runner-ului din System Settings, Users and Groups. Poți face asta prin screen sharing. Autentificarea automată nu e disponibilă cât timp FileVault e pornit.

5. Folosește-l într-un workflow

.github/workflows/ios.yml
name: iOS build

on: [push]

jobs:
  build:
    runs-on: [self-hosted, macOS, ARM64]
    steps:
      - uses: actions/checkout@v4
      - name: Build
        run: xcodebuild -scheme MyApp -destination 'generic/platform=iOS Simulator' build

Fă un push. Jobul apare în Actions și pornește pe Mac-ul tău în câteva secunde.

6. Ține-l sănătos

  • Doar repository-uri private. Pe un repository public, un pull request dintr-un fork poate rula cod pe Mac-ul tău. GitHub nu recomandă runneri self-hosted pe repo-uri publice.
  • Fă curat din când în când. DerivedData și simulatoarele vechi cresc în timp:
ssh
rm -rf ~/Library/Developer/Xcode/DerivedData
xcrun simctl delete unavailable
  • Semnare. Ține certificatele într-un keychain dedicat, sau folosește fastlane match.
  • Actualizări. Runner-ul se actualizează singur, implicit. Xcode îl actualizezi când vrei tu, nu în mijlocul unui release.

De ce un Mac mini dedicat

  • Nimeni altcineva pe el. Build-urile pornesc în clipa în care dai push.
  • Cache-uri calde. DerivedData, pachetele Swift și CocoaPods rămân pe disc, așa că build-urile incrementale sunt mult mai rapide.
  • Cipuri reale. Testezi pe același Apple silicon pe care îl au utilizatorii tăi.
  • O lună la preț fix. Fără facturare la minut, fără surprize la finalul unui sprint aglomerat.

MacDuty pune în rack Mac mini de la M1 la M6 în UE, cu macOS instalat și cu cheia ta SSH deja pusă.

Mai departe