GitHub’s larger-runner documentation distinguishes arm64 macOS runners without a static UDID from Intel macOS runner options with one; that limitation does not, by itself, block ordinary iOS builds, simulator tests, or App Store releases. First identify whether your workflow needs the Mac host’s identifier or a registered iPhone’s UDID, then change runners only if a specific task requires it. (GitHub runner documentation)
This runbook is for IT, platform engineering, and technical leads responsible for GitHub Actions, macOS runners, signing, and build capacity.
Use it to decide whether an arm64 runner limitation affects a real pipeline task—or only appears to.
Last updated: October 4, 2026. Runner details were checked against GitHub’s larger-runner documentation and Apple’s device-registration, provisioning-profile, and build-upload guidance. Verify those official sources again before changing a production workflow.
01 Start with the task, not the UDID warning
A fixed runner UDID is not a general prerequisite for iOS CI. Treat it as a task-specific constraint. A build can compile an app without installing it on a registered iPhone. A simulator test uses a simulator destination, not a connected iPhone. An App Store submission follows a distribution path that is different from a development or Ad Hoc install. Apple’s build-upload instructions describe uploading a build to App Store Connect; that step is not the same as registering every eventual user’s device.
Use this task matrix to locate the actual failure:
| Pipeline task | Does it normally need the runner Mac’s fixed UDID? | What to verify |
|---|---|---|
| Compile an iOS app | Not as a blanket requirement | Build command, signing mode, and whether the workflow installs the app |
| Run simulator tests | Not for the simulator’s device identity | Simulator destination, runtime availability, and test result |
| Create a development-signed build | Depends on the signing workflow; do not assume the host UDID is the iPhone UDID | Profile type, registered target device, certificate, and signing error |
| Install on a physical iPhone | The actual test device must be available and correctly registered for the chosen profile | Device UDID, profile contents, connection path, and installation result |
| Upload a release build | A registered test iPhone is not a universal upload prerequisite | Distribution signing and successful upload processing |
The matrix is a diagnostic map, not a promise that every runner label supports every Xcode or signing operation. Confirm the current image, architecture, and runner availability in GitHub’s documentation before editing workflow labels.
Does an arm64 runner without a fixed UDID automatically break iOS signing? No. First inspect the failing command and the provisioning profile it uses. A runner’s host identifier and an iPhone’s device identifier are different pieces of information. A signing error that reports a missing registered device may concern the profile’s target devices, not the Mac that ran the job.
The host and the test device are different assets
The runner Mac is the build host. The iPhone is a target device used for installation or testing. Apple’s device-registration guidance concerns adding a device to an Apple Developer account. Apple’s development-profile instructions explain how a development profile relates to registered devices.
That distinction matters when someone sees “UDID” in a workflow error and immediately switches runner architecture. If the app is meant to run on a registered iPhone, registering the runner Mac does not register that iPhone. Conversely, if a tool or Mac-specific workflow requires a stable host identifier, an iPhone’s UDID cannot satisfy that requirement.
How do the runner Mac’s UDID and the iPhone test device’s UDID differ? One identifies the Mac host; the other identifies the physical test device. Check which object the error names, which provisioning profile is in use, and which device list that profile includes. Do not copy a host identifier into the iPhone device list as a workaround.
02 Separate signing, testing, and release paths
The phrase “iOS signing” can refer to several different outcomes. Diagnose the one your pipeline must produce.
- Compilation: The job compiles the application and creates build output. It may not need to install that output on a physical device.
- Simulator validation: The job runs tests against a simulator destination. Confirm the simulator target and runtime exist on the selected runner image. Simulator success is not evidence that installation on a physical device will work.
- Development installation: The workflow signs an app for development and installs it on registered test hardware. The Apple development-profile guidance linked above is relevant here. Verify that the intended iPhone is registered and included in the profile.
- Ad Hoc distribution: This route is for distribution to specified devices. Apple’s Ad Hoc profile instructions cover its device-registration relationship. Confirm that the test devices are included before treating a successful build as a successful device test.
- Store distribution: Assess upload and release work on its own distribution requirements. Do not infer that a registered test device is required just because a development-profile job needs one.
Can a GitHub-hosted macOS Runner connect directly to a physical test iPhone? Do not assume that it can. A hosted runner is not the same as a Mac with a test phone physically connected and assigned to your team. If a test requires USB attachment, prove the connection path in a trial job. If your organization uses a separately managed device lab or another controlled connection method, validate that method independently; the hosted runner label alone is not evidence of device access.
A passing simulator test, a valid signature, an install on a registered iPhone, and an accepted store upload are different acceptance states. Record them separately. This prevents a green compile job from being reported as verified real-device coverage.
03 Check the current runner boundary before switching
GitHub’s current larger-runner documentation says arm64 macOS larger runners do not have a static UDID and lists static-UDID options for Intel macOS runners. Treat that as a documented runner distinction, not as a universal fix for every Apple-platform workflow. Runner labels and availability can change, so confirm the live documentation before basing an architecture decision on it.
| Choice | When it may fit | Validate before adoption |
|---|---|---|
| Keep the arm64 hosted runner | The job compiles, runs simulator tests, or produces store-bound output without needing a fixed host identifier or attached device | Build and signing result, runner image, and release artifact |
| Evaluate an Intel hosted option with a static UDID | A specific workflow has a documented dependency on a static Mac UDID and the current GitHub option meets that requirement | Exact runner label, architecture compatibility, Xcode toolchain, and signing behavior |
| Use a self-hosted Mac | You need more control over host configuration, a persistent environment, or a managed physical-device connection | Isolation, patching, access controls, cleanup, runner registration, and recovery |
| Trial a dedicated remote Mac | A bounded workload needs a controlled Mac environment or a predictable device-test arrangement | Actual device access, signing ownership, secret handling, handoff evidence, and operational responsibility |
A change to Intel can solve only the constraint that calls for the documented static identifier. It does not automatically provide a connected iPhone, correct provisioning, compatible dependencies, or a safe signing setup. Likewise, a self-hosted runner offers more control but puts host maintenance and security responsibilities on your team. GitHub’s self-hosted runner reference describes that operating model.
First step: capture the exact failing operation
Save the workflow run, job log, failing command, selected runner label, and Xcode destination. Record whether failure occurs during compilation, signing, simulator launch, physical installation, or upload. “UDID error” is not enough detail to approve a runner migration.
Second step: inspect the profile and its purpose
Identify whether the job uses a development, Ad Hoc, or distribution profile. Check the profile’s application identifier, certificate, expiration, and registered-device contents where applicable. Keep profile validation separate from host selection. When profiles are changed or downloaded, follow Apple’s profile management guidance.
Third step: identify the device the test needs
For simulator tests, record the simulator destination and the runtime requested by the workflow. For physical-device tests, record the actual iPhone assigned to the test and confirm its registration. Do not treat a simulator identifier as the physical device’s UDID, or the Mac host’s identifier as either one.
Fourth step: run a minimal job on the current runner
Use a representative build or test command, not a full release pipeline. Capture the runner architecture, selected image, signing result, and test destination. If the job passes without a fixed Mac UDID, avoid migrating it simply because another stage uses a development profile.
Fifth step: trial an alternate node only for a reproduced constraint
If the failure demonstrably depends on a stable Mac identifier, test a currently documented Intel option or a suitable controlled Mac. If the problem is physical-device access, test the connection path and device assignment instead. Do not treat an Intel runner’s static UDID as a substitute for a registered iPhone.
Sixth step: define evidence for each acceptance state
Set separate checks for build completion, signature validity, simulator results, physical installation, and release upload. A workflow should report which states it proved. Keep logs or artifacts needed to verify the result without exposing signing secrets.
04 Use a gated checklist before changing capacity
Use this checklist during a runbook review. Each item should have an owner and an observable result.
- [ ] Identify whether the missing identifier belongs to the runner Mac or the iPhone.
- [ ] Name the exact failed stage: compile, sign, simulator test, device install, or upload.
- [ ] Confirm the profile type and whether it is intended for registered devices.
- [ ] For physical-device testing, verify that the real test device is registered and included where the profile requires it.
- [ ] Confirm the currently supported GitHub runner label and architecture in the official runner reference.
- [ ] For a self-hosted or dedicated node, document who owns patching, access, workspace cleanup, and recovery.
- [ ] Run a bounded trial and retain evidence for signature validation, device installation, and artifact upload as separate outcomes.
- [ ] Expand Mac capacity only after the trial proves a requirement that the existing runner cannot meet.
Which GitHub Actions tasks actually need a fixed Mac UDID? Only tasks whose documented signing, licensing, or Mac-side validation process explicitly depends on a stable host identifier should trigger that requirement. Verify the dependency against the tool or workflow that raises it. A physical iPhone test instead requires the correct test device and a working path to that device; it is not solved by changing the Mac’s UDID.
For signing secrets, separate credential access from runner access. A developer who can view workflow logs should not automatically be able to retrieve private signing material. Scope secrets to the workflows and repositories that need them, limit who can change those workflows, and remove temporary credentials or keychain state after a run. GitHub’s guidance on securely using pull_request_target highlights the risks of giving untrusted pull-request code access to privileged workflow contexts. A runner being reachable by SSH or VNC does not, on its own, prove that its signing environment is production-safe.
If you are assessing a dedicated Mac, model the operational boundary as well as the hardware cost: credential ownership, access approvals, device custody, cleanup, patching, and incident response. Compare those responsibilities with your current hosted-runner setup before assigning a long-lived signing workload. You can review CALMVPS Mac rental pricing as one input to that evaluation; do not assume a rental removes your responsibility to define signing and access controls.
05 Decide from pipeline evidence
Keep hosted runners for jobs that build and validate without a fixed host identity or attached iPhone. If one stage needs a registered physical device, isolate that stage and prove device access before moving the rest of CI. If a tool explicitly requires a static Mac UDID, test the currently documented Intel option or a dedicated node against that exact dependency.
The hosted route can leave you with limited control over the host identity, no guaranteed physical iPhone connection, and less control over persistent machine state. Those are real constraints for a specific signing or device-test stage, but not reasons to move ordinary builds by default. When a reproduced task needs a controlled Mac environment, a CALMVPS remote Mac can be evaluated as a dedicated test or signing node; start with a bounded workflow and verify device access, credential isolation, and handoff evidence before expanding. If your jobs only compile or run simulator tests, keep the existing runner until test evidence shows a concrete limitation. See the CALMVPS Mac rental options when a temporary or dedicated Mac trial is justified.