macOS runners: macOS 26 (Tahoe) with Xcode 26
## What?
macOS Tahoe has been released - https://developer.apple.com/documentation/macos-release-notes (September 15th).
Our macOS runners job images currently just support macOS 14 and 15 (Xcode 15 and 16 respectively).
## Why?
For users to build apps for newer iOS versions and macOS versions they will need access to this OS version and the various SDKs provided.
Users cannot bring their own OS images for these runners. The images a very large (100GB+) and it would be too expensive (both time and egress cost) to support user specified images.
See also our public docs regarding our intended image release/upgrade policies - https://docs.gitlab.com/ci/runners/hosted_runners/macos/#image-update-policy-for-macos
## Release Notes
You can now create, test, and deploy applications for the newest generations of Apple devices using macOS Tahoe 26 and Xcode 26.
GitLab’s [hosted runners on macOS](https://docs.gitlab.com/ee/ci/runners/hosted_runners/macos.html) help your development teams build and deploy macOS applications faster in a secure, on-demand build environment integrated with GitLab CI/CD.
Try it out today by using the `macos-26-xcode-26` image in your `.gitlab-ci.yml` file.
## Participants
- @joe-shaw
- @igorwwwwwwwwwwwwwwwwwwww
- @dbickford (handling some reviews)
## Exit Criteria
The image `macos-26-xcode-26` is available for use in our production environments (`saas-macos-medium-m1` and `saas-macos-large-m2pro`) and it is stable.
Stability can be tested somewhat with our testing pipelines - https://gitlab.com/gitlab-org/ci-cd/tests/saas-runners-tests/macos-platform/saas-macos-production-tests
We will also see if users report any problems with the image, as they will have specific workload requirements that we cannot necessarily foresee.
## Process
A few preflight checks to see if we need to replace the host image (managed in gitlab.com/gitlab-org/ci-cd/shared-runners/images/aws/macos-nesting):
- [x] Ensure you have an Apple Developer account. You will need this to download new Xcode versions for the build process. Open an AR if not, see e.g. https://gitlab.com/gitlab-com/team-member-epics/access-requests/-/issues/31923
- [x] Review the [playbooks](https://gitlab.com/gitlab-com/runbooks/-/tree/master/docs/ci-runners/macos?ref_type=heads) for macOS - this covers a lot of what is needed here in more detail.
- [x] Verify you can download and run a macOS 26 image ipsw image (use a tool like [tart](https://tart.run/) to run the image). See also https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macos-build-machine for details of how this happens.
- [x] Verify macOS 26 can be virtualized on macOS 15 AWS hosts (equivalent to our macOS job hosts). Sometimes this is not immediately possible, or some software updates are required.
- Requires upgrading the host to 15.7.x - the builder machine has been upgraded to this version.
The following items need issues associated with them once this process is commenced, so we can better track the work.
**If** the current host image cannot run the macOS 26 VM:
- [x] Build a new host image that will be able to run macOS 26, 15 and 14. We need to support the 14 image until 26 is stable for a few months. This might need a new process for upgrading SIP settings - we might be able to use the [aws CLI SIP disable command](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mac-sip-settings.html) rather than our current UI keyboard automation (yikes).
- [x] Perform a runners upgrade using the new host image to ensure the existing job images work with it.
Building and publishing `macos-26-xcode-26` via https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/job-images:
- [x] Add new packer template variables and CI configs for the 26 image variant. The structure can be inferred from existing image definitions in https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/job-images
- this will likely require some trial and error, especially as we won't have tested any of these bits of automation inside 26 already.
- [x] Upgrade all dependencies to newest stable versions (asdf stuff, nodejs, flutter etc.).
- [ ] Consider at this point switching from asdf to mise for faster install and context switching. See also gitlab.com/gitlab-org/ci-cd/shared-runners/infrastructure/-/issues/271+
- [x] Ensure the tests for the newly built images are passing and add more if necessary.
- [x] Update the production environment for `saas-macos-staging` to start the rollout:
- Need to update both chef and terraform:
- allowed images: https://gitlab.com/gitlab-com/gl-infra/chef-repo/-/blob/master/roles/runners-manager-saas-macos-staging.json?ref_type=heads#L58
- S3 image references: https://ops.gitlab.net/gitlab-com/gl-infra/config-mgmt/-/blob/main/environments/ci/saas_macos_staging_env.tf?ref_type=heads (depending on inactive deployment).
- test the staging pipelines with https://gitlab.com/gitlab-org/ci-cd/tests/saas-runners-tests/macos-platform/saas-macos-staging-basic-test
- [x] On successful staging rollout, do the same for production environments. Equivalent to the previous steps, but for the relevant roles/terraform.
- refer to https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/ci-runners/macos/deployment.md?ref_type=heads
- CR process should be followed, see e.g. https://gitlab.com/gitlab-com/gl-infra/production/-/issues/20336+
## Retrospective
macOS/Xcode 26 has had beta releases since early June. This cycle is similar to previous years. We should be preparing for this release by starting the build process for this beta, and even releasing a `beta` image for users to test with. This would allow a seamless transition for users; they would be able to build previews of their own applications/libraries straight away, rather than having to wait for us to finally release macOS 26.
## Roadmap
- Category: Customer Commitments
<!--STATUS NOTE START-->
## Status 2026-02-11
:clock1: **total hours spent this week by all contributors**: 50
We did have [problems finding any capacity to build macOS AMIs in the US](https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/28349) and have subsequently moved builds to non-US regions. Subsequently we've built a new macOS AMI that supports Xcode 26 and we've built the macos-26 job image.
:tada: **achievements**:
- The `macos-26-xcode-26` image build is working and the images have been integrated into base AMI tests - https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/issues/28318+
- The host image has been built, with some startup issues identified - https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/28312+
:arrow_forward: **next**:
- Some more testing of the host images is required, particularly around host startup times. We're seeing the ec2-macos-init process take a long time to complete, which is required for SSH key provisioning and EBS volume mounting. https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/28312+
- Testing both images in the staging environment: https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/28359+
_Copied from https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/1694#note_3074042081_
<!--STATUS NOTE END-->
epic