SevyDevy

Guide · Backend

GitHub's November 2026 macOS 14 Runner Retirement Explained: What to Switch To

23 min readUpdated By Saket Bhatnagar

Researched and drafted with AI, reviewed and edited by Saket Bhatnagar.

In short

  • The macOS 14 runner retirement means GitHub Actions stops running jobs on the macos-14, macos-14-large and macos-14-xlarge labels on 2 November 2026. A label is the name you write after runs-on.
  • Before that, those jobs fail on purpose during planned windows called brownouts. GitHub scheduled eight, from 5 to 30 October 2026, each from 19:30 IST to 05:30 IST the next morning.
  • The usual fix is one line: change macos-14 to macos-15. A pinned label like macos-15 stays on one macOS version, while macos-latest moves to newer ones and now means macOS 26.
  • The real trap is Xcode, Apple's build tool. The macOS 15 and 26 images have no Xcode 15, and Apple has required Xcode 26 for App Store uploads since 28 April 2026.
  • Beginners can stop after the section on checking the new runner. Engineers then get a tested scanner that also flags Xcode 15 paths, the Intel label map and a docs disagreement.

What goes wrong when your CI still runs on macos-14?

Your macOS builds start failing for no reason you can see in the code. The cause is the macOS 14 runner retirement: GitHub is removing the machine image your workflow asks for.

Picture a common setup. A small team ships an iOS app, and its CI (continuous integration, the robot that builds and tests every push) runs on GitHub Actions. The person who wrote the workflow left, and nobody has opened it in a year. The setup is made up, but the failure is real.

The workflow says runs-on: macos-14 and selects Xcode 15.4. On a brownout evening its macOS jobs fail, though nothing in the app changed. The machine it asked for was switched off on purpose.

From 2 November 2026 that failure becomes permanent. Any job still asking for a macOS 14 label is ended with an error. This guide shows how to find every such label, pick the right replacement and prove the new build works.

Which words do you need before fixing a runner label?

You need six words: workflow, job, runner, runner image, label and brownout. Each one gets a plain meaning and an example from the iOS pipeline.

  • Workflow: a YAML file in the folder .github/workflows that tells GitHub Actions what to run. YAML is a plain-text format of keys and values. Example: ios.yml.
  • Job: one group of steps inside a workflow that runs on one machine. Example: the build job that compiles the app.
  • Runner: the machine that runs a job. GitHub-hosted runners are fresh virtual machines that GitHub starts for each job and throws away after.
  • Runner image: the disk snapshot a runner starts from, with the operating system and tools such as Xcode already installed. GitHub updates each image every week.
  • Label: the name after runs-on that picks an image and machine size. Example: macos-14 picks the macOS 14 image on an Apple-chip (arm64) machine.
  • Brownout: a planned window where GitHub makes jobs on a retiring label fail on purpose, so people notice before the real switch-off.

Two more words appear later. Xcode is Apple's tool for building iOS and macOS apps, and each image carries a fixed set of Xcode versions. Arm64 means Apple's own chips, while x64 means older Intel chips.

What is the GitHub Actions macOS 14 runner retirement?

It is GitHub removing the macOS 14 (Sonoma) runner images from GitHub Actions on 2 November 2026. Three labels are affected: macos-14, macos-14-large and macos-14-xlarge.

This follows a published policy, not a one-off decision. The runner-images README says GitHub supports at most two GA (generally available) images and one beta image of each system at a time. When a newer macOS image reaches GA, the oldest label starts its deprecation.

The README describes the process in order: an announcement with a date, scheduled brownouts as the date nears, and then removal. macOS 14 has followed exactly that path, as the diagram shows.

How the macOS 14 retirement has unfolded

Each stage was announced in advance. Notice that the brownouts are the last warning, not the start.

Diagram connections:

  • Announcement issue to Deprecation begins (About 6 months later)
  • Deprecation begins to Changelog post
  • Changelog post to Eight brownouts (Starts 5 Oct)
  • Eight brownouts to Image removed (Last ends 31 Oct)
  • Announcement issue: Issue 13518 opened, 11 Jan 2026
  • Deprecation begins: 6 Jul 2026: queues may get longer
  • Changelog post: 1 Oct 2026: dates and new labels
  • Eight brownouts: 5 to 30 Oct: jobs fail on purpose
  • Image removed: 2 Nov 2026: jobs end with an error

