Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
id: runner-environment-509
title: 'macos-15 (Arm64) Missing SwiftLint Despite Readme Listing It as Installed'
category: runner-environment
severity: error
tags:
- macos-15
- arm64
- swiftlint
- swift
- homebrew
- tool-not-found
- runner-readme
patterns:
- regex: 'swiftlint.*command not found|command not found.*swiftlint'
flags: 'i'
- regex: 'No such file or directory.*swiftlint|swiftlint.*No such file or directory'
flags: 'i'
- regex: 'which swiftlint.*$|swiftlint: not found'
flags: 'im'
error_messages:
- "/Users/runner/work/_temp/....sh: line 2: swiftlint: command not found"
- "ls: /opt/homebrew/bin/swiftlint: No such file or directory"
- "ls: /usr/local/bin/swiftlint: No such file or directory"
root_cause: |
The macOS-15 runner image comes in two architecture variants: `macos-15` (Arm64, the default
when you specify `runs-on: macos-15`) and `macos-15-intel` (Intel/x86_64). These two variants
do NOT have identical toolsets.

SwiftLint is preinstalled on `macos-15-intel` but is NOT preinstalled on `macos-15` (Arm64).
The official Readme linked from search engines and the runner-images repository
(`images/macos/macos-15-Readme.md`) documents the Intel variant's software list. This creates
a documentation mismatch: the Readme confirms SwiftLint is "installed", but workflows
targeting the default `macos-15` label (which resolves to Arm64) will fail with
"command not found".

This affects any workflow that:
- Runs `swiftlint` directly (e.g., `run: swiftlint .`)
- Uses a SwiftLint GitHub Action that expects the binary to be pre-available
- Migrated from `macos-14` or `macos-latest` (previously Intel) to `macos-15` (now Arm64)

Source: runner-images#14239 (June 15, 2026, open)
fix: |
Install SwiftLint explicitly in your workflow using Homebrew before running it. This is the
recommended approach for Arm64 runners and ensures a pinnable, reproducible version:

Option 1 (install via brew): Add a step to install SwiftLint with `brew install swiftlint`.
Option 2 (use mint): Use Mint package manager to install a pinned version.
Option 3 (Intel runner): Use `macos-15-intel` if your workflow specifically requires the
Intel variant and you need the preinstalled SwiftLint without additional setup.

