@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.
Files changed (25) hide show
  1. package/errors/caching-artifacts/caching-artifacts-038.yml +95 -0
  2. package/errors/caching-artifacts/caching-artifacts-039.yml +110 -0
  3. package/errors/concurrency-timing/concurrency-timing-033.yml +104 -0
  4. package/errors/concurrency-timing/concurrency-timing-034.yml +123 -0
  5. package/errors/known-unsolved/known-unsolved-037.yml +124 -0
  6. package/errors/known-unsolved/known-unsolved-038.yml +124 -0
  7. package/errors/known-unsolved/known-unsolved-039.yml +102 -0
  8. package/errors/permissions-auth/permissions-auth-040.yml +142 -0
  9. package/errors/permissions-auth/permissions-auth-041.yml +110 -0
  10. package/errors/runner-environment/runner-environment-112.yml +98 -0
  11. package/errors/runner-environment/runner-environment-113.yml +118 -0
  12. package/errors/runner-environment/runner-environment-114.yml +130 -0
  13. package/errors/runner-environment/runner-environment-115.yml +120 -0
  14. package/errors/runner-environment/runner-environment-116.yml +106 -0
  15. package/errors/runner-environment/runner-environment-117.yml +109 -0
  16. package/errors/silent-failures/silent-failures-056.yml +105 -0
  17. package/errors/silent-failures/silent-failures-057.yml +120 -0
  18. package/errors/silent-failures/silent-failures-058.yml +126 -0
  19. package/errors/triggers/triggers-040.yml +104 -0
  20. package/errors/triggers/triggers-041.yml +105 -0
  21. package/errors/triggers/triggers-042.yml +110 -0
  22. package/errors/triggers/triggers-043.yml +125 -0
  23. package/errors/yaml-syntax/yaml-syntax-040.yml +135 -0
  24. package/errors/yaml-syntax/yaml-syntax-041.yml +147 -0
  25. 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"