@htekdev/actions-debugger 1.0.55 → 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-037.yml +124 -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-040.yml +142 -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-056.yml +105 -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-040.yml +104 -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,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"
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
id: runner-environment-116
|
|
2
|
+
title: "actions/setup-python with cache: pip fails when no standard requirements file exists in the repository"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- setup-python
|
|
7
|
+
- pip
|
|
8
|
+
- caching
|
|
9
|
+
- requirements
|
|
10
|
+
- dependency-file
|
|
11
|
+
- cache-dependency-path
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'No file found with the provided path.*requirements'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'No dependencies file path found for pip'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'Couldn''t find a dependency file for pip'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'Error: No file found with the provided path'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- "Error: No file found with the provided path: requirements.txt"
|
|
23
|
+
- "No dependencies file path found for pip"
|
|
24
|
+
- "Couldn't find a dependency file for pip"
|
|
25
|
+
- "Error: No file found with the provided path: **/requirements.txt"
|
|
26
|
+
root_cause: |
|
|
27
|
+
When `actions/setup-python` is configured with `cache: 'pip'`, it searches the
|
|
28
|
+
repository for a standard Python dependency file to use as the cache hash key.
|
|
29
|
+
The action looks for these files by default (in order):
|
|
30
|
+
|
|
31
|
+
- `requirements.txt`
|
|
32
|
+
- `requirements/*.txt`
|
|
33
|
+
- `Pipfile.lock`
|
|
34
|
+
- `poetry.lock`
|
|
35
|
+
- `pyproject.toml` (only if it contains a `[project]` or `[tool.poetry]` section)
|
|
36
|
+
- `setup.cfg` (only if it contains `[options]` with `install_requires`)
|
|
37
|
+
|
|
38
|
+
If none of these files are present, the action fails with an error during the
|
|
39
|
+
cache configuration phase. This commonly affects repositories that:
|
|
40
|
+
|
|
41
|
+
- Use a custom requirements filename (e.g., `dev-requirements.txt`, `requirements-dev.txt`)
|
|
42
|
+
- Store requirements in a non-standard path (e.g., `ci/requirements.txt`, `tests/requirements.txt`)
|
|
43
|
+
- Use only `setup.py` for dependency declaration (not recognized by default)
|
|
44
|
+
- Generate requirements dynamically at build time
|
|
45
|
+
- Are library repos with no explicit requirements file (dependencies in `pyproject.toml`
|
|
46
|
+
but without a recognized table)
|
|
47
|
+
|
|
48
|
+
The error appears either immediately at setup time or during the post-step cache save
|
|
49
|
+
phase, depending on the setup-python version.
|
|
50
|
+
fix: |
|
|
51
|
+
Provide the `cache-dependency-path` input to explicitly point to your dependency
|
|
52
|
+
file(s). This input accepts glob patterns and newline-separated paths.
|
|
53
|
+
|
|
54
|
+
If your repository has no dependency files at all (e.g., it generates them
|
|
55
|
+
dynamically), remove `cache: 'pip'` and implement pip caching manually using
|
|
56
|
+
`actions/cache@v4`, using a hash of whatever inputs determine your dependency set
|
|
57
|
+
(e.g., a Makefile, Dockerfile, or script).
|
|
58
|
+
fix_code:
|
|
59
|
+
- language: yaml
|
|
60
|
+
label: "Specify non-standard requirements file path"
|
|
61
|
+
code: |
|
|
62
|
+
- uses: actions/setup-python@v5
|
|
63
|
+
with:
|
|
64
|
+
python-version: '3.12'
|
|
65
|
+
cache: 'pip'
|
|
66
|
+
cache-dependency-path: ci/requirements.txt # Non-standard path
|
|
67
|
+
|
|
68
|
+
- language: yaml
|
|
69
|
+
label: "Multiple dependency files with glob pattern"
|
|
70
|
+
code: |
|
|
71
|
+
- uses: actions/setup-python@v5
|
|
72
|
+
with:
|
|
73
|
+
python-version: '3.12'
|
|
74
|
+
cache: 'pip'
|
|
75
|
+
cache-dependency-path: |
|
|
76
|
+
requirements.txt
|
|
77
|
+
requirements-dev.txt
|
|
78
|
+
tests/requirements.txt
|
|
79
|
+
|
|
80
|
+
- language: yaml
|
|
81
|
+
label: "Manual pip caching when no dependency file exists"
|
|
82
|
+
code: |
|
|
83
|
+
- uses: actions/setup-python@v5
|
|
84
|
+
with:
|
|
85
|
+
python-version: '3.12'
|
|
86
|
+
# Omit cache: pip — handle caching manually
|
|
87
|
+
|
|
88
|
+
- name: Cache pip packages
|
|
89
|
+
uses: actions/cache@v4
|
|
90
|
+
with:
|
|
91
|
+
path: ~/.cache/pip
|
|
92
|
+
key: pip-${{ runner.os }}-${{ hashFiles('setup.py', 'Makefile') }}
|
|
93
|
+
restore-keys: |
|
|
94
|
+
pip-${{ runner.os }}-
|
|
95
|
+
prevention:
|
|
96
|
+
- "Always set cache-dependency-path when your requirements file is not named requirements.txt or in the root directory"
|
|
97
|
+
- "Standard filenames recognized automatically: requirements.txt, Pipfile.lock, poetry.lock, pyproject.toml (with [project] table), setup.cfg (with install_requires)"
|
|
98
|
+
- "If using poetry, set cache: 'poetry' instead of cache: 'pip' — it detects poetry.lock automatically"
|
|
99
|
+
- "Consider adding a requirements.txt generated from pyproject.toml or poetry.lock to your repo for compatibility with setup-python caching"
|
|
100
|
+
docs:
|
|
101
|
+
- url: "https://github.com/actions/setup-python#caching-packages-dependencies"
|
|
102
|
+
label: "actions/setup-python — Caching packages documentation"
|
|
103
|
+
- url: "https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#caching-packages"
|
|
104
|
+
label: "actions/setup-python — Advanced caching usage"
|
|
105
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows"
|
|
106
|
+
label: "GitHub Docs — Caching dependencies to speed up workflows"
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
id: runner-environment-117
|
|
2
|
+
title: "aws-actions/configure-aws-credentials@v4 requires explicit aws-region — silent failure after version bump from v1/v2"
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- aws
|
|
7
|
+
- configure-aws-credentials
|
|
8
|
+
- aws-region
|
|
9
|
+
- oidc
|
|
10
|
+
- version-upgrade
|
|
11
|
+
- breaking-change
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'Must provide region information'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'Input required and not supplied:\s*aws-region'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'Region is not set|No region provided|aws.region.*not.*set'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- "Must provide region information"
|
|
21
|
+
- "Input required and not supplied: aws-region"
|
|
22
|
+
- "Region is not set"
|
|
23
|
+
- "No region provided"
|
|
24
|
+
root_cause: |
|
|
25
|
+
aws-actions/configure-aws-credentials@v4 (and v2+) made aws-region a required
|
|
26
|
+
input for all authentication methods. In @v1, aws-region was optional and could
|
|
27
|
+
be derived from the AWS_DEFAULT_REGION environment variable already present on
|
|
28
|
+
the runner or set in a prior step.
|
|
29
|
+
|
|
30
|
+
When Dependabot, Renovate, or a manual version bump updates configure-aws-credentials
|
|
31
|
+
from @v1 to @v4, workflows that relied on region auto-detection or inherited
|
|
32
|
+
environment variables begin failing with "Must provide region information" or
|
|
33
|
+
"Input required and not supplied: aws-region".
|
|
34
|
+
|
|
35
|
+
Additional breaking changes between v1 and v4 that affect real workflows:
|
|
36
|
+
|
|
37
|
+
1. aws-region is now required (was optional in v1 when AWS_DEFAULT_REGION was set)
|
|
38
|
+
2. mask-aws-account-id is now always true and cannot be disabled — workflows
|
|
39
|
+
logging the account ID for debugging will see '***' in all log output
|
|
40
|
+
3. OIDC token audience: v4 defaults to 'sts.amazonaws.com'; older IAM OIDC
|
|
41
|
+
trust policies configured for a different audience must be updated
|
|
42
|
+
4. Node.js runtime: updated from Node 16 to Node 20, which may cause issues
|
|
43
|
+
on very old self-hosted runners (Node 20 requires glibc 2.17+)
|
|
44
|
+
5. role-session-name auto-generation format changed — if downstream IAM policies
|
|
45
|
+
or CloudTrail queries match on session name patterns, they may stop matching
|
|
46
|
+
fix: |
|
|
47
|
+
Add an explicit aws-region input to every configure-aws-credentials step.
|
|
48
|
+
|
|
49
|
+
For OIDC-based auth, also verify your IAM trust policy's Condition block is
|
|
50
|
+
compatible with the @v4 defaults (audience: sts.amazonaws.com, subject claim
|
|
51
|
+
format: repo:OWNER/REPO:ref:refs/heads/BRANCH).
|
|
52
|
+
|
|
53
|
+
Store the region in a repository or organization variable (vars.AWS_REGION)
|
|
54
|
+
to avoid hardcoding the same region string across multiple workflow files.
|
|
55
|
+
fix_code:
|
|
56
|
+
- language: yaml
|
|
57
|
+
label: "configure-aws-credentials@v4 with required aws-region (OIDC)"
|
|
58
|
+
code: |
|
|
59
|
+
jobs:
|
|
60
|
+
deploy:
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
permissions:
|
|
63
|
+
id-token: write # Required for OIDC
|
|
64
|
+
contents: read
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
|
|
68
|
+
- name: Configure AWS credentials
|
|
69
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
70
|
+
with:
|
|
71
|
+
aws-region: us-east-1 # Required in v4 (was optional in v1)
|
|
72
|
+
role-to-assume: ${{ vars.AWS_ROLE_ARN }}
|
|
73
|
+
role-session-name: GitHubActionsSession
|
|
74
|
+
|
|
75
|
+
- name: Deploy
|
|
76
|
+
run: aws s3 sync dist/ s3://${{ vars.S3_BUCKET }}/
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "configure-aws-credentials@v4 with static key auth"
|
|
79
|
+
code: |
|
|
80
|
+
jobs:
|
|
81
|
+
deploy:
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
steps:
|
|
84
|
+
- uses: actions/checkout@v4
|
|
85
|
+
|
|
86
|
+
- name: Configure AWS credentials (static keys)
|
|
87
|
+
uses: aws-actions/configure-aws-credentials@v4
|
|
88
|
+
with:
|
|
89
|
+
aws-region: ${{ vars.AWS_REGION }} # Use variable, not hardcoded
|
|
90
|
+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
91
|
+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
92
|
+
|
|
93
|
+
- name: Deploy
|
|
94
|
+
run: aws s3 sync dist/ s3://${{ vars.S3_BUCKET }}/
|
|
95
|
+
prevention:
|
|
96
|
+
- "Always specify aws-region explicitly in every configure-aws-credentials step — never rely on AWS_DEFAULT_REGION"
|
|
97
|
+
- "Store the AWS region in a repository variable (vars.AWS_REGION) to keep it consistent and easy to change"
|
|
98
|
+
- "When Dependabot bumps configure-aws-credentials to a new major version, review the release notes and test in a non-production environment first"
|
|
99
|
+
- "After bumping to v4, validate your IAM OIDC trust policy: the audience should be 'sts.amazonaws.com' and the subject claim format should match repo:OWNER/REPO:ref:refs/..."
|
|
100
|
+
- "Use actionlint locally to catch missing required inputs before committing workflow files"
|
|
101
|
+
docs:
|
|
102
|
+
- url: "https://github.com/aws-actions/configure-aws-credentials"
|
|
103
|
+
label: "aws-actions/configure-aws-credentials — README and migration guide"
|
|
104
|
+
- url: "https://github.com/aws-actions/configure-aws-credentials/releases"
|
|
105
|
+
label: "aws-actions/configure-aws-credentials — Release notes (v4 breaking changes)"
|
|
106
|
+
- url: "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html"
|
|
107
|
+
label: "AWS Docs — Creating OpenID Connect identity providers"
|
|
108
|
+
- url: "https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services"
|
|
109
|
+
label: "GitHub Docs — Configuring OIDC in Amazon Web Services"
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
id: silent-failures-056
|
|
2
|
+
title: "'continue-on-error: true' makes a failed job report success in required status checks"
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- continue-on-error
|
|
7
|
+
- required-status-checks
|
|
8
|
+
- branch-protection
|
|
9
|
+
- checks-api
|
|
10
|
+
- silent
|
|
11
|
+
- branch-protection-bypass
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'continue-on-error:\s*true'
|
|
14
|
+
flags: i
|
|
15
|
+
error_messages:
|
|
16
|
+
- "Job succeeded (continue-on-error)"
|
|
17
|
+
- "Required status check passed (job actually failed but continue-on-error: true)"
|
|
18
|
+
root_cause: |
|
|
19
|
+
When a job has continue-on-error: true set, GitHub Actions converts the job's conclusion
|
|
20
|
+
from failure to success before writing the result to the Checks API. The branch
|
|
21
|
+
protection system only sees the API-level conclusion — which is "success" — and allows
|
|
22
|
+
the pull request to merge.
|
|
23
|
+
|
|
24
|
+
The job timeline in the GitHub UI shows a yellow icon with "(Cancelled)" or similar
|
|
25
|
+
wording, but the Checks API and branch protection treat it as passed. Developers
|
|
26
|
+
relying on required status checks to enforce quality gates unknowingly lose that
|
|
27
|
+
protection for any job marked continue-on-error: true.
|
|
28
|
+
|
|
29
|
+
This is particularly dangerous on jobs that run security scans, license checks, or
|
|
30
|
+
integration tests where the team deliberately added them as required checks to block
|
|
31
|
+
broken or risky changes from merging.
|
|
32
|
+
fix: |
|
|
33
|
+
Avoid using continue-on-error: true on jobs that are configured as required status
|
|
34
|
+
checks in branch protection rules. Instead, handle acceptable failure conditions
|
|
35
|
+
explicitly inside the job using if: steps.*.outcome == 'failure' logic.
|
|
36
|
+
|
|
37
|
+
If you need to always continue a workflow past a flaky or optional step but still
|
|
38
|
+
surface failures in status checks, use a separate sentinel job that:
|
|
39
|
+
1. Depends on the real job with needs:
|
|
40
|
+
2. Runs with if: always()
|
|
41
|
+
3. Fails explicitly if the upstream job failed
|
|
42
|
+
|
|
43
|
+
This pattern separates "keep the workflow running" from "record the real outcome".
|
|
44
|
+
fix_code:
|
|
45
|
+
- language: yaml
|
|
46
|
+
label: "Problem: continue-on-error silently hides failures from status checks"
|
|
47
|
+
code: |
|
|
48
|
+
jobs:
|
|
49
|
+
security-scan:
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
continue-on-error: true # DANGER: required status check will PASS even if scan fails
|
|
52
|
+
steps:
|
|
53
|
+
- name: Run security scan
|
|
54
|
+
run: ./run-scan.sh
|
|
55
|
+
- language: yaml
|
|
56
|
+
label: "Fix: use a sentinel job to preserve the real outcome"
|
|
57
|
+
code: |
|
|
58
|
+
jobs:
|
|
59
|
+
security-scan:
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
# No continue-on-error here
|
|
62
|
+
steps:
|
|
63
|
+
- name: Run security scan
|
|
64
|
+
run: ./run-scan.sh
|
|
65
|
+
|
|
66
|
+
# This is the job to set as the required status check
|
|
67
|
+
security-gate:
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
needs: [security-scan]
|
|
70
|
+
if: always()
|
|
71
|
+
steps:
|
|
72
|
+
- name: Check security scan result
|
|
73
|
+
if: needs.security-scan.result != 'success'
|
|
74
|
+
run: |
|
|
75
|
+
echo "Security scan did not pass (result: ${{ needs.security-scan.result }})"
|
|
76
|
+
exit 1
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: "Alternative: handle acceptable failures inside the step, not the job"
|
|
79
|
+
code: |
|
|
80
|
+
jobs:
|
|
81
|
+
test:
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
steps:
|
|
84
|
+
- name: Run optional extended tests
|
|
85
|
+
id: extended
|
|
86
|
+
run: ./run-extended-tests.sh
|
|
87
|
+
continue-on-error: true # Step-level is safer than job-level
|
|
88
|
+
|
|
89
|
+
- name: Fail job if extended tests failed unexpectedly
|
|
90
|
+
if: steps.extended.outcome == 'failure'
|
|
91
|
+
run: |
|
|
92
|
+
echo "Extended tests failed — blocking merge"
|
|
93
|
+
exit 1
|
|
94
|
+
prevention:
|
|
95
|
+
- "Never set continue-on-error: true at the job level for jobs that are required status checks"
|
|
96
|
+
- "Use continue-on-error: true at the step level instead — it does not affect the Checks API job conclusion"
|
|
97
|
+
- "Audit your branch protection required checks against all jobs that have continue-on-error: true"
|
|
98
|
+
- "Use the sentinel job pattern to separate workflow continuation from status reporting"
|
|
99
|
+
docs:
|
|
100
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idcontinue-on-error"
|
|
101
|
+
label: "GitHub Docs: continue-on-error syntax"
|
|
102
|
+
- url: "https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches#require-status-checks-before-merging"
|
|
103
|
+
label: "GitHub Docs: Required status checks before merging"
|
|
104
|
+
- url: "https://docs.github.com/en/rest/checks/runs"
|
|
105
|
+
label: "GitHub REST API: Checks runs"
|