1. एक सेल्फ-होस्टेड Mac रनर क्यों उपयोग करें?
GitHub-होस्टेड macOS रनर सुविधाजनक लेकिन महंगे हैं। $0.08 प्रति मिनट पर, प्रति माह 75 घंटे बिल्ड चलाने वाली एक टीम लगभग $360 का भुगतान करती है। MyRemoteMac का एक समर्पित Mac Mini M4 असीमित बिल्ड मिनटों के साथ $85/माह का पड़ता है, जो आपको लागत के एक अंश में वही (या बेहतर) हार्डवेयर देता है।
| विशेषता | GitHub-होस्टेड रनर | MyRemoteMac सेल्फ-होस्टेड |
|---|---|---|
| लागत | $0.08/मिनट (75h के लिए ~$350/माह) | $85/माह (असीमित मिनट) |
| आर्किटेक्चर | Intel x86 (कुछ M1) | Apple M4 (नवीनतम) |
| बिल्ड गति | ~12 मिनट (मध्यम प्रोजेक्ट) | ~4 मिनट (समान प्रोजेक्ट) |
| स्थायी कैश | नहीं (एफ़ेमरल) | हाँ (स्थायी डिस्क) |
| कस्टम सॉफ़्टवेयर | सीमित | पूर्ण रूट एक्सेस |
| समवर्ती जॉब्स | 5 (मुफ़्त) / 20 (सशुल्क) | असीमित (आपका हार्डवेयर) |
मुख्य लाभ: चूँकि रनर स्थायी होता है, DerivedData, SPM कैश, और CocoaPods बिल्ड के बीच संरक्षित रहते हैं। अकेले यही बिल्ड समय को उन एफ़ेमरल GitHub-होस्टेड रनरों की तुलना में 50-70% तक कम कर सकता है जो हर बार शून्य से शुरू होते हैं।
2. पूर्वापेक्षाएँ
शुरू करने से पहले, सुनिश्चित करें कि आपके पास निम्नलिखित हैं:
- MyRemoteMac से एक Mac Mini M4 सर्वर ($85/माह से)
- आपके रिपॉज़िटरी या संगठन तक एडमिन एक्सेस वाला एक GitHub खाता
- आपके Mac Mini तक SSH एक्सेस (आपकी MyRemoteMac सदस्यता के साथ प्रदान किया गया)
- एक Apple Developer खाता (कोड साइनिंग और प्रोविज़निंग प्रोफ़ाइल के लिए)
- YAML और टर्मिनल कमांड से बुनियादी परिचय
3. चरण 1: अपने Mac Mini में SSH करें और Xcode इंस्टॉल करें
सबसे पहले, SSH के ज़रिए अपने Mac Mini M4 से कनेक्ट करें। जब आपने अपना MyRemoteMac सर्वर सेट किया था तब आपको अपने क्रेडेंशियल मिले होंगे।
SSH के ज़रिए कनेक्ट करें
# Connect to your Mac Mini M4
ssh admin@your-server-ip
# Verify you're on Apple Silicon
uname -m
# Expected output: arm64
# Check macOS version
sw_vers
# ProductName: macOS
# ProductVersion: 15.2
# BuildVersion: 24C101
Xcode Command Line Tools इंस्टॉल करें
# Install Command Line Tools
xcode-select --install
# Accept the license agreement
sudo xcodebuild -license accept
# Verify installation
xcode-select -p
# /Library/Developer/CommandLineTools
Xcode इंस्टॉल करें (पूर्ण संस्करण)
iOS बिल्ड के लिए, आपको पूर्ण Xcode एप्लिकेशन की आवश्यकता होती है। इसे हेडलेस सर्वर पर इंस्टॉल करने का सबसे तेज़ तरीका xcodes का उपयोग करना है:
# Install Homebrew (if not already installed)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Add Homebrew to PATH
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
# Install xcodes CLI tool
brew install xcodes
# List available Xcode versions
xcodes list
# Install the latest stable Xcode
xcodes install 16.2
# Set it as the active Xcode
sudo xcode-select -s /Applications/Xcode-16.2.app/Contents/Developer
# Verify
xcodebuild -version
# Xcode 16.2
# Build version 16C5032a
iOS सिम्युलेटर इंस्टॉल करें
# Install the iOS 18 simulator runtime
xcodebuild -downloadPlatform iOS
# Verify simulator availability
xcrun simctl list runtimes
# == Runtimes ==
# iOS 18.2 (18.2 - 22C150) - com.apple.CoreSimulator.SimRuntime.iOS-18-2
4. चरण 2: GitHub Actions रनर इंस्टॉल करें
अब GitHub Actions रनर एजेंट को डाउनलोड और कॉन्फ़िगर करें। GitHub पर अपने रिपॉज़िटरी पर नेविगेट करें, Settings > Actions > Runners > New self-hosted runner पर जाएं, और macOS + ARM64 चुनें।
डाउनलोड और कॉन्फ़िगर करें
# Create a directory for the runner
mkdir -p ~/actions-runner && cd ~/actions-runner
# Download the latest runner package (ARM64)
curl -o actions-runner-osx-arm64-2.321.0.tar.gz -L \
https://github.com/actions/runner/releases/download/v2.321.0/actions-runner-osx-arm64-2.321.0.tar.gz
# Extract the package
tar xzf actions-runner-osx-arm64-2.321.0.tar.gz
# Configure the runner
# Replace YOUR_TOKEN with the token from GitHub Settings
./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO \
--token YOUR_TOKEN \
--name "mac-mini-m4-runner" \
--labels "self-hosted,macOS,ARM64,M4" \
--work "_work"
# Test the runner interactively first
./run.sh
एक स्थायी launchd सेवा के रूप में इंस्टॉल करें
एजेंट को इंटरैक्टिव रूप से चलाना परीक्षण के लिए ठीक है, लेकिन प्रोडक्शन के लिए आपको इसकी आवश्यकता है कि यह बूट पर स्वचालित रूप से शुरू हो और क्रैश होने पर पुनः शुरू हो। GitHub macOS के लिए एक अंतर्निहित सेवा इंस्टॉलेशन स्क्रिप्ट प्रदान करता है:
# Install as a launchd service
cd ~/actions-runner
sudo ./svc.sh install
# Start the service
sudo ./svc.sh start
# Check the service status
sudo ./svc.sh status
# Expected: "active (running)"
# View the launchd plist (for reference)
cat /Library/LaunchDaemons/actions.runner.*.plist
अब सेवा बूट पर स्वचालित रूप से शुरू होगी और प्रक्रिया के समाप्त होने पर पुनः शुरू होगी। आप सत्यापित कर सकते हैं कि रनर आपके GitHub रिपॉज़िटरी के Settings > Actions > Runners पृष्ठ पर "Idle" के रूप में दिखता है।
कई रिपॉज़िटरी के लिए रनर कॉन्फ़िगर करें (संगठन-स्तर)
# For an organization-level runner, use the organization URL:
./config.sh --url https://github.com/YOUR_ORG \
--token YOUR_ORG_TOKEN \
--name "mac-mini-m4-org-runner" \
--labels "self-hosted,macOS,ARM64,M4" \
--runnergroup "Default" \
--work "_work"
# This allows ALL repositories in your organization to use this runner
5. चरण 3: अपना iOS बिल्ड वर्कफ़्लो बनाएं
अपने रिपॉज़िटरी में .github/workflows/ios-build.yml पर एक वर्कफ़्लो फ़ाइल बनाएं। यह वर्कफ़्लो आपके सेल्फ-होस्टेड Mac Mini M4 रनर पर चलेगा।
name: iOS Build & Test
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: [self-hosted, macOS, ARM64, M4]
env:
SCHEME: "MyApp"
DESTINATION: "platform=iOS Simulator,name=iPhone 16 Pro,OS=18.2"
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Select Xcode version
run: |
sudo xcode-select -s /Applications/Xcode-16.2.app/Contents/Developer
xcodebuild -version
- name: Resolve Swift Package Dependencies
run: |
xcodebuild -resolvePackageDependencies \
-scheme "$SCHEME" \
-clonedSourcePackagesDirPath .spm-cache
- name: Build the app
run: |
xcodebuild build \
-scheme "$SCHEME" \
-destination "$DESTINATION" \
-clonedSourcePackagesDirPath .spm-cache \
-derivedDataPath DerivedData \
| xcbeautify
- name: Run unit tests
run: |
xcodebuild test \
-scheme "$SCHEME" \
-destination "$DESTINATION" \
-clonedSourcePackagesDirPath .spm-cache \
-derivedDataPath DerivedData \
-resultBundlePath TestResults.xcresult \
| xcbeautify
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: TestResults.xcresult
रिलीज़ बिल्ड के लिए कोड साइनिंग जोड़ें
TestFlight या App Store डिप्लॉयमेंट के लिए, कोड साइनिंग चरण जोड़ें। अपने सर्टिफ़िकेट और प्रोविज़निंग प्रोफ़ाइल को GitHub Secrets के रूप में संग्रहीत करें:
deploy:
needs: build
runs-on: [self-hosted, macOS, ARM64, M4]
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install certificate and provisioning profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
# Create a temporary keychain
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# Import certificate
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# Install provisioning profile
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
- name: Build for distribution
run: |
xcodebuild archive \
-scheme "MyApp" \
-archivePath DerivedData/MyApp.xcarchive \
-destination "generic/platform=iOS" \
CODE_SIGN_STYLE=Manual
- name: Export IPA
run: |
xcodebuild -exportArchive \
-archivePath DerivedData/MyApp.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath DerivedData/Export
- name: Upload to TestFlight
env:
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
run: |
xcrun altool --upload-app \
-f DerivedData/Export/MyApp.ipa \
-t ios \
--apiKey $APP_STORE_CONNECT_API_KEY
6. चरण 4: प्रदर्शन को ऑप्टिमाइज़ करें
एक सेल्फ-होस्टेड रनर के सबसे बड़े लाभों में से एक स्थायी कैशिंग है। अपने Mac Mini M4 का अधिकतम लाभ उठाने के लिए यहाँ मुख्य ऑप्टिमाइज़ेशन दिए गए हैं।
DerivedData कैशिंग सक्षम करें
चूँकि रनर स्थायी होता है, DerivedData बिल्ड के बीच संरक्षित रहता है। एक सुसंगत DerivedData पथ का उपयोग करें:
# In your workflow, always use:
-derivedDataPath DerivedData
# On the runner, periodically clean old DerivedData to save space:
# Add a cron job to clean builds older than 7 days
echo "0 3 * * 0 find ~/actions-runner/_work/*/DerivedData -maxdepth 0 -mtime +7 -exec rm -rf {} +" \
| crontab -
SPM पैकेज कैश करें
# Use clonedSourcePackagesDirPath to keep SPM packages on disk
xcodebuild build \
-scheme "MyApp" \
-clonedSourcePackagesDirPath ~/spm-cache \
-derivedDataPath DerivedData
# This avoids re-downloading packages on every build
पैरेलल टेस्ट एक्ज़ीक्यूशन
# Run tests in parallel across multiple simulators
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16 Pro,OS=18.2" \
-destination "platform=iOS Simulator,name=iPhone 15,OS=17.5" \
-parallel-testing-enabled YES \
-maximum-parallel-testing-workers 4 \
-derivedDataPath DerivedData \
| xcbeautify
बेहतर लॉग के लिए xcbeautify इंस्टॉल करें
# xcbeautify formats Xcode output for CI environments
brew install xcbeautify
# Use it by piping xcodebuild output:
xcodebuild build -scheme "MyApp" | xcbeautify
7. सामान्य समस्याओं का निवारण
रनर GitHub में "Offline" दिखाता है
इसका आमतौर पर मतलब है कि launchd सेवा नहीं चल रही है। सेवा स्थिति और लॉग जाँचें:
# Check service status
sudo ./svc.sh status
# View logs
cat ~/actions-runner/_diag/Runner_*.log | tail -50
# Restart the service
sudo ./svc.sh stop
sudo ./svc.sh start
कोड साइनिंग "No signing certificate" के साथ विफल हो जाती है
launchd सेवा एक अलग उपयोगकर्ता संदर्भ में चलती है। सुनिश्चित करें कि कीचेन सुलभ है:
# Ensure the login keychain is unlocked for the runner user
security unlock-keychain -p "YOUR_PASSWORD" ~/Library/Keychains/login.keychain-db
# Or use a dedicated keychain in your workflow (recommended)
security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
सिम्युलेटर बूट होने में विफल हो जाता है
सिम्युलेटर कभी-कभी अटक जाते हैं। उन्हें बिल्ड के बीच रीसेट करें:
# Shutdown all running simulators
xcrun simctl shutdown all
# Erase all simulator data (nuclear option)
xcrun simctl erase all
# Boot a specific simulator
xcrun simctl boot "iPhone 16 Pro"
डिस्क स्थान कम हो रहा है
Xcode बिल्ड बहुत सारा डेटा उत्पन्न करते हैं। स्वचालित सफ़ाई सेट करें:
# Clean old DerivedData
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# Remove old simulator runtimes
xcrun simctl runtime delete all
# Clean Homebrew cache
brew cleanup --prune=7
# Remove old Xcode archives
rm -rf ~/Library/Developer/Xcode/Archives/*
8. लागत विश्लेषण
विभिन्न टीम आकारों और बिल्ड मात्राओं के लिए यहाँ एक विस्तृत लागत तुलना दी गई है:
| टीम का आकार | बिल्ड/माह | GitHub-होस्टेड लागत | MyRemoteMac लागत | मासिक बचत |
|---|---|---|---|---|
| एकल डेवलपर | 100 बिल्ड (औसतन 10 मिनट) | $80/माह | $85/माह | $5/माह |
| छोटी टीम (5) | 500 बिल्ड (औसतन 10 मिनट) | $400/माह | $85/माह | $325/माह |
| मध्यम टीम (15) | 1500 बिल्ड (औसतन 10 मिनट) | $1,200/माह | $229/माह (M4 Pro) | $971/माह |
| एंटरप्राइज़ (50+) | 5000+ बिल्ड | $4,000+/माह | $458/माह (2x M4 Pro) | $3,542+/माह |
निष्कर्ष: प्रति माह ~100 से अधिक बिल्ड चलाने वाली टीमों के लिए, एक सेल्फ-होस्टेड Mac Mini M4 तुरंत अपनी लागत वसूल कर लेता है। और चूँकि वार्म कैश वाले स्थायी हार्डवेयर पर बिल्ड तेज़ होते हैं, आपकी टीम डेवलपर समय भी बचाती है।
संबंधित गाइड
Jenkins Mac बिल्ड एजेंट
iOS CI/CD के लिए एक समर्पित Mac Mini पर Jenkins बिल्ड एजेंट कॉन्फ़िगर करें।
Fastlane + समर्पित Mac सर्वर
Fastlane के साथ iOS बिल्ड, स्क्रीनशॉट, और TestFlight डिप्लॉयमेंट को स्वचालित करें।
GitLab CI Mac रनर
iOS/macOS CI पाइपलाइनों के लिए एक समर्पित Mac Mini पर एक GitLab Runner पंजीकृत करें।