@htekdev/actions-debugger 1.0.57 → 1.0.59
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-040.yml +112 -0
- package/errors/permissions-auth/permissions-auth-042.yml +125 -0
- package/errors/runner-environment/runner-environment-118.yml +102 -0
- package/errors/runner-environment/runner-environment-119.yml +98 -0
- package/errors/runner-environment/runner-environment-120.yml +118 -0
- package/errors/runner-environment/runner-environment-121.yml +113 -0
- package/errors/runner-environment/runner-environment-122.yml +134 -0
- package/errors/silent-failures/silent-failures-059.yml +104 -0
- package/package.json +1 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
id: caching-artifacts-040
|
|
2
|
+
title: "actions/download-artifact@v4 cross-workflow download silently returns no artifacts without actions: read permission"
|
|
3
|
+
category: caching-artifacts
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- download-artifact
|
|
7
|
+
- v4
|
|
8
|
+
- cross-workflow
|
|
9
|
+
- permissions
|
|
10
|
+
- actions-read
|
|
11
|
+
- run-id
|
|
12
|
+
- breaking-change
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Unable to find any artifacts for the associated workflow'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'No artifacts found for the associated workflow run'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'run-id:.*\d+'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'Resource not accessible by integration'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "Unable to find any artifacts for the associated workflow"
|
|
24
|
+
- "No artifacts found for the associated workflow run"
|
|
25
|
+
- "Resource not accessible by integration"
|
|
26
|
+
- "Error: Artifact download failed: 403 Forbidden"
|
|
27
|
+
root_cause: |
|
|
28
|
+
actions/download-artifact@v4 introduced the ability to download artifacts produced
|
|
29
|
+
by a *different* workflow run (not just the current run) by specifying the `run-id`
|
|
30
|
+
input. This cross-workflow download requires the `actions: read` permission on the
|
|
31
|
+
GITHUB_TOKEN.
|
|
32
|
+
|
|
33
|
+
Workflows that do not explicitly declare `permissions: actions: read` will use the
|
|
34
|
+
default GITHUB_TOKEN permissions. In repositories where the default token permissions
|
|
35
|
+
are set to "read for all" at the org level, `actions` read may be granted by default
|
|
36
|
+
— but in repositories with restrictive default permissions or when only specific
|
|
37
|
+
permissions are declared in the workflow, `actions: read` is NOT automatically
|
|
38
|
+
included.
|
|
39
|
+
|
|
40
|
+
The misleading aspect is the error message: "Unable to find any artifacts for the
|
|
41
|
+
associated workflow" suggests the artifact does not exist, when in fact the issue is
|
|
42
|
+
a 403 permission denial. The action does not distinguish between "artifact not found"
|
|
43
|
+
and "access denied" in its error output.
|
|
44
|
+
|
|
45
|
+
This is a new permission requirement introduced in v4 that did not exist in v3
|
|
46
|
+
(which only supported downloading from the current workflow run and did not need
|
|
47
|
+
`actions` read access).
|
|
48
|
+
|
|
49
|
+
Common trigger scenario: a workflow that processes artifacts from a different trigger
|
|
50
|
+
(e.g., a deployment workflow that downloads build artifacts from a build workflow run)
|
|
51
|
+
is upgraded from download-artifact@v3 to @v4 and the `run-id` input is added — but
|
|
52
|
+
the required `permissions: actions: read` block is not added.
|
|
53
|
+
fix: |
|
|
54
|
+
Add `actions: read` to the permissions block of the job or workflow that uses
|
|
55
|
+
`actions/download-artifact@v4` with a `run-id` input referencing a different workflow.
|
|
56
|
+
|
|
57
|
+
If the workflow or job already has a `permissions` block, add `actions: read` to it.
|
|
58
|
+
If there is no `permissions` block, add one with the minimum required permissions
|
|
59
|
+
including `actions: read` and `contents: read`.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: "Add actions: read permission for cross-workflow artifact download"
|
|
63
|
+
code: |
|
|
64
|
+
jobs:
|
|
65
|
+
deploy:
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
permissions:
|
|
68
|
+
actions: read # Required for download-artifact@v4 with run-id
|
|
69
|
+
contents: read
|
|
70
|
+
steps:
|
|
71
|
+
- name: Download build artifacts from build workflow
|
|
72
|
+
uses: actions/download-artifact@v4
|
|
73
|
+
with:
|
|
74
|
+
name: build-output
|
|
75
|
+
run-id: ${{ github.event.inputs.build_run_id }}
|
|
76
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Workflow-level permissions for cross-workflow download"
|
|
79
|
+
code: |
|
|
80
|
+
on:
|
|
81
|
+
workflow_dispatch:
|
|
82
|
+
inputs:
|
|
83
|
+
build_run_id:
|
|
84
|
+
description: 'Run ID of the build workflow'
|
|
85
|
+
required: true
|
|
86
|
+
type: string
|
|
87
|
+
|
|
88
|
+
permissions:
|
|
89
|
+
actions: read
|
|
90
|
+
contents: read
|
|
91
|
+
|
|
92
|
+
jobs:
|
|
93
|
+
deploy:
|
|
94
|
+
runs-on: ubuntu-latest
|
|
95
|
+
steps:
|
|
96
|
+
- uses: actions/download-artifact@v4
|
|
97
|
+
with:
|
|
98
|
+
name: dist
|
|
99
|
+
run-id: ${{ inputs.build_run_id }}
|
|
100
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
101
|
+
prevention:
|
|
102
|
+
- "Whenever `run-id` is added to a download-artifact@v4 step, immediately add `actions: read` to the job permissions block"
|
|
103
|
+
- "Do not rely on default token permissions for cross-workflow operations — always declare explicit permission blocks"
|
|
104
|
+
- "Test cross-workflow downloads in a feature branch before merging — the permission error is deterministic, not flaky"
|
|
105
|
+
- "Add `github-token: ${{ secrets.GITHUB_TOKEN }}` explicitly to download-artifact@v4 steps that use run-id, as it clarifies the token in use"
|
|
106
|
+
docs:
|
|
107
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-workflow-data-as-artifacts#downloading-artifacts-from-a-previous-workflow-run"
|
|
108
|
+
label: "GitHub Docs — Downloading artifacts from a previous workflow run"
|
|
109
|
+
- url: "https://github.com/actions/download-artifact/releases/tag/v4.0.0"
|
|
110
|
+
label: "actions/download-artifact v4.0.0 release notes — cross-workflow download"
|
|
111
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token#defining-access-for-the-github_token-scopes"
|
|
112
|
+
label: "GitHub Docs — GITHUB_TOKEN permission scopes"
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
id: permissions-auth-042
|
|
2
|
+
title: "actions/attest-build-provenance requires both id-token: write AND attestations: write — missing attestations permission causes 403"
|
|
3
|
+
category: permissions-auth
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- attestations
|
|
7
|
+
- attest-build-provenance
|
|
8
|
+
- id-token
|
|
9
|
+
- permissions
|
|
10
|
+
- supply-chain
|
|
11
|
+
- sigstore
|
|
12
|
+
- 403
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'attestations.*write.*required|write.*attestations.*required'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Resource not accessible by integration.*attest'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'Error: Failed to create attestation'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'permissions.*attestations.*write'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "Error: Failed to create attestation: Resource not accessible by integration"
|
|
24
|
+
- "Error: Failed to create attestation: 403 Forbidden"
|
|
25
|
+
- "RequestError [HttpError]: Resource not accessible by integration"
|
|
26
|
+
- "Error: Attestation creation failed: must have `attestations: write` permission"
|
|
27
|
+
root_cause: |
|
|
28
|
+
GitHub's artifact attestation feature (GA May 2024, https://github.blog/changelog/2024-05-02-github-artifact-attestations-is-generally-available/)
|
|
29
|
+
allows workflows to generate Sigstore-compatible provenance attestations for build
|
|
30
|
+
artifacts using `actions/attest-build-provenance` or `actions/attest`.
|
|
31
|
+
|
|
32
|
+
These actions require TWO permissions on the GITHUB_TOKEN:
|
|
33
|
+
1. `id-token: write` — to fetch an OIDC token from GitHub's identity provider
|
|
34
|
+
(used to sign the attestation with Sigstore)
|
|
35
|
+
2. `attestations: write` — to store the attestation in GitHub's attestation store
|
|
36
|
+
(new permission introduced with the attestation feature)
|
|
37
|
+
|
|
38
|
+
Most early documentation examples, blog posts, and quickstarts only show
|
|
39
|
+
`id-token: write`, omitting `attestations: write`. Developers following these
|
|
40
|
+
examples get a cryptic 403 "Resource not accessible by integration" error when
|
|
41
|
+
the attest step runs, with no clear indication that a second permission is missing.
|
|
42
|
+
|
|
43
|
+
The error is consistent and not environment-specific — it will fail on every run
|
|
44
|
+
until the `attestations: write` permission is added.
|
|
45
|
+
|
|
46
|
+
Additionally, organization-level policies may restrict the use of attestations.
|
|
47
|
+
If the organization has disabled artifact attestations, the 403 will occur even
|
|
48
|
+
with both permissions present — the error message does not distinguish between
|
|
49
|
+
"missing permission" and "feature disabled by org policy".
|
|
50
|
+
fix: |
|
|
51
|
+
Add BOTH `id-token: write` AND `attestations: write` to the permissions block
|
|
52
|
+
of the job that runs the attest-build-provenance action.
|
|
53
|
+
|
|
54
|
+
If your workflow or job already declares a `permissions` block, add both entries
|
|
55
|
+
to it. If your workflow has no permissions block, add one with both required
|
|
56
|
+
permissions plus any other permissions your workflow needs (e.g., `contents: read`
|
|
57
|
+
for checkout).
|
|
58
|
+
|
|
59
|
+
Note: `attestations: write` is only available on github.com. GitHub Enterprise
|
|
60
|
+
Server (GHES) requires GHES 3.12+ for attestation support.
|
|
61
|
+
fix_code:
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: "Correct permissions for actions/attest-build-provenance"
|
|
64
|
+
code: |
|
|
65
|
+
jobs:
|
|
66
|
+
build-and-attest:
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
permissions:
|
|
69
|
+
id-token: write # Required: OIDC token for Sigstore signing
|
|
70
|
+
attestations: write # Required: write attestation to GitHub store
|
|
71
|
+
contents: read # Required: checkout
|
|
72
|
+
|
|
73
|
+
steps:
|
|
74
|
+
- uses: actions/checkout@v4
|
|
75
|
+
|
|
76
|
+
- name: Build artifact
|
|
77
|
+
run: |
|
|
78
|
+
npm ci
|
|
79
|
+
npm run build
|
|
80
|
+
tar -czf dist.tar.gz dist/
|
|
81
|
+
|
|
82
|
+
- name: Generate build provenance attestation
|
|
83
|
+
uses: actions/attest-build-provenance@v2
|
|
84
|
+
with:
|
|
85
|
+
subject-path: dist.tar.gz
|
|
86
|
+
- language: yaml
|
|
87
|
+
label: "Attest multiple subjects (container image + artifact)"
|
|
88
|
+
code: |
|
|
89
|
+
jobs:
|
|
90
|
+
release:
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
permissions:
|
|
93
|
+
id-token: write
|
|
94
|
+
attestations: write
|
|
95
|
+
contents: read
|
|
96
|
+
packages: write # If pushing to GHCR
|
|
97
|
+
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: Attest binary
|
|
102
|
+
uses: actions/attest-build-provenance@v2
|
|
103
|
+
with:
|
|
104
|
+
subject-path: bin/myapp
|
|
105
|
+
|
|
106
|
+
- name: Attest container image
|
|
107
|
+
uses: actions/attest-build-provenance@v2
|
|
108
|
+
with:
|
|
109
|
+
subject-name: ghcr.io/${{ github.repository }}/myapp
|
|
110
|
+
subject-digest: ${{ steps.push.outputs.digest }}
|
|
111
|
+
push-to-registry: true
|
|
112
|
+
prevention:
|
|
113
|
+
- "Always include BOTH `id-token: write` and `attestations: write` in the permissions block — neither alone is sufficient"
|
|
114
|
+
- "Copy the permissions block from the official actions/attest-build-provenance README examples, not from third-party blog posts"
|
|
115
|
+
- "Use `gh attestation verify <artifact>` locally to test that attestations were created successfully after the workflow runs"
|
|
116
|
+
- "For GHES deployments, verify the GHES version is 3.12+ before adding attestation steps to workflows"
|
|
117
|
+
docs:
|
|
118
|
+
- url: "https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations/using-artifact-attestations-to-establish-provenance-for-builds"
|
|
119
|
+
label: "GitHub Docs — Using artifact attestations to establish provenance"
|
|
120
|
+
- url: "https://github.blog/changelog/2024-05-02-github-artifact-attestations-is-generally-available/"
|
|
121
|
+
label: "GitHub Changelog — Artifact attestations GA (May 2024)"
|
|
122
|
+
- url: "https://github.com/actions/attest-build-provenance"
|
|
123
|
+
label: "actions/attest-build-provenance — README and required permissions"
|
|
124
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token"
|
|
125
|
+
label: "GitHub Docs — GITHUB_TOKEN permission scopes (attestations: write)"
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
id: runner-environment-118
|
|
2
|
+
title: "Node.js 20 actions deprecated — forced to Node.js 24 runtime starting June 16, 2026"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: warning
|
|
5
|
+
tags:
|
|
6
|
+
- node-20
|
|
7
|
+
- node-24
|
|
8
|
+
- deprecation
|
|
9
|
+
- actions-runtime
|
|
10
|
+
- checkout
|
|
11
|
+
- setup-node
|
|
12
|
+
- self-hosted-runner
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Node\.js 20 actions are deprecated'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'forced to run with Node\.js 24 by default'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'using:\s*node20'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "Node.js 20 actions are deprecated. Actions will be forced to run with Node.js 24 by default starting June 16th, 2026."
|
|
24
|
+
- "Node.js 20 will be removed from the runner on September 16th, 2026."
|
|
25
|
+
- "Please check if updated versions of these actions are available that support Node.js 24."
|
|
26
|
+
root_cause: |
|
|
27
|
+
GitHub deprecated Node.js 20 as the runtime for GitHub Actions in September 2025
|
|
28
|
+
(https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/).
|
|
29
|
+
Starting June 16, 2026, actions that declare `using: node20` are force-upgraded to
|
|
30
|
+
Node.js 24 on hosted runners. Node.js 20 will be fully removed from hosted runners
|
|
31
|
+
on September 16, 2026.
|
|
32
|
+
|
|
33
|
+
This affects two distinct scenarios:
|
|
34
|
+
|
|
35
|
+
1. First-party GitHub-maintained actions (actions/checkout@v4, actions/setup-node@v4,
|
|
36
|
+
actions/upload-artifact@v4, etc.) — GitHub is updating these actions to ship Node.js 24
|
|
37
|
+
variants. Pinning to older major versions (e.g., @v4 without updating) will trigger
|
|
38
|
+
the deprecation warning until updated versions are pinned.
|
|
39
|
+
|
|
40
|
+
2. Community and custom actions that declare `using: node20` in their action.yml —
|
|
41
|
+
these will be silently force-upgraded to Node.js 24, which may break actions that
|
|
42
|
+
rely on Node.js 20 APIs, native modules compiled for Node 20, or behavior differences
|
|
43
|
+
between Node 20 and Node 24 (e.g., stricter URL parsing, OpenSSL changes).
|
|
44
|
+
|
|
45
|
+
3. Self-hosted runners with Node.js 18/20 installed — if the runner does not have
|
|
46
|
+
Node.js 24 available and FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 is set to true, the
|
|
47
|
+
action will fail to find a suitable runtime.
|
|
48
|
+
|
|
49
|
+
The deprecation warning appears as an annotation on every workflow run that uses an
|
|
50
|
+
affected action. While currently advisory, it becomes a hard failure on September 16, 2026.
|
|
51
|
+
fix: |
|
|
52
|
+
Update all first-party GitHub actions to their latest versions that ship Node.js 24
|
|
53
|
+
support. For actions/checkout, setup-node, upload-artifact, download-artifact, and
|
|
54
|
+
other official actions, check the latest release tag.
|
|
55
|
+
|
|
56
|
+
For self-hosted runners, install Node.js 24 on the runner host before June 16, 2026.
|
|
57
|
+
|
|
58
|
+
For custom or community actions you maintain, update action.yml to declare
|
|
59
|
+
`using: node24` and update package.json to target Node.js 24.
|
|
60
|
+
|
|
61
|
+
To opt in early and test Node.js 24 behavior before the forced cutover, set the
|
|
62
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 environment variable to `true` in your workflow
|
|
63
|
+
or at the runner level.
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: "Update first-party actions to Node.js 24 compatible versions"
|
|
67
|
+
code: |
|
|
68
|
+
jobs:
|
|
69
|
+
build:
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
steps:
|
|
72
|
+
# Update to latest versions that support Node.js 24
|
|
73
|
+
- uses: actions/checkout@v4.2.2 # or latest v5 when available
|
|
74
|
+
- uses: actions/setup-node@v4.1.0 # or latest
|
|
75
|
+
- uses: actions/upload-artifact@v4.4.0 # or latest
|
|
76
|
+
- uses: actions/download-artifact@v4.2.0
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Opt in early to Node.js 24 for testing"
|
|
79
|
+
code: |
|
|
80
|
+
env:
|
|
81
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: 'true'
|
|
82
|
+
|
|
83
|
+
jobs:
|
|
84
|
+
build:
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
- name: Run build
|
|
89
|
+
run: npm ci && npm run build
|
|
90
|
+
prevention:
|
|
91
|
+
- "Pin actions to specific minor versions (e.g., @v4.2.2) and use Dependabot or Renovate to auto-update them"
|
|
92
|
+
- "Add FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true to workflow env to test Node.js 24 compatibility before the forced cutover"
|
|
93
|
+
- "For self-hosted runners, ensure Node.js 24 is installed and available on PATH before June 16, 2026"
|
|
94
|
+
- "Audit custom actions in your organization for `using: node20` declarations and update them to `using: node24`"
|
|
95
|
+
- "Subscribe to the GitHub Changelog (https://github.blog/changelog/) to catch runtime deprecations early"
|
|
96
|
+
docs:
|
|
97
|
+
- url: "https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/"
|
|
98
|
+
label: "GitHub Changelog — Deprecation of Node.js 20 on GitHub Actions runners (Sept 2025)"
|
|
99
|
+
- url: "https://docs.github.com/en/actions/sharing-automations/creating-actions/metadata-syntax-for-github-actions#runsusing"
|
|
100
|
+
label: "GitHub Docs — Action metadata syntax: runs.using"
|
|
101
|
+
- url: "https://nodejs.org/en/about/previous-releases"
|
|
102
|
+
label: "Node.js release schedule — LTS lifecycle"
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
id: runner-environment-119
|
|
2
|
+
title: "ubuntu-24.04 GCC 13 treats implicit function declarations as hard errors in C"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24
|
|
7
|
+
- gcc-13
|
|
8
|
+
- c-compilation
|
|
9
|
+
- implicit-declaration
|
|
10
|
+
- breaking-change
|
|
11
|
+
- ubuntu-latest
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'error: implicit declaration of function'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: '\[-Wimplicit-function-declaration\]'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'implicit declaration of function .* is invalid in C99'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'cc1: some warnings being treated as errors'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- "error: implicit declaration of function 'foo' [-Wimplicit-function-declaration]"
|
|
23
|
+
- "implicit declaration of function 'getline' is invalid in C99 [-Wimplicit-function-declaration]"
|
|
24
|
+
- "cc1: some warnings being treated as errors"
|
|
25
|
+
- "error: 'strdup' undeclared (first use in this function)"
|
|
26
|
+
root_cause: |
|
|
27
|
+
ubuntu-24.04 runners ship with GCC 13.2.0, replacing GCC 11.4.0 on ubuntu-22.04.
|
|
28
|
+
GCC 13 promotes several previously-warning-level diagnostics to hard errors in C
|
|
29
|
+
compilation. The most commonly triggered change is -Wimplicit-function-declaration:
|
|
30
|
+
calling a function without a prior declaration or prototype is now an error, not
|
|
31
|
+
a warning. This matches the requirement in the C99, C11, and C23 standards, but
|
|
32
|
+
was only enforced as a warning in earlier GCC versions.
|
|
33
|
+
|
|
34
|
+
Workflows that compiled successfully on ubuntu-22.04 (GCC 11) now fail on
|
|
35
|
+
ubuntu-24.04 (GCC 13) with "error: implicit declaration of function" even when
|
|
36
|
+
the source code has not changed. Common triggers:
|
|
37
|
+
- Missing #include directives for standard library functions (getline, strtok_r,
|
|
38
|
+
strdup, getaddrinfo, etc.)
|
|
39
|
+
- Using POSIX-only functions without _GNU_SOURCE or _POSIX_C_SOURCE feature macros
|
|
40
|
+
- Legacy C code or vendored dependencies not maintained for C99 compliance
|
|
41
|
+
|
|
42
|
+
Additional GCC 13 diagnostics upgraded from warnings to errors:
|
|
43
|
+
- -Wint-conversion: assigning int where pointer is expected (and vice versa)
|
|
44
|
+
- -Wincompatible-pointer-types: passing incompatible pointer type to a function
|
|
45
|
+
|
|
46
|
+
The ubuntu-latest label resolves to ubuntu-24.04 as of 2025. Workflows that
|
|
47
|
+
previously used ubuntu-latest and relied on GCC 11 behavior are now affected
|
|
48
|
+
even without changing their runner label.
|
|
49
|
+
fix: |
|
|
50
|
+
Preferred fix: correct the source code by adding missing #include directives
|
|
51
|
+
or explicit function prototypes. This is the standards-compliant approach and
|
|
52
|
+
permanently resolves the issue.
|
|
53
|
+
|
|
54
|
+
Temporary suppression: add -Wno-implicit-function-declaration (and optionally
|
|
55
|
+
-Wno-int-conversion, -Wno-incompatible-pointer-types) to CFLAGS in the build
|
|
56
|
+
step. This restores GCC 11 behavior for vendored or unmaintained C code but
|
|
57
|
+
should be treated as a short-term workaround only.
|
|
58
|
+
|
|
59
|
+
Short-term runner pin: use runs-on: ubuntu-22.04 while fixing the source.
|
|
60
|
+
ubuntu-22.04 will eventually be retired from GitHub-hosted runners.
|
|
61
|
+
fix_code:
|
|
62
|
+
- language: yaml
|
|
63
|
+
label: "Add suppression flags to CFLAGS for legacy C code"
|
|
64
|
+
code: |
|
|
65
|
+
jobs:
|
|
66
|
+
build:
|
|
67
|
+
runs-on: ubuntu-24.04
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v4
|
|
70
|
+
|
|
71
|
+
- name: Build with legacy C compatibility flags
|
|
72
|
+
run: |
|
|
73
|
+
make CFLAGS="-O2 -Wno-implicit-function-declaration \
|
|
74
|
+
-Wno-int-conversion \
|
|
75
|
+
-Wno-incompatible-pointer-types"
|
|
76
|
+
- language: yaml
|
|
77
|
+
label: "Pin to ubuntu-22.04 temporarily while fixing source"
|
|
78
|
+
code: |
|
|
79
|
+
jobs:
|
|
80
|
+
build:
|
|
81
|
+
# TODO: fix implicit declarations then migrate back to ubuntu-24.04
|
|
82
|
+
runs-on: ubuntu-22.04
|
|
83
|
+
steps:
|
|
84
|
+
- uses: actions/checkout@v4
|
|
85
|
+
- run: make
|
|
86
|
+
prevention:
|
|
87
|
+
- "Run builds on ubuntu-24.04 in a matrix alongside ubuntu-22.04 to detect GCC 13 errors before fully migrating"
|
|
88
|
+
- "Add all required #include headers — GCC 13 enforces what the C standard has required since C99"
|
|
89
|
+
- "Use -Wno-error=implicit-function-declaration as a transitional flag rather than disabling the warning entirely"
|
|
90
|
+
- "Audit vendored C libraries for GCC 13 compatibility before upgrading runner images"
|
|
91
|
+
- "Enable -Wall in CI early to surface implicit declaration warnings before they become hard errors"
|
|
92
|
+
docs:
|
|
93
|
+
- url: "https://gcc.gnu.org/gcc-13/porting_to.html"
|
|
94
|
+
label: "GCC 13 porting guide — new errors and behavioral changes"
|
|
95
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
|
|
96
|
+
label: "ubuntu-24.04 runner image — installed software (GCC 13.2.0)"
|
|
97
|
+
- url: "https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html"
|
|
98
|
+
label: "GCC warning options — -Wimplicit-function-declaration"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: runner-environment-120
|
|
2
|
+
title: "snap install fails on GitHub-hosted runners — snapd daemon not available"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- snap
|
|
7
|
+
- snapd
|
|
8
|
+
- ubuntu
|
|
9
|
+
- package-manager
|
|
10
|
+
- runner-limitation
|
|
11
|
+
- apt-alternative
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'snap.*command not found|command not found.*snap'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'cannot communicate with server.*snapd\.sock'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'dial unix /run/snapd\.sock.*no such file or directory'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'error: cannot connect to the snap daemon'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- "sudo: snap: command not found"
|
|
23
|
+
- "error: cannot communicate with server: Post \"http://localhost/v2/snaps/...\": dial unix /run/snapd.sock: connect: no such file or directory"
|
|
24
|
+
- "error: cannot connect to the snap daemon"
|
|
25
|
+
- "/bin/sh: 1: snap: not found"
|
|
26
|
+
root_cause: |
|
|
27
|
+
GitHub-hosted runner images (ubuntu-22.04, ubuntu-24.04, and ubuntu-latest) do
|
|
28
|
+
not include the snapd daemon and do not support the snap package manager.
|
|
29
|
+
|
|
30
|
+
Snapd requires a persistent background daemon (snapd.service) and specific kernel
|
|
31
|
+
configuration for confinement (AppArmor profiles, seccomp filters) that is not
|
|
32
|
+
available or not configured in the ephemeral VM environment GitHub uses for
|
|
33
|
+
hosted runners. Even if the snap binary were present, the daemon is not running,
|
|
34
|
+
causing all snap commands to fail at the IPC socket connection step.
|
|
35
|
+
|
|
36
|
+
This limitation surprises developers who routinely use snap packages on local
|
|
37
|
+
Ubuntu workstations and attempt to replicate those install commands in CI.
|
|
38
|
+
Common affected workflows:
|
|
39
|
+
- Installing tools distributed primarily or exclusively via snap (certain IoT,
|
|
40
|
+
embedded, or cross-compile toolchains; some cloud CLI tools)
|
|
41
|
+
- Reproducing local Ubuntu developer setup scripts in CI verbatim
|
|
42
|
+
- CI pipelines for snap packages themselves (snap build requires LXD or snapcraft)
|
|
43
|
+
|
|
44
|
+
The error "cannot communicate with server: dial unix /run/snapd.sock: no such
|
|
45
|
+
file or directory" is deterministic — it fails on every run, not intermittently.
|
|
46
|
+
fix: |
|
|
47
|
+
Replace snap install commands with an equivalent alternative:
|
|
48
|
+
|
|
49
|
+
1. APT: Most tools available as snaps also have apt packages. Check
|
|
50
|
+
packages.ubuntu.com for the apt equivalent (the version may be older).
|
|
51
|
+
|
|
52
|
+
2. Direct binary / official releases: Many developer tools (kubectl, helm,
|
|
53
|
+
terraform, go, etc.) publish standalone binaries on GitHub Releases or
|
|
54
|
+
their official download pages.
|
|
55
|
+
|
|
56
|
+
3. Official setup-* actions: GitHub and tool vendors maintain actions/setup-go,
|
|
57
|
+
azure/setup-kubectl, hashicorp/setup-terraform, etc. that install tools
|
|
58
|
+
cleanly without snap.
|
|
59
|
+
|
|
60
|
+
4. Docker: Run the snap-packaged tool inside a Docker container if no other
|
|
61
|
+
distribution method exists (the snap itself cannot run inside Docker, but
|
|
62
|
+
the underlying tool usually has a Docker image).
|
|
63
|
+
|
|
64
|
+
For snap package development and testing (e.g., snapcraft builds), use a
|
|
65
|
+
self-hosted runner with LXD configured, or the snapcore/action-build action
|
|
66
|
+
which handles the LXD setup automatically.
|
|
67
|
+
fix_code:
|
|
68
|
+
- language: yaml
|
|
69
|
+
label: "Replace snap install with apt or official action"
|
|
70
|
+
code: |
|
|
71
|
+
jobs:
|
|
72
|
+
deploy:
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
steps:
|
|
75
|
+
- uses: actions/checkout@v4
|
|
76
|
+
|
|
77
|
+
# Instead of: sudo snap install kubectl --classic
|
|
78
|
+
- name: Set up kubectl (official action)
|
|
79
|
+
uses: azure/setup-kubectl@v4
|
|
80
|
+
with:
|
|
81
|
+
version: 'v1.30.0'
|
|
82
|
+
|
|
83
|
+
# Instead of: sudo snap install terraform
|
|
84
|
+
- name: Set up Terraform (official action)
|
|
85
|
+
uses: hashicorp/setup-terraform@v3
|
|
86
|
+
with:
|
|
87
|
+
terraform_version: "1.9.0"
|
|
88
|
+
|
|
89
|
+
- run: kubectl version --client
|
|
90
|
+
- language: yaml
|
|
91
|
+
label: "Build snap packages with snapcore/action-build (handles LXD)"
|
|
92
|
+
code: |
|
|
93
|
+
jobs:
|
|
94
|
+
snapcraft:
|
|
95
|
+
runs-on: ubuntu-latest
|
|
96
|
+
steps:
|
|
97
|
+
- uses: actions/checkout@v4
|
|
98
|
+
|
|
99
|
+
- name: Build snap
|
|
100
|
+
uses: snapcore/action-build@v1
|
|
101
|
+
|
|
102
|
+
- name: Upload snap artifact
|
|
103
|
+
uses: actions/upload-artifact@v4
|
|
104
|
+
with:
|
|
105
|
+
name: my-snap
|
|
106
|
+
path: '*.snap'
|
|
107
|
+
prevention:
|
|
108
|
+
- "Check the GitHub Actions Marketplace for an official setup-* action before reaching for snap"
|
|
109
|
+
- "Use direct binary downloads from tool vendors' GitHub Releases when no setup-* action exists"
|
|
110
|
+
- "Avoid copying local Ubuntu setup scripts verbatim into CI — apt/brew/direct-download are the CI-safe equivalents"
|
|
111
|
+
- "Self-hosted runners on Ubuntu can have snapd installed if snap packages are genuinely required"
|
|
112
|
+
docs:
|
|
113
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#preinstalled-software"
|
|
114
|
+
label: "GitHub Docs — Pre-installed software on GitHub-hosted runners"
|
|
115
|
+
- url: "https://github.com/snapcore/action-build"
|
|
116
|
+
label: "snapcore/action-build — official snap build action (uses LXD)"
|
|
117
|
+
- url: "https://snapcraft.io/docs/build-on-github"
|
|
118
|
+
label: "Snapcraft Docs — Building snaps on GitHub Actions"
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
id: runner-environment-121
|
|
2
|
+
title: "macOS-15 and macOS-26 Apple system Ruby (/usr/bin/ruby 2.6) removed — bare ruby and gem commands fail"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- macos-15
|
|
7
|
+
- macos-26
|
|
8
|
+
- ruby
|
|
9
|
+
- system-ruby
|
|
10
|
+
- gem
|
|
11
|
+
- cocoapods
|
|
12
|
+
- breaking-change
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: '/usr/bin/ruby.*[Nn]o such file|[Nn]o such file.*/usr/bin/ruby'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'ruby: No such file or directory'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'rbenv: version .* is not installed'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'Your Ruby version is .*, but your Gemfile specified'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "/usr/bin/ruby: No such file or directory"
|
|
24
|
+
- "bash: /usr/bin/ruby: No such file or directory"
|
|
25
|
+
- "rbenv: version '2.6.10' is not installed"
|
|
26
|
+
- "Your Ruby version is 3.3.4, but your Gemfile specified ~> 2.6"
|
|
27
|
+
- "[!] CocoaPods requires your terminal to be using UTF-8 encoding. Consider adding the following to ~/.profile: export LANG=en_US.UTF-8"
|
|
28
|
+
root_cause: |
|
|
29
|
+
Apple removed the system Ruby installation (/usr/bin/ruby, version 2.6.10) from
|
|
30
|
+
macOS 15 Sequoia. This Ruby shipped as part of macOS since macOS 10.5 and was
|
|
31
|
+
installed at /usr/bin/ruby via Xcode Command Line Tools. It was used as the
|
|
32
|
+
runtime for Bundler, CocoaPods, Fastlane, and other Ruby-based iOS/macOS build
|
|
33
|
+
tools that shipped their own invocation scripts pointing to /usr/bin/ruby.
|
|
34
|
+
|
|
35
|
+
GitHub-hosted macOS-15 and macOS-26 runner images reflect this Apple change.
|
|
36
|
+
macOS-14 runners still include /usr/bin/ruby 2.6.10. GitHub pre-installs Ruby 3.3
|
|
37
|
+
via rbenv on macOS-15 and macOS-26, but:
|
|
38
|
+
|
|
39
|
+
1. Scripts or Makefiles that explicitly reference /usr/bin/ruby fail immediately
|
|
40
|
+
with "No such file or directory"
|
|
41
|
+
2. Gemfiles pinned to ruby "~> 2.6" fail — pre-installed Ruby is 3.3.x
|
|
42
|
+
3. CocoaPods legacy install scripts (including some older Fastfiles) called
|
|
43
|
+
/usr/bin/ruby directly; those fail on macOS-15 runners
|
|
44
|
+
4. rbenv configurations referencing the Apple system Ruby slot (2.6.10) fail
|
|
45
|
+
with "rbenv: version '2.6.10' is not installed"
|
|
46
|
+
5. brew install ruby may install a different version than expected, and its
|
|
47
|
+
PATH precedence may conflict with rbenv-managed Ruby
|
|
48
|
+
|
|
49
|
+
The macOS-latest label resolves to macOS-15 and eventually macOS-26 as Apple
|
|
50
|
+
releases new macOS versions. Workflows using macOS-latest are affected even
|
|
51
|
+
without changing their runner specification.
|
|
52
|
+
fix: |
|
|
53
|
+
Use the ruby/setup-ruby action to install and pin a specific Ruby version.
|
|
54
|
+
This is the recommended approach for all macOS GitHub Actions workflows and
|
|
55
|
+
works correctly on macOS-14, macOS-15, and macOS-26.
|
|
56
|
+
|
|
57
|
+
For CocoaPods: add a Gemfile with the cocoapods gem and use Bundler
|
|
58
|
+
(bundle exec pod install) instead of calling pod directly. This also gives
|
|
59
|
+
reproducible CocoaPods version pinning across all environments.
|
|
60
|
+
|
|
61
|
+
Search the repository for any hardcoded /usr/bin/ruby references before
|
|
62
|
+
migrating to macOS-15 runners.
|
|
63
|
+
fix_code:
|
|
64
|
+
- language: yaml
|
|
65
|
+
label: "Use ruby/setup-ruby to install and pin Ruby (recommended)"
|
|
66
|
+
code: |
|
|
67
|
+
jobs:
|
|
68
|
+
build:
|
|
69
|
+
runs-on: macos-15
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
|
|
73
|
+
- name: Set up Ruby
|
|
74
|
+
uses: ruby/setup-ruby@v1
|
|
75
|
+
with:
|
|
76
|
+
ruby-version: '3.3'
|
|
77
|
+
bundler-cache: true # runs bundle install automatically
|
|
78
|
+
|
|
79
|
+
- name: Run tests
|
|
80
|
+
run: bundle exec rspec
|
|
81
|
+
- language: yaml
|
|
82
|
+
label: "CocoaPods via Bundler — replace direct pod invocation"
|
|
83
|
+
code: |
|
|
84
|
+
jobs:
|
|
85
|
+
ios-build:
|
|
86
|
+
runs-on: macos-15
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/checkout@v4
|
|
89
|
+
|
|
90
|
+
- uses: ruby/setup-ruby@v1
|
|
91
|
+
with:
|
|
92
|
+
ruby-version: '3.3'
|
|
93
|
+
bundler-cache: true
|
|
94
|
+
|
|
95
|
+
# Gemfile must include: gem 'cocoapods', '~> 1.15'
|
|
96
|
+
- name: Install pods via Bundler
|
|
97
|
+
run: bundle exec pod install
|
|
98
|
+
working-directory: ios/
|
|
99
|
+
prevention:
|
|
100
|
+
- "Never hardcode /usr/bin/ruby — always invoke ruby via PATH after ruby/setup-ruby"
|
|
101
|
+
- "Add ruby/setup-ruby with an explicit ruby-version to every macOS workflow that uses Ruby, Bundler, or CocoaPods"
|
|
102
|
+
- "Pin CocoaPods in a Gemfile and use bundle exec pod install — not the global pod command"
|
|
103
|
+
- "Search CI scripts and Fastfiles for /usr/bin/ruby before migrating to macOS-15 or macOS-26 runners"
|
|
104
|
+
- "Use the macos-15 label explicitly in CI for testing before it becomes the macos-latest default"
|
|
105
|
+
docs:
|
|
106
|
+
- url: "https://github.com/ruby/setup-ruby"
|
|
107
|
+
label: "ruby/setup-ruby action — official Ruby installer for GitHub Actions"
|
|
108
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md"
|
|
109
|
+
label: "GitHub Actions macOS-15 runner image — installed software"
|
|
110
|
+
- url: "https://guides.cocoapods.org/using/a-gemfile.html"
|
|
111
|
+
label: "CocoaPods — using a Gemfile (Bundler-based installation)"
|
|
112
|
+
- url: "https://www.ruby-lang.org/en/documentation/installation/"
|
|
113
|
+
label: "Ruby installation options — setup-ruby vs system Ruby"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
id: runner-environment-122
|
|
2
|
+
title: "ubuntu-24.04 cgroup v2 only — Docker containers and JVMs built for cgroup v1 fail"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-24
|
|
7
|
+
- cgroup-v2
|
|
8
|
+
- docker
|
|
9
|
+
- systemd-in-container
|
|
10
|
+
- java
|
|
11
|
+
- kubernetes
|
|
12
|
+
- breaking-change
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'cgroup.*v1.*not supported|v1.*cgroup.*not available'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'failed to create.*cgroup|cgroup.*permission denied'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'write.*cgroup.*read-only file system|cgroup.*read.only'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'OCI runtime create failed.*cgroup'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
error_messages:
|
|
23
|
+
- "OCI runtime create failed: cgroup v1 not supported on this system"
|
|
24
|
+
- "Error response from daemon: failed to create shim task: cgroup v1 is not available"
|
|
25
|
+
- "failed to create cgroup: write /sys/fs/cgroup/memory/docker/...: read-only file system"
|
|
26
|
+
- "cannot enter cgroupv2 namespace: invalid argument"
|
|
27
|
+
root_cause: |
|
|
28
|
+
ubuntu-24.04 GitHub-hosted runners use Linux kernel 6.5+ with cgroup v2 (the
|
|
29
|
+
unified hierarchy) exclusively. cgroup v1 subsystems are not mounted and not
|
|
30
|
+
available. ubuntu-22.04 runners supported both cgroup v1 and v2 simultaneously
|
|
31
|
+
(the hybrid mode enabled in the 5.x kernel era), so containers built for v1
|
|
32
|
+
worked without modification.
|
|
33
|
+
|
|
34
|
+
This affects four main workflow categories:
|
|
35
|
+
|
|
36
|
+
1. systemd-in-container testing: Docker images using systemd as PID 1 (Ansible
|
|
37
|
+
role tests, Molecule, infrastructure integration tests) require cgroup v2
|
|
38
|
+
support in the container's systemd version. Images based on older base images
|
|
39
|
+
(Ubuntu 18.04, CentOS 7/8, RHEL 7) with systemd < 248 fail to start because
|
|
40
|
+
their systemd was compiled for the cgroup v1 hierarchy.
|
|
41
|
+
|
|
42
|
+
2. Old JVM containers: JVM releases before JDK 11u16, JDK 17u4, and JDK 19+
|
|
43
|
+
do not correctly detect container memory and CPU limits under cgroup v2.
|
|
44
|
+
These JVMs either crash with OutOfMemoryError (using the host memory limit
|
|
45
|
+
instead of the container limit) or report the wrong available processor count.
|
|
46
|
+
|
|
47
|
+
3. Kubernetes-in-Docker (kind, k3d): older versions of kind (pre-v0.17) and k3d
|
|
48
|
+
fail to initialize cluster nodes due to cgroup v2 incompatibility in the
|
|
49
|
+
bundled containerd or runc version.
|
|
50
|
+
|
|
51
|
+
4. eBPF and networking tools: eBPF programs that attach to cgroup v1 BPF program
|
|
52
|
+
type (BPF_PROG_TYPE_CGROUP_SOCK, etc.) using the v1 subsystem hierarchy fail
|
|
53
|
+
because the v1 cgroup paths (/sys/fs/cgroup/memory/, /sys/fs/cgroup/cpu/)
|
|
54
|
+
are not present.
|
|
55
|
+
|
|
56
|
+
The ubuntu-latest label resolved to ubuntu-24.04 in 2025. Workflows that relied
|
|
57
|
+
on ubuntu-latest and had cgroup v1 dependent containers are now affected.
|
|
58
|
+
fix: |
|
|
59
|
+
1. Update base images to cgroup v2 compatible versions:
|
|
60
|
+
- systemd: use Ubuntu 22.04+ or Debian Bookworm base images (systemd 249+)
|
|
61
|
+
- Java: update to JDK 11.0.16+, JDK 17.0.4+, or JDK 19+ (full cgroup v2 support)
|
|
62
|
+
- kind: use v0.17.0+ which ships containerd 1.7+ with cgroup v2 support
|
|
63
|
+
- k3d: use v5.6.0+
|
|
64
|
+
|
|
65
|
+
2. For systemd containers: mount /sys/fs/cgroup with rw access and use
|
|
66
|
+
--cgroupns=host if the container requires the host cgroup namespace
|
|
67
|
+
|
|
68
|
+
3. Pin to ubuntu-22.04 as a short-term workaround while updating container images.
|
|
69
|
+
ubuntu-22.04 will eventually be retired from GitHub-hosted runners.
|
|
70
|
+
fix_code:
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: "Run systemd containers with cgroup v2 compatible mounts"
|
|
73
|
+
code: |
|
|
74
|
+
jobs:
|
|
75
|
+
ansible-test:
|
|
76
|
+
runs-on: ubuntu-24.04
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@v4
|
|
79
|
+
|
|
80
|
+
- name: Start systemd container (cgroup v2 compatible)
|
|
81
|
+
run: |
|
|
82
|
+
docker run -d \
|
|
83
|
+
--name test-node \
|
|
84
|
+
--cgroupns=host \
|
|
85
|
+
--tmpfs /tmp \
|
|
86
|
+
--tmpfs /run \
|
|
87
|
+
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
|
88
|
+
ubuntu:22.04
|
|
89
|
+
|
|
90
|
+
- name: Run Ansible role test
|
|
91
|
+
run: docker exec test-node ansible-playbook site.yml
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: "Use kind v0.17+ for Kubernetes-in-Docker on ubuntu-24.04"
|
|
94
|
+
code: |
|
|
95
|
+
jobs:
|
|
96
|
+
k8s-test:
|
|
97
|
+
runs-on: ubuntu-24.04
|
|
98
|
+
steps:
|
|
99
|
+
- uses: actions/checkout@v4
|
|
100
|
+
|
|
101
|
+
- name: Create kind cluster (v0.17+ required for cgroup v2)
|
|
102
|
+
uses: helm/kind-action@v1
|
|
103
|
+
with:
|
|
104
|
+
version: v0.23.0
|
|
105
|
+
cluster_name: test-cluster
|
|
106
|
+
|
|
107
|
+
- run: kubectl cluster-info
|
|
108
|
+
- language: yaml
|
|
109
|
+
label: "Pin to ubuntu-22.04 temporarily for cgroup v1 dependent workflows"
|
|
110
|
+
code: |
|
|
111
|
+
jobs:
|
|
112
|
+
integration-test:
|
|
113
|
+
# TODO: update container images to cgroup v2 compatible versions
|
|
114
|
+
runs-on: ubuntu-22.04
|
|
115
|
+
steps:
|
|
116
|
+
- uses: actions/checkout@v4
|
|
117
|
+
- run: docker compose up -d
|
|
118
|
+
prevention:
|
|
119
|
+
- "Test Docker container images on ubuntu-24.04 before migrating — check cgroup v2 compatibility with `docker run --rm ubuntu:24.04 ls /sys/fs/cgroup/`"
|
|
120
|
+
- "Use JDK 17.0.4+ or JDK 21+ in all containerized Java workloads for correct cgroup v2 memory/CPU detection"
|
|
121
|
+
- "Audit Dockerfiles for hardcoded cgroup v1 subsystem paths (/sys/fs/cgroup/memory/, /sys/fs/cgroup/cpu/)"
|
|
122
|
+
- "Use kind v0.17+ and k3d v5.6+ for Kubernetes-in-Docker CI on ubuntu-24.04"
|
|
123
|
+
- "Base images on Ubuntu 22.04+ or Debian Bookworm for any container running systemd as PID 1"
|
|
124
|
+
docs:
|
|
125
|
+
- url: "https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html"
|
|
126
|
+
label: "Linux kernel — cgroup v2 unified hierarchy documentation"
|
|
127
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
|
|
128
|
+
label: "ubuntu-24.04 runner image — kernel version and installed software"
|
|
129
|
+
- url: "https://kind.sigs.k8s.io/docs/user/known-issues/#pod-errors-due-to-too-many-open-files"
|
|
130
|
+
label: "kind known issues — cgroup v2 and containerd requirements"
|
|
131
|
+
- url: "https://docs.docker.com/engine/security/userns-remap/"
|
|
132
|
+
label: "Docker — cgroup v2 compatibility and container isolation"
|
|
133
|
+
- url: "https://bugs.openjdk.org/browse/JDK-8230305"
|
|
134
|
+
label: "OpenJDK — JDK-8230305: Container Metrics: Support cgroup v2 (fixed in JDK 15, backported 11u16/17u4)"
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
id: silent-failures-059
|
|
2
|
+
title: "ubuntu-latest label changed to ubuntu-24.04 — workflows silently regress without any code change"
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- ubuntu-latest
|
|
7
|
+
- ubuntu-24.04
|
|
8
|
+
- runner-label
|
|
9
|
+
- breaking-change
|
|
10
|
+
- silent-regression
|
|
11
|
+
- changelog
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'runs-on:\s*ubuntu-latest'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'GITHUB_ENV.*ubuntu-24\.04'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'ImageVersion.*24\.04'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- "ubuntu-latest now points to ubuntu-24.04"
|
|
21
|
+
- "ImageVersion: 24.04"
|
|
22
|
+
- "DISTRIB_CODENAME=noble"
|
|
23
|
+
root_cause: |
|
|
24
|
+
GitHub periodically updates the `ubuntu-latest` runner label to point to a newer
|
|
25
|
+
Ubuntu LTS release. When GitHub updated `ubuntu-latest` from ubuntu-22.04 to
|
|
26
|
+
ubuntu-24.04, workflows using `runs-on: ubuntu-latest` silently started running on
|
|
27
|
+
a different operating system with no error, no annotation, and no workflow file change.
|
|
28
|
+
|
|
29
|
+
This is a silent failure because:
|
|
30
|
+
- The workflow YAML file is unchanged
|
|
31
|
+
- GitHub Actions does not emit any warning when the label target changes
|
|
32
|
+
- Workflow run logs show "ubuntu-24.04" only in the runner image annotation, which
|
|
33
|
+
many developers don't actively monitor
|
|
34
|
+
- All jobs complete with exit code 0 even though the software environment changed
|
|
35
|
+
|
|
36
|
+
Ubuntu 24.04 (Noble) introduced multiple breaking changes relative to 22.04 (Jammy):
|
|
37
|
+
- Python 3.12 as default (removes distutils, changes pip behavior)
|
|
38
|
+
- OpenSSL 3.3 with stricter TLS renegotiation defaults
|
|
39
|
+
- nftables replaces iptables (breaks Docker networking setups using iptables rules)
|
|
40
|
+
- python3-distutils apt package removed
|
|
41
|
+
- python alias may not resolve to python3 in all contexts
|
|
42
|
+
- libssl1.1 removed (only libssl3 available)
|
|
43
|
+
- Various default package versions changed (gcc, make, cmake)
|
|
44
|
+
|
|
45
|
+
Any workflow that relied on implicit ubuntu-22.04 behavior while pinning only
|
|
46
|
+
`ubuntu-latest` is at risk of silent behavioral changes, test flakiness, or
|
|
47
|
+
hard build failures that appear unrelated to any code change.
|
|
48
|
+
fix: |
|
|
49
|
+
Pin the runner to an explicit Ubuntu version to opt out of automatic label
|
|
50
|
+
updates. Use `runs-on: ubuntu-22.04` if you need the previous behavior, or
|
|
51
|
+
explicitly migrate to `runs-on: ubuntu-24.04` and verify all workflow steps
|
|
52
|
+
work correctly.
|
|
53
|
+
|
|
54
|
+
To identify which runner version you are actually running, add a diagnostic step:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
echo "Runner: $RUNNER_OS $ImageVersion"
|
|
58
|
+
lsb_release -a
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Review each ubuntu-24.04 breaking change that applies to your workflow and
|
|
62
|
+
address them before pinning to ubuntu-24.04. See the related runner-environment
|
|
63
|
+
entries for specific package and API breakages.
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: "Pin to explicit Ubuntu version instead of ubuntu-latest"
|
|
67
|
+
code: |
|
|
68
|
+
jobs:
|
|
69
|
+
build:
|
|
70
|
+
# Pin explicitly instead of ubuntu-latest to avoid silent label updates
|
|
71
|
+
runs-on: ubuntu-22.04 # or ubuntu-24.04 after testing
|
|
72
|
+
|
|
73
|
+
# To migrate to 24.04, test explicitly first:
|
|
74
|
+
# runs-on: ubuntu-24.04
|
|
75
|
+
steps:
|
|
76
|
+
- uses: actions/checkout@v4
|
|
77
|
+
- name: Show runner info
|
|
78
|
+
run: lsb_release -a && python3 --version
|
|
79
|
+
- language: yaml
|
|
80
|
+
label: "Matrix strategy to test across Ubuntu versions before committing"
|
|
81
|
+
code: |
|
|
82
|
+
jobs:
|
|
83
|
+
test:
|
|
84
|
+
strategy:
|
|
85
|
+
matrix:
|
|
86
|
+
os: [ubuntu-22.04, ubuntu-24.04]
|
|
87
|
+
runs-on: ${{ matrix.os }}
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
- name: Run tests
|
|
91
|
+
run: npm test
|
|
92
|
+
prevention:
|
|
93
|
+
- "Never use `ubuntu-latest` in production workflows — pin to an explicit version (ubuntu-22.04, ubuntu-24.04)"
|
|
94
|
+
- "Subscribe to GitHub Changelog announcements for runner label change notices before they go live"
|
|
95
|
+
- "Add a matrix build that tests both current and next Ubuntu LTS versions as part of ongoing CI"
|
|
96
|
+
- "Include a step that prints `lsb_release -a` to make runner version visible in logs without digging into annotations"
|
|
97
|
+
- "When migrating to a new Ubuntu version, run `apt-cache policy <package>` to verify package availability before deploying"
|
|
98
|
+
docs:
|
|
99
|
+
- url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"
|
|
100
|
+
label: "GitHub Docs — Supported runners (ubuntu-latest current target)"
|
|
101
|
+
- url: "https://github.blog/changelog/2025-01-16-github-actions-all-actions-on-ubuntu-latest-will-now-be-run-on-ubuntu-24-04/"
|
|
102
|
+
label: "GitHub Changelog — ubuntu-latest updated to ubuntu-24.04"
|
|
103
|
+
- url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
|
|
104
|
+
label: "runner-images — Ubuntu 24.04 pre-installed software list"
|
package/package.json
CHANGED