During each brownout, jobs on the three labels fail. Two smaller warnings sit beside that. The changelog says GitHub may reduce macOS 14 capacity before retirement, and the issue warns of longer queue times during peak hours.

When are the brownouts in Indian time?

Each brownout runs from 19:30 IST to 05:30 IST the next morning. GitHub publishes the windows in UTC, the world reference time, and IST (Indian Standard Time) is UTC plus 5 hours 30 minutes. That is exactly when many teams in India push their evening work.

All eight macOS 14 brownout windows from the GitHub changelog and issue 13518, with IST added
Window (UTC)Same window in IST
5 Oct 14:00 to 6 Oct 00:005 Oct 19:30 to 6 Oct 05:30
12 Oct 14:00 to 13 Oct 00:0012 Oct 19:30 to 13 Oct 05:30
16 Oct 14:00 to 17 Oct 00:0016 Oct 19:30 to 17 Oct 05:30
19 Oct 14:00 to 20 Oct 00:0019 Oct 19:30 to 20 Oct 05:30
23 Oct 14:00 to 24 Oct 00:0023 Oct 19:30 to 24 Oct 05:30
26 Oct 14:00 to 27 Oct 00:0026 Oct 19:30 to 27 Oct 05:30
29 Oct 14:00 to 30 Oct 00:0029 Oct 19:30 to 30 Oct 05:30
30 Oct 14:00 to 31 Oct 00:0030 Oct 19:30 to 31 Oct 05:30

Neither the changelog nor the issue gives a time of day for the removal on 2 November. Assume the labels can stop working from 00:00 UTC on 2 November, which is 05:30 IST. If a brownout is still ahead when you read this, merge your fix before it starts, and a green run during it proves the fix. After 30 October, your branch test is the only proof.

Which label should you switch to from macos-14?

For most pipelines the answer is macos-15. It is the closest image to macOS 14 that is still supported, and it runs on the same kind of Apple-chip machine. If your workflow only says runs-on: macos-14, that is your answer, and you can skip to the chart below.

The bigger labels need care. Larger runners are bigger machines with more CPUs and memory, picked with a -large or -xlarge suffix. The suffixes do not mean the same chip: in GitHub's docs, -large is Intel and -xlarge is Apple. Larger runners also need a GitHub Team or Enterprise Cloud plan and a payment method on file.

Retiring labels and their replacements (labels from the changelog, issue 13518 and the runner-images README, as of 26 October 2026)
Retiring labelChipPinned replacementFloating replacementWatch out for
macos-14Apple (arm64), 3 CPU, 7 GB RAMmacos-15 or macos-26macos-latest (macOS 26)Xcode 15 is gone
macos-14-largeIntel (x64), 12 CPU, 30 GB RAMmacos-15-largemacos-latest-largeKeep it Intel; GitHub pages disagree on latest here, see the warning near the end
macos-14-xlargeApple (arm64, M2), 5 CPU, 14 GB RAMmacos-15-xlarge or macos-26-xlargemacos-latest-xlargeGitHub pages disagree on latest here, see the warning near the end

If you only need a small Intel machine, the standard labels macos-15-intel and macos-26-intel give you 4 Intel CPUs and 14 GB of memory. You do not need a paid larger runner just to stay on Intel.

Choosing a replacement for one macOS 14 job

Almost every path changes Xcode, because macOS 15 has no Xcode 15. Notice that the Xcode step comes before the chip choice.

Diagram connections:

  • Job on a macOS 14 label to Selects Xcode 15.x?
  • Selects Xcode 15.x? to Change the Xcode path (Yes)
  • Change the Xcode path to Test the build on a branch
  • Selects Xcode 15.x? to Test the build on a branch (No)
  • Test the build on a branch to Needs Intel x64?
  • Needs Intel x64? to macos-15-large or -intel (Yes)
  • Needs Intel x64? to Needed the M2 size? (No)
  • Needed the M2 size? to macos-15-xlarge (Yes)
  • Needed the M2 size? to macos-15 (No)
  • Job on a macOS 14 label: Found by your search
  • Selects Xcode 15.x?: Look for Xcode_15 in the steps
  • Change the Xcode path: To an installed 16.x or 26.x version
  • Test the build on a branch: If no Xcode is set, the default moves to 16.4
  • Needs Intel x64?: Was it macos-14-large?
  • macos-15-large or -intel: Larger or standard Intel machine
  • Needed the M2 size?: Was it macos-14-xlarge?
  • macos-15-xlarge: Apple M2 larger runner
  • macos-15: Standard Apple-chip runner