Note: Installing via Homebrew on Arm64 runners adds ~30–90 seconds to workflow time.
fix_code:
- language: yaml
label: "Install SwiftLint via Homebrew on macos-15 (Arm64)"
code: |
jobs:
lint:
runs-on: macos-15 # Arm64 — SwiftLint not preinstalled
steps:
- uses: actions/checkout@v4
- name: Install SwiftLint
run: brew install swiftlint
- name: Run SwiftLint
run: swiftlint .
- language: yaml
label: "Pin SwiftLint version with brew install --formula"
code: |
jobs:
lint:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- name: Install pinned SwiftLint
run: |
brew install swiftlint
swiftlint version
- name: Lint
run: swiftlint lint --reporter github-actions-logging
- language: yaml
label: "Use norio-nomura/action-swiftlint action (installs SwiftLint automatically)"
code: |
jobs:
lint:
runs-on: macos-15
steps:
- uses: actions/checkout@v4
- name: SwiftLint
uses: norio-nomura/action-swiftlint@3.2.1
prevention:
- "Never assume tool availability based on the runner-images Readme without confirming which
architecture variant the Readme describes. The macos-15-Readme.md covers Intel (macos-15-intel),
not the default Arm64 runner."
- "Explicitly install tools you depend on rather than relying on preinstalled versions — this
also gives you control over the version and avoids silent upgrades breaking your workflow."
- "When migrating from macOS Intel runners (macos-14, macos-latest prior to macos-26) to
macos-15 or macos-26, audit your toolchain assumptions: Arm64 and Intel images do not have
identical preinstalled software."
- "Add a toolchain validation step early in your workflow (`which swiftlint && swiftlint version`)
to fail fast with a clear message rather than failing deep in your lint/build steps."
docs:
- url: "https://github.com/actions/runner-images/issues/14239"
label: "runner-images#14239: macos-15 runner claims swiftlint is installed but it is not found (June 2026)"
- url: "https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md"
label: "macos-15 (Intel) runner image installed software Readme"
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories"
label: "GitHub Docs: GitHub-hosted runner hardware and OS specifications"
35 changes: 22 additions & 13 deletions errors/runner-environment/ubuntu-2204-deprecation-brownout.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,30 @@ patterns:
- regex: 'No hosted runner matching.*ubuntu-22\.04'
flags: 'i'
error_messages:
- "DEPRECATION NOTICE: The ubuntu-22.04 image will be deprecated on <DATE>. Please update your workflows to use ubuntu-24.04 instead."
- "The ubuntu-22.04 runner image will not be supported after <DATE>. Migrate to ubuntu-24.04."
- "DEPRECATION NOTICE: The ubuntu-22.04 image will be deprecated on September 17, 2026. Please update your workflows to use ubuntu-24.04 instead."
- "The ubuntu-22.04 runner image will not be supported after April 17, 2027. Migrate to ubuntu-24.04."
- "No hosted runner matching the label 'ubuntu-22.04' was found"
root_cause: |
GitHub follows a phased retirement process for end-of-life runner images. For ubuntu-22.04
(Jammy Jellyfish, EOL April 2027 for standard support), GitHub began deprecation in early 2025
with annotation notices injected into workflow summaries, followed by scheduled "brownout"
windows where the runner image was temporarily unavailable. During a brownout window, jobs
queued with `runs-on: ubuntu-22.04` either wait indefinitely or immediately fail with a
"No hosted runner found" error, depending on the brownout type.
(Jammy Jellyfish), GitHub officially announced the deprecation timeline on June 16, 2026
(runner-images#14254):

After the full retirement date, the runner label is removed entirely. Workflows still targeting
`ubuntu-22.04` fail on every run with no runner available. The retirement does NOT affect
self-hosted runners labelled ubuntu-22.04 — only GitHub-hosted runners.
- **Deprecation begins**: September 17, 2026 — images remain available but queue times
increase during peak hours.
- **Full retirement**: April 17, 2027 — runner labels removed entirely; workflows fail.
- **Brownout windows** (jobs will fail during these windows to raise awareness):
- March 23, 2027: 14:00 UTC – 00:00 UTC
- March 30, 2027: 14:00 UTC – 00:00 UTC
- April 6, 2027: 14:00 UTC – 00:00 UTC
- April 13, 2027: 14:00 UTC – 00:00 UTC

The pattern mirrors ubuntu-20.04 retirement (completed mid-2024). ubuntu-22.04 brownouts
began April 2025 per GitHub Changelog entry "Actions: ubuntu-22.04 runner image deprecated".
During a brownout window, jobs queued with `runs-on: ubuntu-22.04` or `runs-on: ubuntu-22.04-arm`
immediately fail. After full retirement, the runner label is removed entirely and every run fails.

The retirement does NOT affect self-hosted runners labelled ubuntu-22.04 — only GitHub-hosted
runners. ubuntu-22.04-arm is also affected. The pattern mirrors ubuntu-20.04 retirement
(completed mid-2024). Earlier deprecation notices began April 2025 per GitHub Changelog entry
"Actions: ubuntu-22.04 runner image deprecated".
fix: |
Update your `runs-on:` targets to `ubuntu-24.04` (or `ubuntu-latest`, which now maps to
ubuntu-24.04). Before migrating, audit for ubuntu-22.04-specific toolchain assumptions:
Expand Down Expand Up @@ -76,8 +83,10 @@ prevention:
- "Run a periodic workflow that validates your CI still passes on ubuntu-latest to catch image drift before retirement forces a migration."
- "Check runner-images release notes before each minor ubuntu release to review tool changes that will affect your workflows."
docs:
- url: "https://github.com/actions/runner-images/issues/14254"
label: "runner-images#14254: Ubuntu 22 deprecation timeline — Sept 17, 2026 deprecation, April 17, 2027 retirement"
- url: "https://github.blog/changelog/2025-01-09-actions-ubuntu-22-deprecation/"
label: "GitHub Changelog: ubuntu-22.04 deprecation announcement"
label: "GitHub Changelog: ubuntu-22.04 initial deprecation announcement (2025)"
- url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
label: "ubuntu-24.04 runner image installed software"
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
Expand Down
Loading