@htekdev/actions-debugger 1.0.56 → 1.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/errors/caching-artifacts/caching-artifacts-038.yml +95 -0
- package/errors/caching-artifacts/caching-artifacts-039.yml +110 -0
- package/errors/concurrency-timing/concurrency-timing-033.yml +104 -0
- package/errors/concurrency-timing/concurrency-timing-034.yml +123 -0
- package/errors/known-unsolved/known-unsolved-038.yml +124 -0
- package/errors/known-unsolved/known-unsolved-039.yml +102 -0
- package/errors/permissions-auth/permissions-auth-041.yml +110 -0
- package/errors/runner-environment/runner-environment-112.yml +98 -0
- package/errors/runner-environment/runner-environment-113.yml +118 -0
- package/errors/runner-environment/runner-environment-114.yml +130 -0
- package/errors/runner-environment/runner-environment-115.yml +120 -0
- package/errors/runner-environment/runner-environment-116.yml +106 -0
- package/errors/runner-environment/runner-environment-117.yml +109 -0
- package/errors/silent-failures/silent-failures-057.yml +120 -0
- package/errors/silent-failures/silent-failures-058.yml +126 -0
- package/errors/triggers/triggers-041.yml +105 -0
- package/errors/triggers/triggers-042.yml +110 -0
- package/errors/triggers/triggers-043.yml +125 -0
- package/errors/yaml-syntax/yaml-syntax-040.yml +135 -0
- package/errors/yaml-syntax/yaml-syntax-041.yml +147 -0
- package/package.json +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
id: permissions-auth-041
|
|
2
|
+
title: "actions/checkout submodules fail with auth error when private submodule repos are outside the workflow repository"
|
|
3
|
+
category: permissions-auth
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- checkout
|
|
7
|
+
- submodules
|
|
8
|
+
- github-token
|
|
9
|
+
- private-repo
|
|
10
|
+
- authentication
|
|
11
|
+
- pat
|
|
12
|
+
- deploy-key
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'fatal: could not read Username for.*terminal prompts disabled'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'fatal: repository ''.*github\.com.*'' not found'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'remote: Repository not found\.'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'Error: The process.*git.*failed with exit code 128'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "fatal: could not read Username for 'https://github.com': terminal prompts disabled"
|
|
24
|
+
- "fatal: repository 'https://github.com/org/private-submodule/' not found"
|
|
25
|
+
- "remote: Repository not found."
|
|
26
|
+
- "Error: The process '/usr/bin/git' failed with exit code 128"
|
|
27
|
+
root_cause: |
|
|
28
|
+
`actions/checkout` uses the `GITHUB_TOKEN` (or the `token` input) to authenticate
|
|
29
|
+
git operations during checkout, including recursive submodule initialization.
|
|
30
|
+
`GITHUB_TOKEN` is automatically scoped to the repository that owns the running
|
|
31
|
+
workflow — it cannot access private repositories in other organizations, or other
|
|
32
|
+
private repositories within the same organization.
|
|
33
|
+
|
|
34
|
+
When a submodule `.gitmodules` entry points to a private repository that is different
|
|
35
|
+
from the workflow repository, git authentication fails during `submodule update`.
|
|
36
|
+
The resulting error (`fatal: could not read Username` or `repository not found`)
|
|
37
|
+
is confusing because the submodule URL is correct — the problem is authentication
|
|
38
|
+
scope, not the URL itself.
|
|
39
|
+
|
|
40
|
+
Developers upgrading from self-hosted runners (where global git credentials were
|
|
41
|
+
configured) or from `actions/checkout@v1-v2` (which had different authentication
|
|
42
|
+
behavior) frequently encounter this when moving to `actions/checkout@v4` on
|
|
43
|
+
GitHub-hosted runners.
|
|
44
|
+
|
|
45
|
+
This is a deliberate security boundary: `GITHUB_TOKEN` is intentionally limited to
|
|
46
|
+
the current repository to prevent workflows from silently reading other private repos.
|
|
47
|
+
fix: |
|
|
48
|
+
Use one of two approaches:
|
|
49
|
+
|
|
50
|
+
1. **PAT approach**: Create a Personal Access Token (classic PAT with `repo` scope,
|
|
51
|
+
or a fine-grained PAT with read access to all submodule repos). Store it as a
|
|
52
|
+
repository secret and pass it via the `token` input to `actions/checkout`.
|
|
53
|
+
|
|
54
|
+
2. **Deploy key approach**: Add a read-only deploy key to each private submodule
|
|
55
|
+
repository, then use `webfactory/ssh-agent` to load the key before checkout.
|
|
56
|
+
This avoids PATs entirely and follows least-privilege principles.
|
|
57
|
+
|
|
58
|
+
For organizations, a machine account (a GitHub account created for automation) with
|
|
59
|
+
`repo` read access to all submodule repos is often easier to manage than fine-grained
|
|
60
|
+
PATs.
|
|
61
|
+
fix_code:
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: "PAT with repo scope passed via token input"
|
|
64
|
+
code: |
|
|
65
|
+
jobs:
|
|
66
|
+
build:
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v4
|
|
70
|
+
with:
|
|
71
|
+
submodules: recursive
|
|
72
|
+
token: ${{ secrets.SUBMODULE_PAT }}
|
|
73
|
+
# SUBMODULE_PAT: classic PAT with repo scope, or fine-grained PAT
|
|
74
|
+
# with Contents: read on all private submodule repos
|
|
75
|
+
|
|
76
|
+
- language: yaml
|
|
77
|
+
label: "SSH deploy key approach using webfactory/ssh-agent"
|
|
78
|
+
code: |
|
|
79
|
+
jobs:
|
|
80
|
+
build:
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
steps:
|
|
83
|
+
- name: Configure SSH agent with submodule deploy key
|
|
84
|
+
uses: webfactory/ssh-agent@v0.9.0
|
|
85
|
+
with:
|
|
86
|
+
ssh-private-key: ${{ secrets.SUBMODULE_DEPLOY_KEY }}
|
|
87
|
+
# Add multiple keys for multiple private submodule repos:
|
|
88
|
+
# ssh-private-key: |
|
|
89
|
+
# ${{ secrets.SUBMODULE_REPO_A_KEY }}
|
|
90
|
+
# ${{ secrets.SUBMODULE_REPO_B_KEY }}
|
|
91
|
+
|
|
92
|
+
- uses: actions/checkout@v4
|
|
93
|
+
with:
|
|
94
|
+
submodules: recursive
|
|
95
|
+
# No token needed — SSH agent handles git authentication
|
|
96
|
+
prevention:
|
|
97
|
+
- "Prefer deploy keys over PATs for submodule access — deploy keys are repo-scoped and easier to rotate"
|
|
98
|
+
- "Use fine-grained PATs scoped to specific repositories rather than classic PATs with broad repo scope"
|
|
99
|
+
- "Document which submodule repos require special secrets so new contributors can configure their forks"
|
|
100
|
+
- "Consider converting private submodule dependencies to private packages in a registry to avoid cross-repo auth complexity"
|
|
101
|
+
- "Test submodule checkout in a fresh fork or on a runner without existing git credentials to catch auth issues early"
|
|
102
|
+
docs:
|
|
103
|
+
- url: "https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#permissions-for-the-github_token"
|
|
104
|
+
label: "GitHub Docs — GITHUB_TOKEN permissions and scope"
|
|
105
|
+
- url: "https://github.com/actions/checkout#usage"
|
|
106
|
+
label: "actions/checkout — token and submodules inputs"
|
|
107
|
+
- url: "https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys"
|
|
108
|
+
label: "GitHub Docs — Managing deploy keys"
|
|
109
|
+
- url: "https://github.com/webfactory/ssh-agent"
|
|
110
|
+
label: "webfactory/ssh-agent — Load SSH keys for Actions"
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
id: runner-environment-112
|
|
2
|
+
title: "ubuntu-24.04 nftables replaces iptables — Docker bridge networking and kind/minikube cluster setup fails"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24.04
|
|
7
|
+
- docker
|
|
8
|
+
- networking
|
|
9
|
+
- iptables
|
|
10
|
+
- nftables
|
|
11
|
+
- kind
|
|
12
|
+
- minikube
|
|
13
|
+
- runner-image-update
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'No chain/target/match by that name'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'iptables.*failed.*nat.*DOCKER'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'Failed to set up iptables.*\(iptables-nft\)'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
- regex: 'network.*setup.*failed.*iptables'
|
|
22
|
+
flags: 'i'
|
|
23
|
+
- regex: 'Error response from daemon.*iptables failed'
|
|
24
|
+
flags: 'i'
|
|
25
|
+
error_messages:
|
|
26
|
+
- "iptables: No chain/target/match by that name."
|
|
27
|
+
- "Error response from daemon: driver failed programming external connectivity on endpoint: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5432 -j DNAT --to-destination 172.17.0.2:5432 ! -i docker0: iptables: No chain/target/match by that name."
|
|
28
|
+
- "Failed to set up iptables rules: iptables-nft is not supported"
|
|
29
|
+
- "Error: failed to create cluster: failed to ensure docker network: failed to set up kind CNI"
|
|
30
|
+
root_cause: |
|
|
31
|
+
Ubuntu 24.04 ships with nftables as the primary packet-filtering framework. The `iptables`
|
|
32
|
+
command is now a thin wrapper around nftables (`iptables-nft`), replacing the legacy
|
|
33
|
+
`iptables-legacy` backend that was default on Ubuntu 20.04/22.04.
|
|
34
|
+
|
|
35
|
+
Docker's bridge networking writes iptables rules using legacy format assumptions. CNI plugins
|
|
36
|
+
used by Kubernetes tools (kind, minikube, k3s) also expect the legacy iptables backend to be
|
|
37
|
+
active. When these tools run on ubuntu-24.04, they encounter incompatible chain formats and
|
|
38
|
+
rule semantics that iptables-nft does not honour, causing network setup to fail with "No
|
|
39
|
+
chain/target/match by that name" errors.
|
|
40
|
+
|
|
41
|
+
The runner-images migration from ubuntu-22.04 to ubuntu-24.04 (and from ubuntu-latest pointing
|
|
42
|
+
to ubuntu-22.04 to ubuntu-24.04) silently exposes this issue for any workflow running
|
|
43
|
+
Docker-in-Docker, Kubernetes clusters, or service containers with custom networking.
|
|
44
|
+
fix: |
|
|
45
|
+
Switch the `iptables` alternative back to the legacy backend before starting Docker or
|
|
46
|
+
any CNI-based tooling. Add this step at the top of your job, before any Docker or cluster
|
|
47
|
+
setup steps:
|
|
48
|
+
|
|
49
|
+
- name: Switch to legacy iptables
|
|
50
|
+
run: |
|
|
51
|
+
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
|
|
52
|
+
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
|
|
53
|
+
|
|
54
|
+
For kind clusters, the above fix is the most reliable approach.
|
|
55
|
+
|
|
56
|
+
If you cannot switch the iptables backend (e.g., you require nftables for other reasons),
|
|
57
|
+
use Docker with `--iptables=false` and manage forwarding rules manually, or use network
|
|
58
|
+
mode `host` where possible.
|
|
59
|
+
|
|
60
|
+
Long-term: upgrade to versions of kind (≥ v0.24), minikube (≥ v1.33), and Docker Engine
|
|
61
|
+
(≥ 27) that include nftables-native support.
|
|
62
|
+
fix_code:
|
|
63
|
+
- language: yaml
|
|
64
|
+
label: "Switch to iptables-legacy before Docker or cluster setup (ubuntu-24.04)"
|
|
65
|
+
code: |
|
|
66
|
+
jobs:
|
|
67
|
+
test:
|
|
68
|
+
runs-on: ubuntu-24.04
|
|
69
|
+
steps:
|
|
70
|
+
- name: Switch to legacy iptables
|
|
71
|
+
run: |
|
|
72
|
+
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
|
|
73
|
+
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
|
|
74
|
+
|
|
75
|
+
- name: Start kind cluster
|
|
76
|
+
uses: helm/kind-action@v1
|
|
77
|
+
with:
|
|
78
|
+
cluster_name: ci
|
|
79
|
+
- language: yaml
|
|
80
|
+
label: "Pin runs-on to ubuntu-22.04 as a temporary workaround"
|
|
81
|
+
code: |
|
|
82
|
+
jobs:
|
|
83
|
+
test:
|
|
84
|
+
# Temporary: ubuntu-22.04 uses iptables-legacy by default
|
|
85
|
+
# TODO: migrate to ubuntu-24.04 after updating kind/Docker versions
|
|
86
|
+
runs-on: ubuntu-22.04
|
|
87
|
+
prevention:
|
|
88
|
+
- "Test workflows on ubuntu-24.04 explicitly before relying on ubuntu-latest switching to it"
|
|
89
|
+
- "Keep kind, minikube, and Docker Engine versions current — nftables-native support arrived in each"
|
|
90
|
+
- "Add an iptables-legacy switch step as a defensive measure in any job using Docker networking or CNI plugins"
|
|
91
|
+
- "Watch runner-images release notes (github.com/actions/runner-images) for ubuntu-latest label changes"
|
|
92
|
+
docs:
|
|
93
|
+
- url: "https://docs.docker.com/network/iptables/"
|
|
94
|
+
label: "Docker — iptables and nftables networking"
|
|
95
|
+
- url: "https://github.com/actions/runner-images/issues/10636"
|
|
96
|
+
label: "runner-images #10636 — ubuntu-24.04 iptables-nft Docker incompatibility"
|
|
97
|
+
- url: "https://kind.sigs.k8s.io/docs/user/known-issues/"
|
|
98
|
+
label: "kind — Known Issues including iptables compatibility"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: runner-environment-113
|
|
2
|
+
title: "ubuntu-24.04 removed python3-distutils — ModuleNotFoundError: No module named 'distutils' on pip install"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24.04
|
|
7
|
+
- python
|
|
8
|
+
- distutils
|
|
9
|
+
- pip
|
|
10
|
+
- setup-py
|
|
11
|
+
- runner-image-update
|
|
12
|
+
- python-3-12
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "ModuleNotFoundError: No module named 'distutils'"
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'No module named ''distutils\.core'''
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'error in setup command.*distutils'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'distutils.*not found.*pip install'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "ModuleNotFoundError: No module named 'distutils'"
|
|
24
|
+
- "ModuleNotFoundError: No module named 'distutils.core'"
|
|
25
|
+
- "error in setup command: Error parsing /path/to/setup.cfg: No module named 'distutils.core'"
|
|
26
|
+
- "note: This error originates from a subprocess, and is likely not a problem with pip."
|
|
27
|
+
- "error: legacy-install-failure"
|
|
28
|
+
root_cause: |
|
|
29
|
+
Ubuntu 24.04 ships Python 3.12 as the system Python. Python 3.12 fully removed the
|
|
30
|
+
`distutils` module from its standard library (it was deprecated in 3.10 and removed in 3.12
|
|
31
|
+
per PEP 632). Ubuntu Noble (24.04) also removed the `python3-distutils` apt backport package
|
|
32
|
+
that had been available on 20.04 and 22.04.
|
|
33
|
+
|
|
34
|
+
Many older Python packages still use `distutils` directly in their `setup.py` or `setup.cfg`
|
|
35
|
+
files. When `pip install` processes these packages, the build backend invokes `distutils` which
|
|
36
|
+
is no longer available. The error appears to be a build backend failure rather than a pip
|
|
37
|
+
failure, so the root cause is easy to miss.
|
|
38
|
+
|
|
39
|
+
This affects any workflow that:
|
|
40
|
+
- Uses the system Python (no `actions/setup-python` step)
|
|
41
|
+
- Installs packages with legacy `setup.py` that import `distutils`
|
|
42
|
+
- Creates virtualenvs from the system Python without pre-installing setuptools
|
|
43
|
+
|
|
44
|
+
Distinct from `setup-python-version-range-resolves-to-313-distutils-removed` which covers
|
|
45
|
+
setup-python action resolving to Python 3.12/3.13 and distutils in user packages. This entry
|
|
46
|
+
covers the apt-level removal affecting system Python on the ubuntu-24.04 runner image itself.
|
|
47
|
+
fix: |
|
|
48
|
+
Option 1 (recommended): Use actions/setup-python to manage the Python version explicitly.
|
|
49
|
+
setup-python bundles setuptools which provides a distutils compatibility shim.
|
|
50
|
+
|
|
51
|
+
Option 2: Install setuptools as the first pip action before installing other packages.
|
|
52
|
+
setuptools >= 58.0.0 ships a `distutils` compatibility shim that satisfies `import distutils`.
|
|
53
|
+
|
|
54
|
+
- name: Install setuptools (distutils shim)
|
|
55
|
+
run: pip install setuptools
|
|
56
|
+
|
|
57
|
+
Option 3: Install the apt package `python3-setuptools` which restores distutils compatibility
|
|
58
|
+
at the system level for Python 3.12.
|
|
59
|
+
|
|
60
|
+
Option 4 (long-term): Migrate the affected package to PEP 517/518 — replace setup.py with
|
|
61
|
+
pyproject.toml and a modern build backend (setuptools>=61, flit, hatch, etc.).
|
|
62
|
+
fix_code:
|
|
63
|
+
- language: yaml
|
|
64
|
+
label: "Use actions/setup-python so setuptools is available (recommended)"
|
|
65
|
+
code: |
|
|
66
|
+
jobs:
|
|
67
|
+
build:
|
|
68
|
+
runs-on: ubuntu-24.04
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v4
|
|
71
|
+
|
|
72
|
+
- uses: actions/setup-python@v5
|
|
73
|
+
with:
|
|
74
|
+
python-version: '3.12'
|
|
75
|
+
|
|
76
|
+
- name: Install dependencies
|
|
77
|
+
run: pip install -r requirements.txt
|
|
78
|
+
- language: yaml
|
|
79
|
+
label: "Pre-install setuptools to restore distutils shim (quick fix for system Python)"
|
|
80
|
+
code: |
|
|
81
|
+
jobs:
|
|
82
|
+
build:
|
|
83
|
+
runs-on: ubuntu-24.04
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
|
|
87
|
+
- name: Install setuptools (distutils compatibility shim for Python 3.12)
|
|
88
|
+
run: pip install --upgrade setuptools
|
|
89
|
+
|
|
90
|
+
- name: Install dependencies
|
|
91
|
+
run: pip install -r requirements.txt
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: "Install python3-setuptools via apt (system-level fix)"
|
|
94
|
+
code: |
|
|
95
|
+
jobs:
|
|
96
|
+
build:
|
|
97
|
+
runs-on: ubuntu-24.04
|
|
98
|
+
steps:
|
|
99
|
+
- name: Install python3-setuptools
|
|
100
|
+
run: sudo apt-get install -y python3-setuptools
|
|
101
|
+
|
|
102
|
+
- name: Install dependencies
|
|
103
|
+
run: pip install -r requirements.txt
|
|
104
|
+
prevention:
|
|
105
|
+
- "Always use actions/setup-python rather than relying on system Python — it ships with setuptools"
|
|
106
|
+
- "Pin a Python version explicitly; avoid implicit system Python which changes per runner image"
|
|
107
|
+
- "Run pip install --dry-run in CI to detect distutils/setuptools issues before they block builds"
|
|
108
|
+
- "Audit third-party dependencies for setup.py usage with: pip install pipdeptree; pipdeptree | grep setup.py"
|
|
109
|
+
- "Migrate legacy setup.py packages to pyproject.toml for long-term Python 3.12+ compatibility"
|
|
110
|
+
docs:
|
|
111
|
+
- url: "https://docs.python.org/3/whatsnew/3.12.html#removed"
|
|
112
|
+
label: "Python 3.12 — Removed modules (distutils)"
|
|
113
|
+
- url: "https://peps.python.org/pep-0632/"
|
|
114
|
+
label: "PEP 632 — Deprecate distutils"
|
|
115
|
+
- url: "https://github.com/actions/runner-images/issues/9674"
|
|
116
|
+
label: "runner-images #9674 — python3-distutils unavailable on ubuntu-24.04"
|
|
117
|
+
- url: "https://github.com/actions/setup-python"
|
|
118
|
+
label: "actions/setup-python — bundles setuptools"
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
id: runner-environment-114
|
|
2
|
+
title: "macOS-26 / Xcode 26 defaults to Swift 6 strict concurrency — existing Swift builds fail with actor isolation errors"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- macos-26
|
|
7
|
+
- xcode-26
|
|
8
|
+
- swift-6
|
|
9
|
+
- concurrency
|
|
10
|
+
- actor-isolation
|
|
11
|
+
- runner-image-update
|
|
12
|
+
- breaking-change
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: "error: sending '.*' to actor-isolated"
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'actor-isolated.*cannot.*referenced from.*non-isolated'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: "error: '.*' cannot be used to satisfy the '@Sendable' requirement"
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'error:.*Sendable.*cannot conform.*in Swift 6'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
- regex: 'main actor-isolated.*cannot be referenced from.*nonisolated'
|
|
23
|
+
flags: 'i'
|
|
24
|
+
error_messages:
|
|
25
|
+
- "error: sending 'self' to actor-isolated initializer 'init()' risks causing data races"
|
|
26
|
+
- "error: actor-isolated property 'delegate' can not be referenced from a non-isolated context"
|
|
27
|
+
- "error: main actor-isolated class method 'viewDidLoad()' cannot be referenced from a nonisolated context"
|
|
28
|
+
- "error: 'Sendable'-conforming class 'MyViewController' cannot inherit from another class other than 'NSObject'"
|
|
29
|
+
- "error: expression is 'async' but is not marked with 'await'"
|
|
30
|
+
root_cause: |
|
|
31
|
+
Xcode 26 (shipped with the macos-26 runner) defaults to Swift 6 language mode. Previous
|
|
32
|
+
Xcode versions (14, 15, 16) compiled in Swift 5 compatibility mode by default, which did not
|
|
33
|
+
enforce strict data-race safety checking.
|
|
34
|
+
|
|
35
|
+
Swift 6 enforces complete concurrency checking at compile time:
|
|
36
|
+
- All values shared across actor boundaries must conform to `Sendable`
|
|
37
|
+
- Calls to `@MainActor`-isolated methods from non-isolated contexts must be `await`-ed
|
|
38
|
+
- Closures passed to async contexts must be `@Sendable`
|
|
39
|
+
- Class hierarchies that cross actor boundaries require explicit `Sendable` conformance
|
|
40
|
+
|
|
41
|
+
Code that compiled and ran correctly under Swift 5 may produce dozens of compiler errors in
|
|
42
|
+
Swift 6, even if it had no actual concurrency bugs. The errors are not warnings — they are
|
|
43
|
+
hard build failures.
|
|
44
|
+
|
|
45
|
+
The macos-26 runner ships Xcode 26 as the default Xcode. Any workflow running `xcodebuild`
|
|
46
|
+
or `swift build` without an explicit Swift language version flag will pick up Swift 6.
|
|
47
|
+
fix: |
|
|
48
|
+
Short-term: Pin to Swift 5 compatibility mode in your build command or project settings.
|
|
49
|
+
|
|
50
|
+
Option A — xcodebuild flag:
|
|
51
|
+
xcodebuild build -scheme MyScheme SWIFT_VERSION=5
|
|
52
|
+
|
|
53
|
+
Option B — Xcode build settings (xcconfig or project settings):
|
|
54
|
+
SWIFT_VERSION = 5
|
|
55
|
+
|
|
56
|
+
Option C — Package.swift swift-tools-version (for Swift Package Manager projects):
|
|
57
|
+
Change the first line to: // swift-tools-version: 5.10
|
|
58
|
+
This sets the package manifest version and implicitly enables Swift 5 mode for dependencies.
|
|
59
|
+
|
|
60
|
+
Option D — Per-target in Package.swift:
|
|
61
|
+
.target(name: "MyTarget", swiftSettings: [.unsafeFlags(["-swift-version", "5"])])
|
|
62
|
+
|
|
63
|
+
Long-term: Migrate your codebase to Swift 6 concurrency model by resolving actor isolation
|
|
64
|
+
errors. Apple provides a migration guide at developer.apple.com/documentation/swift/migrating-to-swift-6.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Pin SWIFT_VERSION=5 in xcodebuild to restore Swift 5 compatibility on macos-26"
|
|
68
|
+
code: |
|
|
69
|
+
jobs:
|
|
70
|
+
build:
|
|
71
|
+
runs-on: macos-26
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
|
|
75
|
+
- name: Build (Swift 5 compatibility mode)
|
|
76
|
+
run: |
|
|
77
|
+
xcodebuild build \
|
|
78
|
+
-scheme MyApp \
|
|
79
|
+
-destination 'platform=macOS' \
|
|
80
|
+
SWIFT_VERSION=5
|
|
81
|
+
|
|
82
|
+
- name: Test (Swift 5 compatibility mode)
|
|
83
|
+
run: |
|
|
84
|
+
xcodebuild test \
|
|
85
|
+
-scheme MyApp \
|
|
86
|
+
-destination 'platform=macOS' \
|
|
87
|
+
SWIFT_VERSION=5
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: "Pin swift-tools-version in Package.swift for SPM projects"
|
|
90
|
+
code: |
|
|
91
|
+
# In Package.swift — change the first line to request Swift 5 tools:
|
|
92
|
+
# // swift-tools-version: 5.10
|
|
93
|
+
#
|
|
94
|
+
# Then in the workflow:
|
|
95
|
+
jobs:
|
|
96
|
+
build:
|
|
97
|
+
runs-on: macos-26
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: Build Swift package
|
|
102
|
+
run: swift build -c release
|
|
103
|
+
- language: yaml
|
|
104
|
+
label: "Temporarily pin to macos-15 while migrating to Swift 6"
|
|
105
|
+
code: |
|
|
106
|
+
jobs:
|
|
107
|
+
build:
|
|
108
|
+
# TODO: Migrate to Swift 6 and update to macos-26
|
|
109
|
+
# Track progress at: <link to your Swift 6 migration issue>
|
|
110
|
+
runs-on: macos-15
|
|
111
|
+
steps:
|
|
112
|
+
- uses: actions/checkout@v4
|
|
113
|
+
|
|
114
|
+
- name: Build
|
|
115
|
+
run: xcodebuild build -scheme MyApp -destination 'platform=macOS'
|
|
116
|
+
prevention:
|
|
117
|
+
- "Test workflows on macos-26 before relying on macos-latest switching to it"
|
|
118
|
+
- "Specify SWIFT_VERSION explicitly in Xcode project settings rather than relying on Xcode defaults"
|
|
119
|
+
- "Enable strict concurrency warnings (SWIFT_STRICT_CONCURRENCY=complete) in Swift 5 mode to preview Swift 6 errors before migrating"
|
|
120
|
+
- "Watch github.com/actions/runner-images release notes for macos-latest label changes"
|
|
121
|
+
- "Pin swift-tools-version in Package.swift to document the intended Swift compatibility level"
|
|
122
|
+
docs:
|
|
123
|
+
- url: "https://developer.apple.com/documentation/swift/migrating-to-swift-6"
|
|
124
|
+
label: "Apple Developer — Migrating to Swift 6"
|
|
125
|
+
- url: "https://www.swift.org/migration/documentation/swift-6-concurrency-migration-guide/"
|
|
126
|
+
label: "Swift.org — Swift 6 Concurrency Migration Guide"
|
|
127
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/macos/macos-26-Readme.md"
|
|
128
|
+
label: "runner-images — macOS 26 image README (Xcode default version)"
|
|
129
|
+
- url: "https://developer.apple.com/documentation/xcode-release-notes"
|
|
130
|
+
label: "Xcode Release Notes — Xcode 26 language defaults"
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
id: runner-environment-115
|
|
2
|
+
title: "ubuntu-22.04/24.04 OpenSSL 3 disables legacy TLS renegotiation — SSL handshake failures connecting to legacy servers"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-22.04
|
|
7
|
+
- ubuntu-24.04
|
|
8
|
+
- openssl-3
|
|
9
|
+
- tls
|
|
10
|
+
- ssl
|
|
11
|
+
- renegotiation
|
|
12
|
+
- runner-image-update
|
|
13
|
+
- networking
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'unsafe legacy renegotiation disabled'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'error:0A000179:SSL routines.*unsafe legacy renegotiation'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
- regex: 'UNSAFE_LEGACY_RENEGOTIATION_DISABLED'
|
|
22
|
+
flags: 'i'
|
|
23
|
+
- regex: 'ssl.*renegotiation.*not allowed'
|
|
24
|
+
flags: 'i'
|
|
25
|
+
error_messages:
|
|
26
|
+
- "error:0A000179:SSL routines::unsafe legacy renegotiation disabled"
|
|
27
|
+
- "SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST"
|
|
28
|
+
- "ssl.SSLError: [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:997)"
|
|
29
|
+
- "OpenSSL Error: error:0A000179:SSL routines:ssl3_read_bytes:unsafe legacy renegotiation disabled"
|
|
30
|
+
- "curl: (35) OpenSSL SSL_connect: error:0A000179:SSL routines::unsafe legacy renegotiation disabled"
|
|
31
|
+
- "java.io.IOException: Error writing to server: javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake"
|
|
32
|
+
root_cause: |
|
|
33
|
+
Ubuntu 22.04 and 24.04 ship OpenSSL 3.0+. OpenSSL 3.0 enforces RFC 5746 (TLS Renegotiation
|
|
34
|
+
Indication Extension) by default and rejects connections to TLS servers that do not advertise
|
|
35
|
+
support for secure renegotiation in the initial ClientHello/ServerHello handshake.
|
|
36
|
+
|
|
37
|
+
Servers compiled against older OpenSSL (< 0.9.8m) or certain embedded TLS stacks do not send
|
|
38
|
+
the `renegotiation_info` extension and are therefore rejected by OpenSSL 3.0 clients with
|
|
39
|
+
`UNSAFE_LEGACY_RENEGOTIATION_DISABLED`.
|
|
40
|
+
|
|
41
|
+
This commonly surfaces when:
|
|
42
|
+
- Workflows connect to internal/staging HTTPS servers running old TLS stacks
|
|
43
|
+
- docker-compose services use self-signed certs from outdated libraries
|
|
44
|
+
- gRPC clients compiled against old OpenSSL connect to legacy gRPC servers
|
|
45
|
+
- curl/wget calls target third-party APIs that have not updated their TLS handshake
|
|
46
|
+
- Java HTTPS tests connect to embedded Jetty/Netty servers with old SSL config
|
|
47
|
+
|
|
48
|
+
The error did not occur on ubuntu-20.04 (OpenSSL 1.1.1, which allowed legacy renegotiation
|
|
49
|
+
by default). Workflows migrating from ubuntu-20.04 to 22.04/24.04 encounter it for the first
|
|
50
|
+
time.
|
|
51
|
+
fix: |
|
|
52
|
+
Option 1 (recommended for CI): Append `UnsafeLegacyRenegotiation = true` to the OpenSSL
|
|
53
|
+
config file at the start of the job. This is acceptable in CI/testing contexts where you
|
|
54
|
+
control the environment; never use this in production.
|
|
55
|
+
|
|
56
|
+
Option 2: Set OPENSSL_CONF to /dev/null to bypass the OpenSSL configuration file entirely.
|
|
57
|
+
Use only for quick diagnostics or tests against known internal servers.
|
|
58
|
+
|
|
59
|
+
Option 3 (recommended long-term): Upgrade the legacy server's TLS library so it advertises
|
|
60
|
+
RFC 5746 support. For embedded test servers, upgrade the underlying HTTP/TLS library version.
|
|
61
|
+
|
|
62
|
+
Option 4: Use `curl --no-sessionid` or `curl --legacy-renegotiation` (curl 7.83+) for
|
|
63
|
+
specific curl-based steps without affecting the whole environment.
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: "Enable UnsafeLegacyRenegotiation in OpenSSL config for CI (workaround)"
|
|
67
|
+
code: |
|
|
68
|
+
jobs:
|
|
69
|
+
integration-test:
|
|
70
|
+
runs-on: ubuntu-24.04
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
|
|
74
|
+
- name: Allow legacy TLS renegotiation (CI workaround for legacy test servers)
|
|
75
|
+
run: |
|
|
76
|
+
echo "Options = UnsafeLegacyRenegotiation" | \
|
|
77
|
+
sudo tee -a /etc/ssl/openssl.cnf
|
|
78
|
+
|
|
79
|
+
- name: Run integration tests
|
|
80
|
+
run: npm test
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: "Override OPENSSL_CONF per-step (minimal blast radius)"
|
|
83
|
+
code: |
|
|
84
|
+
jobs:
|
|
85
|
+
integration-test:
|
|
86
|
+
runs-on: ubuntu-24.04
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/checkout@v4
|
|
89
|
+
|
|
90
|
+
- name: Test against legacy HTTPS endpoint
|
|
91
|
+
env:
|
|
92
|
+
OPENSSL_CONF: /dev/null
|
|
93
|
+
run: |
|
|
94
|
+
curl -v https://legacy-test-server.internal/health
|
|
95
|
+
- language: yaml
|
|
96
|
+
label: "Set OPENSSL_CONF at job level (affects all steps)"
|
|
97
|
+
code: |
|
|
98
|
+
jobs:
|
|
99
|
+
integration-test:
|
|
100
|
+
runs-on: ubuntu-24.04
|
|
101
|
+
env:
|
|
102
|
+
OPENSSL_CONF: /dev/null
|
|
103
|
+
steps:
|
|
104
|
+
- uses: actions/checkout@v4
|
|
105
|
+
- run: npm test
|
|
106
|
+
prevention:
|
|
107
|
+
- "Upgrade internal/staging test servers to modern TLS libraries that support RFC 5746"
|
|
108
|
+
- "Use `openssl s_client -connect host:443` in CI to detect legacy renegotiation issues before they block builds"
|
|
109
|
+
- "Avoid pinning to ubuntu-20.04 as a permanent workaround — it reached EOL and will be removed from runner images"
|
|
110
|
+
- "When upgrading from ubuntu-20.04 to 22.04/24.04, run a connectivity smoke-test against all HTTPS endpoints the workflow touches"
|
|
111
|
+
- "Use testcontainers or modern embedded test server libraries that ship up-to-date TLS stacks"
|
|
112
|
+
docs:
|
|
113
|
+
- url: "https://www.openssl.org/docs/man3.0/man3/SSL_CTX_set_options.html"
|
|
114
|
+
label: "OpenSSL 3.0 — SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION option"
|
|
115
|
+
- url: "https://github.com/actions/runner-images/issues/6399"
|
|
116
|
+
label: "runner-images #6399 — OpenSSL 3 renegotiation issues on ubuntu-22.04"
|
|
117
|
+
- url: "https://github.com/openssl/openssl/issues/17593"
|
|
118
|
+
label: "OpenSSL #17593 — Legacy renegotiation rejection in 3.0"
|
|
119
|
+
- url: "https://www.rfc-editor.org/rfc/rfc5746"
|
|
120
|
+
label: "RFC 5746 — TLS Renegotiation Indication Extension"
|