What is the difference between a pinned label and macos-latest?

A pinned label such as macos-15 always means the same macOS version until GitHub retires it. A floating label such as macos-latest is moved by GitHub to newer versions over time.

Think of a train. A pinned label is like booking one numbered train: same route, same timings, until the railway cancels it. The macos-latest label is like asking for the next fast train to Mumbai, which can be a different train next month.

Here is how the picture maps. The train number is the version in the label. The cancellation notice is the retirement announcement. The next fast train is whatever image GitHub marks as latest GA at the time. Where the picture breaks: even a pinned image changes a little every week, because GitHub updates its tools.

Which image each label reaches, October 2026

Pinned labels point at one image until it retires. Notice that macos-latest no longer means macOS 15: GitHub began moving it to macOS 26 on 15 June 2026, aiming to finish by 15 July.

Diagram connections:

  • runs-on in your workflow to macos-14
  • runs-on in your workflow to macos-15
  • runs-on in your workflow to macos-latest
  • macos-14 to macOS 14 image (Brownouts, then error)
  • macos-15 to macOS 15 image
  • macos-latest to macOS 26 image (Since the mid-2026 move)
  • runs-on in your workflow: The label you wrote
  • macos-14: Pinned, retiring 2 Nov 2026
  • macos-15: Pinned, supported
  • macos-latest: Floating, moved by GitHub
  • macOS 14 image: Xcode 15.0.1 to 15.4, 16.1, 16.2
  • macOS 15 image: Xcode 16.0 to 16.4 and 26.0.1 to 26.3
  • macOS 26 image: Xcode 26.0.1 to 26.6 only

The README sets two promises for floating labels. GitHub announces a move of a -latest label in advance, and the move rolls out over one to two months. During that rollout, some jobs on the same label can land on the old image and some on the new one.

That is why a release build should be pinned. You want the same macOS and the same Xcode on Monday and on Friday. A floating label still has a use, covered later: a nightly job that warns you early about the next version.

How do you find every macos-14 label in your repository?

Run one text search from the top folder of your repository. It works on macOS, Linux and Git Bash on Windows, and it prints the file, the line number and the line for every match.

bash
grep -rni "macos-14" .github/workflows

The -r searches every file in the folder, -n prints line numbers, and -i ignores letter case, so macOS-14 is found too. We ran it with GNU grep 3.11 on four sample workflows: the iOS app, an Electron app, a Flutter app and one that had already moved.

It found four lines, but one was only a comment saying a job had already moved.

It also missed one job. That job builds its label from a matrix, a list of values GitHub loops over to run the same job several times. The label is written as macos-${{ matrix.ver }}, and GitHub fills in 14 when the job runs. The text macos-14 never appears in the file.

