Title: iOS CI/CD pipeline on GitHub Actions with your own Mac · Codemany docs
URL: https://codemany.com/docs/guides/ios-xcode
Description: Build an iOS CI/CD pipeline on GitHub Actions with your own Mac: xcodebuild with your Xcode 26, simulators and signing, and a fresh runner per job. $20/month.
All pages as Markdown: https://codemany.com/llms.txt

---

[Guides](https://codemany.com/docs#guides)

# Run an iOS CI/CD pipeline on GitHub Actions with your own Mac

Build and test iOS and macOS apps on your Mac, with the Xcode you already have.

Install Codemany on an Apple silicon Mac that has Xcode, then set `runs-on: [self-hosted, codemany, xcode]` on the job. The job runs on your Mac with your Xcode, simulators and tools, in a fresh single-use runner. GitHub still schedules it and shows the logs.

## Why run iOS CI/CD on your own Mac

- **Your Xcode, already installed.** Jobs use the Xcode, simulators and Homebrew tools on the Mac. Nothing is preinstalled.
- **Warm tool cache.** Downloads from `actions/setup-*` steps stay in a shared cache between jobs.
- **Your code stays on your machine.** Codemany talks to GitHub directly from your Mac, and your GitHub token is never sent to Codemany's servers.
- **A flat price.** $20/month includes 2 machines, instead of paying per macOS minute ([cut GitHub Actions costs](https://codemany.com/docs/guides/actions-cost)).

## Set up an iOS CI/CD pipeline

1. Install Xcode
   Install Xcode on the Mac and choose it with `xcode-select`.
2. Install Codemany
   [Download Codemany](https://codemany.com/download), sign in with GitHub and pick your repositories ([Get started](https://codemany.com/docs/get-started)).
3. Check the tools
   Open **Settings › This Mac › Tools**, or run `codemany doctor`, to see that Codemany found your Xcode.
4. Ask for Xcode in the job
   Add the `xcode` label to `runs-on`, as below, and push a commit.

## Pick Xcode 26 or any Xcode with labels

Codemany adds two labels on any Mac with an Xcode: a plain `xcode`, and one that follows the Xcode chosen with `xcode-select`, for example `xcode-26.0`.

- **`xcode`** when any Xcode will do, so Xcode updates never strand the job.
- **`xcode-26.0`** when the build needs that Xcode. After a switch, jobs asking for the old one wait instead of using the wrong toolchain.
- **`ARM64`** is always there: Codemany runs on Apple silicon, which matters for simulator builds.

Every label: [Advanced › Runner labels](https://codemany.com/docs/advanced#labels).

## Example xcodebuild workflow

```
name: ios
on: [push]
jobs:
  test:
    runs-on: [self-hosted, codemany, xcode]
    steps:
      - uses: actions/checkout@v4
      - name: Show the Xcode in use
        run: xcodebuild -version
      - name: Test on a simulator
        run: |
          xcodebuild test \
            -scheme MyApp \
            -destination 'platform=iOS Simulator,name=iPhone 17'
```

Pin the version with `runs-on: [self-hosted, codemany, xcode-26.0]`.

## Simulators, signing and iOS CI/CD tools

Jobs run as your user, so `xcodebuild` sees the simulators, certificates and provisioning profiles already set up on this Mac. Codemany doesn't send them anywhere; what it does send is listed in [Security & privacy](https://codemany.com/docs/security#leaves).

A runner that goes offline for 2 minutes is stopped, with leftover processes such as simulators, and replaced. Each job gets a fresh runner whose folder is wiped afterwards ([single-use runners](https://codemany.com/docs/guides/ephemeral-runners)).

Codemany can install CocoaPods, fastlane, xcbeautify, SwiftLint and XcodeGen with Homebrew on request, as your user, never root ([Tools and caching](https://codemany.com/docs/advanced#tools)).

## How many builds at once

Each job needs about 4 GB of memory, 2 CPU cores and 15 GB of disk. An 8 GB Mac runs 1 job at a time; a 16 GB Mac runs 3. `codemany capacity` prints how many fit. To run more, [add another Mac](https://codemany.com/docs/machines#mac).

## Questions

### How do I set up an iOS CI/CD pipeline on GitHub Actions?

Install Xcode and Codemany on an Apple silicon Mac, sign in with GitHub and pick the repo. Then set `runs-on: [self-hosted, codemany, xcode]` on the job and run `xcodebuild` in a step, as in the example above.

### Do I need a CI/CD server for iOS?

Not a separate one. GitHub Actions schedules the jobs and shows the logs, and Codemany turns a Mac you own, such as a Mac mini, into the runner that builds them.

### Which Xcode does macos-latest use, and how do I pin Xcode 26?

`macos-latest` is a GitHub-hosted image, so it uses whatever Xcode GitHub installs there. On your own Mac, ask for `xcode-26.0` to pin Xcode 26, or plain `xcode` for whichever Xcode is selected.

### Can I pin an Xcode version?

Yes. Ask for `xcode-26.0` (or the version you need) instead of `xcode`. The job waits for a Mac with that Xcode selected.

### What happens when I update Xcode?

The version label follows `xcode-select`. Jobs asking for plain `xcode` keep running; jobs pinned to the old version wait.

### Can pull requests from forks use my signing certificates?

Public repos are off unless you turn one on, because anyone can open a pull request that runs their code. Only run workflows you would run in your own terminal ([Runner security](https://codemany.com/docs/guides/runner-security)).

### Is it cheaper than GitHub-hosted macOS runners?

GitHub bills hosted macOS runners at $0.062 a minute (3-core M1); Codemany is a flat $20/month for 2 machines, with a 14-day free trial. Compare with your own numbers in the [savings calculator](https://codemany.com/savings).

## Related guides

Read next: [self-hosted runner on a Mac](https://codemany.com/docs/guides/mac-runner) and [self-hosted runner on Linux](https://codemany.com/docs/guides/linux-runner).

[Previous Self-hosted runner on a Mac](https://codemany.com/docs/guides/mac-runner)[Next Self-hosted runner on Linux](https://codemany.com/docs/guides/linux-runner)