So after the search, read every runs-on line that contains ${{ by eye. For one repository that is enough. Engineers who look after many repositories get a stricter scanner in the second half of this guide.

Why does moving from macos-14 to macos-15 change your Xcode version?

Because each image ships its own set of Xcode versions, and the sets barely overlap. A job that names an Xcode path that is not on the new image fails at that step.

The table comes from the image READMEs in the runner-images repository, read on 26 October 2026. A simulator runtime is the installed copy of iOS that tests run on, inside a pretend iPhone. Images update weekly, so check the README again on the day you switch.

Xcode and iOS simulators on the Apple-chip images (runner-images READMEs, as of 26 October 2026)
ImageXcode versions installedDefault XcodeiOS simulator runtimes
macOS 1415.0.1, 15.1, 15.2, 15.3, 15.4, 16.1, 16.215.417.0, 17.2, 17.4, 17.5, 18.1, 18.2
macOS 1516.0 to 16.4, and 26.0.1 to 26.316.418.5, 18.6, 26.0, 26.1, 26.2
macOS 2626.0.1 to 26.6 only26.626.2, 26.4, 26.5

So the guess resolves like this: that job quietly gets Xcode 16.4, and no iOS 17 simulator is installed. A job that selects Xcode_15.4.app fails even earlier, because that folder does not exist. Three things follow from the table:

  • If your workflow never selects Xcode, it silently moves from Xcode 15.4 to 16.4 on macos-15. That is a real compiler upgrade, so expect new warnings and maybe errors.
  • If it selects /Applications/Xcode_15.4.app, change it to an installed version such as Xcode_16.4.app or Xcode_26.3.app.
  • If your tests name an iOS 17 runtime or an older device such as iPhone 15, neither is installed on macos-15. Use one the README lists, such as iPhone 16 on iOS 18.6.

Which Xcode do App Store uploads need?

Xcode 26 or later. Apple's Upcoming Requirements page says that since 28 April 2026, apps uploaded to App Store Connect must be built with Xcode 26 or later, using a version 26 SDK.

The macos-15 image already has Xcode 26.0.1 to 26.3, so you do not need macOS 26 for this. A job that uploads to TestFlight or the App Store can select /Applications/Xcode_26.3.app on the same macos-15 label.

For the iOS pipeline in our setup, that means two edits on a branch. The label becomes macos-15. The Xcode path becomes Xcode_16.4.app for the build-and-test job, or Xcode_26.3.app for any job that uploads.

How do you check the new runner works before 2 November 2026?

Run the changed workflow once on a branch and read two places: the Set up job log and a check step you add. Both show which image and Xcode really ran.

  1. Create a branch

    Make a branch such as move-off-macos-14 so the main branch stays green while you test.

  2. Change the label and Xcode path

    Replace macos-14 with macos-15 in runs-on. Change any Xcode_15.x path to an installed version, as in the last section.

  3. Add a check step

    Add the step from the workflow below that prints the macOS version and the Xcode version.

  4. Push and open the run

    Push the branch, open the Actions tab and open the job. The README says the image version is in the Set up job step log.

  5. Compare with the expected output

    Check the printed versions against the expected output below. Then run your full build and tests on the branch before merging.

  6. Search again

    Run the grep search again. It should print nothing except comments you wrote on purpose.

yaml
name: iOS build
on: [push]
jobs:
  build:
    runs-on: macos-15
    steps:
      - uses: actions/checkout@v7
      - run: sudo xcode-select -s /Applications/Xcode_16.4.app
      - run: |
          sw_vers -productVersion
          xcodebuild -version

Each line does one thing. The checkout step copies your code onto the runner with actions/checkout@v7. Older versions such as v4 were built for Node 20, the JavaScript engine some actions run on. GitHub removed Node 20 from its runners on 23 September 2026.

The xcode-select command picks which installed Xcode the job uses, and sudo runs it with admin rights.

The sw_vers command prints the macOS version, and xcodebuild -version prints the Xcode version. This file passed actionlint 1.7.12, a checker for workflow files, with no errors. We could not run it on a Mac, so the expected output comes from the macOS 15 README of 26 October 2026.

text
15.7.9
Xcode 16.4
Build version 16F6

The first line is the macOS version. Any 15.x number is correct, because the image updates weekly and the third part changes. The next two lines must show Xcode 16.4, or the select step did not work.

How do you scan many repositories for macOS 14 labels and Xcode 15 paths?

Use a small script instead of grep. It reads every .yml and .yaml file in .github/workflows, ignores letter case and comments, and also flags Xcode 15 paths and runs-on lines built from expressions.

An expression is anything inside ${{ }}, which GitHub fills in when the job runs. The script needs only Python 3, with no extra packages.

python
import re
import sys
from pathlib import Path

# Replacement labels from GitHub's 1 October 2026 changelog and issue 13518
SUGGEST = {
    "macos-14": "macos-15 (or macos-26)",
    "macos-14-large": "macos-15-large (Intel)",
    "macos-14-xlarge": "macos-15-xlarge (or macos-26-xlarge)",
}
OLD = re.compile(r"\bmacos-14(?:-large|-xlarge)?\b", re.IGNORECASE)
XCODE15 = re.compile(r"Xcode_15|xcode-version:\s*['\"]?15", re.IGNORECASE)
DYNAMIC = re.compile(r"(runs-on:.*|macos-)\$\{\{", re.IGNORECASE)


def strip_comment(line):
    # A YAML comment starts at a # outside quotes, after a space or at the start
    quote = None
    for i, ch in enumerate(line):
        if ch in "'\"":
            quote = None if quote == ch else (quote or ch)
        elif ch == "#" and quote is None and (i == 0 or line[i - 1] in " \t"):
            return line[:i]
    return line


root = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
files = sorted((root / ".github" / "workflows").glob("*.y*ml"))
found = 0
for f in files:
    for n, line in enumerate(f.read_text(encoding="utf-8").splitlines(), 1):
        code = strip_comment(line)
        for label in OLD.findall(code):
            found += 1
            print(f"{f.name}:{n}: {label} -> try {SUGGEST[label.lower()]}")
        if XCODE15.search(code):
            found += 1
            print(f"{f.name}:{n}: Xcode 15 is not on the macOS 15 or 26 images")
        if DYNAMIC.search(code):
            print(f"{f.name}:{n}: label built from an expression, check by hand")
        if "macos-latest" in code.lower():
            print(f"{f.name}:{n}: macos-latest floats (macOS 26 as of Oct 2026)")
print(f"Scanned {len(files)} files, problems found: {found}")
sys.exit(1 if found else 0)

Save it as find_macos14.py and run python3 find_macos14.py from the repository folder, or pass the folder as an argument. On our four samples, with Python 3.13.17, it printed this:

text
electron.yaml:9: macos-14 -> try macos-15 (or macos-26)
electron.yaml:9: macos-14-large -> try macos-15-large (Intel)
electron.yaml:10: label built from an expression, check by hand
flutter.yml:5: macos-14-xlarge -> try macos-15-xlarge (or macos-26-xlarge)
flutter.yml:12: label built from an expression, check by hand
flutter.yml:16: macos-latest floats (macOS 26 as of Oct 2026)
ios.yml:5: macos-14 -> try macos-15 (or macos-26)
ios.yml:8: Xcode 15 is not on the macOS 15 or 26 images
Scanned 4 files, problems found: 5

It exits with code 1 when it finds a problem and 0 otherwise, so it can run as a CI step that blocks new macos-14 labels. Expression lines are only printed, so they do not change the exit code.

We also changed only the label in ios.yml and ran it again. It still reported the Xcode 15 path and exited with 1, which is the half-fixed job that grep would pass.

What each check caught on our sample and edge-case workflows (run on 26 October 2026)
Case in the sample filesgrep -rnifind_macos14.pyactionlint 1.7.12
runs-on: macos-14FoundFoundNo warning
Quoted "macos-14" in a matrix listFoundFoundNo warning
runs-on: [macos-14-xlarge]FoundFoundNo warning
runs-on: macOS-14 (mixed case)FoundFoundNo warning
macos-${{ matrix.ver }} with ver 14MissedFlagged for a hand checkNo warning
Xcode_15.4 path on a macos-15 jobMissedFoundNo warning
macos-14 inside a YAML commentFalse alarmSkippedNo warning

Actionlint keeps its own list of GitHub runner labels. Its 1.7.10 release removed the macOS 13 labels after GitHub had dropped them. So do not expect a warning before 2 November.

The script has limits. It reads one line at a time, so a runs-on label on the next line, or a setup input like xcode: ^15.4, is not flagged. An apostrophe in an unquoted line can confuse its comment check. It also counts macos-14 written anywhere on a line, such as in a run command.

Which replacement keeps your Intel (x64) builds working?

Use macos-15-large if you need a larger Intel machine, or macos-15-intel for a standard one. Moving macos-14-large to macos-15-xlarge changes the chip from Intel to Apple, which is a different build.

This matters most for desktop apps, such as Electron apps, that ship separate Intel and Apple-chip downloads. Some teams build the Intel version on an Intel runner on purpose. Check what your build steps assume before you change the chip.

A quick way to check is to add the command uname -m to your check step. On an Apple-chip Mac it prints arm64, and on an Intel Mac it prints x86_64.

Intel and Apple-chip labels after macOS 14 (GitHub docs and runner-images README, as of 26 October 2026)
NeedmacOS 15 labelmacOS 26 labelPlan needed
Standard Apple chipmacos-15macos-26 or macos-latestAny plan
Standard Intelmacos-15-intelmacos-26-intelAny plan
Larger Intel (12 CPU)macos-15-largemacos-26-largeTeam or Enterprise Cloud
Larger Apple chip (M2)macos-15-xlargemacos-26-xlargeTeam or Enterprise Cloud

Plan for Intel to end. A GitHub changelog from 19 September 2025 says GitHub will stop supporting Intel on macOS after the macOS 15 image retires in Fall (autumn) 2027. The README also lists macOS 26 Intel labels today. The 2025 notice suggests those end too when macOS 15 retires, but no newer notice confirms it.

How do you stay ahead of the next macOS runner retirement?

Pin macos-15 for builds you ship, run one nightly job on macos-latest as an early warning, and watch GitHub's announcements. That gives you a stable release build and months of notice.

The trade-off is simple. Pinning means you choose when to upgrade, but you must act when GitHub retires the label, as you are doing now. Floating means fewer edits, but your build can change under you during a one to two month rollout.

Expect to repeat this. By the README's policy, the oldest GA label starts deprecation once a newer macOS image reaches GA. As of 26 October 2026, there is no announcement issue for macos-15. The only date we found is the Fall 2027 line in the 2025 changelog.

  • Watch the Announcement label in the actions/runner-images repository, where issue 13518 was posted about ten months before removal.
  • Keep the scanner as a CI step, and add a pattern for macos-15 when its notice arrives.
  • Write the Xcode version into the workflow, so the next person sees what the build depends on.
  • Use Xcode 26 for any job that uploads to App Store Connect, even on macos-15.

How do you explain the macOS 14 runner retirement in a system design interview?

Treat it as a dependency lifecycle question: a platform you depend on removes a version, with a public schedule. Interviewers want to hear how you find the impact, choose a target and roll out safely.

  1. Name the dependency

    The build depends on a runner image picked by a label. The image bundles the OS and the toolchain, so changing it changes Xcode too.

  2. Read the schedule

    Announcement in January 2026, deprecation from July, brownouts in October, removal on 2 November 2026. Brownouts are deliberate failures meant to surface hidden users.

  3. Find every user

    Scan all repositories, including reusable workflows and labels built from expressions. A text search alone misses some and reports false alarms.

  4. Pick the target

    Pin macos-15 to keep the operating-system change small and keep the chip the same. Use its Xcode 26 for App Store uploads, which Apple has required since April 2026.

  5. Roll out and verify

    Change one pipeline on a branch, print the OS and Xcode versions, run full tests, then merge. Add the scanner as a CI guard.

  6. Prevent the next surprise

    Add a nightly job on macos-latest, follow the announcements, and record the toolchain version in the workflow.

Questions people ask

What happens to a job that still uses macos-14 after 2 November 2026?
It fails with an error instead of running. Issue 13518 says workflows using the macos-14, macos-14-large and macos-14-xlarge labels will be terminated with an error. Nothing else in the workflow needs to be wrong for this to happen. The fix is to change the label and re-run.
Why did my macOS job fail on some October evenings but not others?
Most likely because of brownouts, planned windows when GitHub fails macOS 14 jobs on purpose. GitHub scheduled eight between 5 and 30 October 2026, each from 14:00 to 00:00 UTC, which is 19:30 to 05:30 IST. If your job uses a macOS 14 label, move it to macos-15.
Is macos-latest the same as macos-15?
No. GitHub moved macos-latest to macOS 26 in a rollout planned for 15 June to 15 July 2026 (issue 14167), and has confirmed the move is complete. If you want macOS 15, write macos-15. Note that the macOS 26 image only has Xcode 26 versions installed.
Can I still upload to the App Store with Xcode 16?
No. Apple's requirements page says apps uploaded to App Store Connect since 28 April 2026 must be built with Xcode 26 or later. Xcode 16.4 is fine for build-and-test jobs. For upload jobs, select Xcode 26.x, which the macos-15 image already includes.
Do I need to change self-hosted Mac runners?
The announcement covers GitHub-hosted runner images, the machines GitHub starts for you. A Mac you run yourself as a self-hosted runner is not one of those images. Its labels are whatever you or your team gave it, so check your own setup and update macOS there on your own schedule.
Will my Flutter or React Native iOS build break on macos-15?
It might, because the default Xcode moves from 15.4 to 16.4, and iOS 17 simulators and iPhone 15 simulator devices are gone. The main change is the Apple toolchain under the framework. Run the full build and tests on a branch with the new label first, and fix any Xcode errors there.
Does the retirement affect Azure DevOps pipelines?
Yes. Issue 13518 lists both GitHub Actions and Azure DevOps as affected, with full retirement on 2 November 2026. If your company runs Apple builds on Azure Pipelines with a macOS 14 image, it needs the same move to a macOS 15 or newer image.

Sources and further reading

Practise this with Lala

Practise