@htekdev/actions-debugger 1.0.108 → 1.0.110
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-064.yml +92 -0
- package/errors/known-unsolved/cross-job-tmp-files-separate-runners.yml +121 -0
- package/errors/permissions-auth/create-github-app-token-invalid-key-data.yml +94 -0
- package/errors/runner-environment/arc-runner-v2332-container-github-env-permission-denied.yml +117 -0
- package/errors/runner-environment/node24-16-toolcache-regression-browser-install-fails.yml +109 -0
- package/errors/silent-failures/setup-node-falls-through-wrong-version-on-download-failure.yml +112 -0
- package/errors/yaml-syntax/workflow-dispatch-input-type-object-invalid.yml +84 -0
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
id: caching-artifacts-064
|
|
2
|
+
title: 'Third-party actions bundling @actions/cache npm v3 return "Cache service responded with 422" after Dec 2024 backend migration'
|
|
3
|
+
category: caching-artifacts
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- actions-cache
|
|
7
|
+
- deprecated-api
|
|
8
|
+
- cache-backend
|
|
9
|
+
- 422
|
|
10
|
+
- npm-package
|
|
11
|
+
- third-party-action
|
|
12
|
+
- migration
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Cache service responded with 422'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Failed to save cache.*422|Failed to restore cache.*422'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'cache.*HTTP 422|HTTP 422.*cache'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- "Cache service responded with 422"
|
|
22
|
+
- "Error: Cache service responded with 422"
|
|
23
|
+
- "Failed to save cache: Cache service responded with 422"
|
|
24
|
+
- "Warning: Failed to restore cache: Cache service responded with 422"
|
|
25
|
+
root_cause: |
|
|
26
|
+
In December 2024, GitHub migrated the Actions cache backend to a new service API.
|
|
27
|
+
The deprecated v3 cache API endpoints now return HTTP 422 instead of processing
|
|
28
|
+
cache requests. Any action that embeds `@actions/cache` npm package at v3.x sends
|
|
29
|
+
requests to the old endpoint and receives 422 responses.
|
|
30
|
+
|
|
31
|
+
This affects any action — not just `actions/cache` itself — that bundles the old
|
|
32
|
+
`@actions/cache` npm package internally. Common affected actions:
|
|
33
|
+
- `actions/setup-node@v2` / `@v3` (embed @actions/cache v3)
|
|
34
|
+
- `actions/setup-python@v4` and earlier
|
|
35
|
+
- `actions/setup-go@v4` and earlier
|
|
36
|
+
- Custom or third-party JavaScript/composite actions that haven't updated
|
|
37
|
+
their package-lock.json since early 2024
|
|
38
|
+
|
|
39
|
+
The 422 error appears in the step output but the visible message does not mention
|
|
40
|
+
deprecated API versions or npm package issues — it only shows the HTTP status code.
|
|
41
|
+
|
|
42
|
+
Note: This is distinct from `caching-artifacts-056` (actions/cache v1/v2 hard
|
|
43
|
+
deprecation which shows "automatically failed because it uses a deprecated version").
|
|
44
|
+
That error comes from the version check; this error comes from the actual API call.
|
|
45
|
+
fix: |
|
|
46
|
+
Upgrade the affected action to a version that bundles `@actions/cache` npm v4+.
|
|
47
|
+
For first-party GitHub actions, use the latest major version:
|
|
48
|
+
- `actions/setup-node` → upgrade to @v4 or @v5
|
|
49
|
+
- `actions/setup-python` → upgrade to @v5
|
|
50
|
+
- `actions/setup-go` → upgrade to @v5
|
|
51
|
+
- `actions/cache` used directly → upgrade to @v4
|
|
52
|
+
|
|
53
|
+
For third-party actions, open an issue asking the maintainer to update
|
|
54
|
+
@actions/cache in their package-lock.json and re-bundle the action.
|
|
55
|
+
|
|
56
|
+
As a temporary workaround, disable caching in the action to unblock CI:
|
|
57
|
+
fix_code:
|
|
58
|
+
- language: yaml
|
|
59
|
+
label: 'Upgrade setup-* actions to latest major version with updated cache client'
|
|
60
|
+
code: |
|
|
61
|
+
# Before (bundled @actions/cache v3 — returns 422 after Dec 2024 migration)
|
|
62
|
+
- uses: actions/setup-node@v2
|
|
63
|
+
with:
|
|
64
|
+
node-version: '18'
|
|
65
|
+
cache: 'npm'
|
|
66
|
+
|
|
67
|
+
# After (@actions/cache v4+ bundled — compatible with current cache service)
|
|
68
|
+
- uses: actions/setup-node@v4
|
|
69
|
+
with:
|
|
70
|
+
node-version: '18'
|
|
71
|
+
cache: 'npm'
|
|
72
|
+
- language: yaml
|
|
73
|
+
label: 'Disable caching as temporary workaround if action cannot be upgraded'
|
|
74
|
+
code: |
|
|
75
|
+
- uses: actions/setup-node@v2
|
|
76
|
+
with:
|
|
77
|
+
node-version: '18'
|
|
78
|
+
cache: '' # empty string disables cache, avoids 422 until action is upgraded
|
|
79
|
+
prevention:
|
|
80
|
+
- 'Keep all setup-* actions at their latest major version to stay compatible with the cache service API'
|
|
81
|
+
- 'Audit all uses: references for versions older than January 2024 — they may bundle stale @actions/cache v3'
|
|
82
|
+
- 'Enable Dependabot version updates for GitHub Actions to automatically surface major version bumps'
|
|
83
|
+
- 'After any GitHub changelog cache-migration notice, scan workflows for outdated action pins'
|
|
84
|
+
docs:
|
|
85
|
+
- url: 'https://github.blog/changelog/2024-12-05-notice-of-upcoming-releases-and-breaking-changes-for-github-actions'
|
|
86
|
+
label: 'GitHub Changelog — Notice of cache migration and deprecated action versions (Dec 2024)'
|
|
87
|
+
- url: 'https://github.com/actions/toolkit/tree/main/packages/cache'
|
|
88
|
+
label: 'actions/toolkit — @actions/cache npm package changelog'
|
|
89
|
+
- url: 'https://github.com/actions/setup-node/issues/1275'
|
|
90
|
+
label: 'actions/setup-node#1275 — Cache service 422 errors with older action versions (13 reactions)'
|
|
91
|
+
- url: 'https://github.com/orgs/community/discussions/155534'
|
|
92
|
+
label: 'GitHub Community — Cache service 422 flaky restores during Dec 2024 migration'
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
id: known-unsolved-057
|
|
2
|
+
title: 'Jobs run on separate fresh runners — /tmp and filesystem are not shared between jobs'
|
|
3
|
+
category: known-unsolved
|
|
4
|
+
severity: limitation
|
|
5
|
+
tags:
|
|
6
|
+
- jobs
|
|
7
|
+
- runner
|
|
8
|
+
- filesystem
|
|
9
|
+
- tmp
|
|
10
|
+
- isolation
|
|
11
|
+
- artifacts
|
|
12
|
+
- cross-job
|
|
13
|
+
- runner-environment
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'No such file or directory.*/tmp/'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'ENOENT.*no such file.*tmp|cannot.*open.*/tmp/.*no such'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'file.*not found.*/tmp|/tmp/.*does not exist'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- "/tmp/output.json: No such file or directory"
|
|
23
|
+
- "Error: ENOENT: no such file or directory, open '/tmp/result.txt'"
|
|
24
|
+
- "/tmp/build-manifest.json: No such file or directory"
|
|
25
|
+
root_cause: |
|
|
26
|
+
Each job in a GitHub Actions workflow runs on a completely separate, freshly
|
|
27
|
+
provisioned runner instance. There is NO shared filesystem between jobs. Files
|
|
28
|
+
written to `/tmp`, `$RUNNER_TEMP`, `$GITHUB_WORKSPACE`, or any other path during
|
|
29
|
+
one job are invisible to all subsequent jobs.
|
|
30
|
+
|
|
31
|
+
This is a fundamental architectural property: GitHub provisions a new virtual machine
|
|
32
|
+
for each job. The previous job's VM is terminated before the next job starts. No
|
|
33
|
+
filesystem state survives the job boundary.
|
|
34
|
+
|
|
35
|
+
Common patterns that fail for this reason:
|
|
36
|
+
1. Build job writes `/tmp/report.json` → deploy job tries to read `/tmp/report.json`
|
|
37
|
+
2. Test job saves coverage to `$RUNNER_TEMP/coverage.xml` → reporter job looks for it
|
|
38
|
+
3. Compile job produces `./dist/app` → signing job tries to use `./dist/app` without
|
|
39
|
+
re-downloading it via artifacts
|
|
40
|
+
4. First job exports env vars via `$GITHUB_ENV` → second job expects those env vars
|
|
41
|
+
(env vars set via GITHUB_ENV are also job-scoped and do not persist)
|
|
42
|
+
5. Steps within the SAME job DO share `/tmp` and the workspace — the limitation is
|
|
43
|
+
specifically at the JOB boundary
|
|
44
|
+
|
|
45
|
+
Self-hosted runner pools with persistent workspaces can accidentally appear to share
|
|
46
|
+
state between jobs on the same machine, but this is unreliable (another job may have
|
|
47
|
+
cleaned the directory) and creates security risks (secret leakage between runs).
|
|
48
|
+
fix: |
|
|
49
|
+
There is no mechanism to share filesystem state between jobs without explicitly
|
|
50
|
+
transferring the data. Two patterns solve this:
|
|
51
|
+
|
|
52
|
+
1. Use `actions/upload-artifact` at the end of the producing job and
|
|
53
|
+
`actions/download-artifact` at the start of the consuming job.
|
|
54
|
+
Best for: files, binaries, test results, build outputs.
|
|
55
|
+
|
|
56
|
+
2. Use job `outputs:` to pass small string values. The producing job emits
|
|
57
|
+
`echo "key=value" >> $GITHUB_OUTPUT` and declares it under `outputs:`.
|
|
58
|
+
The consuming job reads it as `needs.<job>.outputs.<key>`.
|
|
59
|
+
Best for: version strings, commit SHAs, boolean flags, counts.
|
|
60
|
+
fix_code:
|
|
61
|
+
- language: yaml
|
|
62
|
+
label: 'Pass files between jobs using upload-artifact / download-artifact'
|
|
63
|
+
code: |
|
|
64
|
+
jobs:
|
|
65
|
+
build:
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v4
|
|
69
|
+
|
|
70
|
+
- name: Build binary
|
|
71
|
+
run: make build # produces ./dist/app
|
|
72
|
+
|
|
73
|
+
- name: Upload for next job
|
|
74
|
+
uses: actions/upload-artifact@v4
|
|
75
|
+
with:
|
|
76
|
+
name: app-binary
|
|
77
|
+
path: ./dist/app # upload so sign job can download it
|
|
78
|
+
|
|
79
|
+
sign:
|
|
80
|
+
needs: build
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
steps:
|
|
83
|
+
- name: Download binary
|
|
84
|
+
uses: actions/download-artifact@v4
|
|
85
|
+
with:
|
|
86
|
+
name: app-binary
|
|
87
|
+
path: ./dist
|
|
88
|
+
|
|
89
|
+
- name: Sign binary
|
|
90
|
+
run: cosign sign ./dist/app
|
|
91
|
+
- language: yaml
|
|
92
|
+
label: 'Pass small string data between jobs using job outputs'
|
|
93
|
+
code: |
|
|
94
|
+
jobs:
|
|
95
|
+
compute-version:
|
|
96
|
+
runs-on: ubuntu-latest
|
|
97
|
+
outputs:
|
|
98
|
+
version: ${{ steps.ver.outputs.version }}
|
|
99
|
+
steps:
|
|
100
|
+
- id: ver
|
|
101
|
+
run: echo "version=$(cat VERSION)" >> "$GITHUB_OUTPUT"
|
|
102
|
+
|
|
103
|
+
deploy:
|
|
104
|
+
needs: compute-version
|
|
105
|
+
runs-on: ubuntu-latest
|
|
106
|
+
steps:
|
|
107
|
+
- run: echo "Deploying v${{ needs.compute-version.outputs.version }}"
|
|
108
|
+
prevention:
|
|
109
|
+
- 'Never rely on /tmp, $RUNNER_TEMP, or workspace paths to share data between jobs — use artifacts or job outputs'
|
|
110
|
+
- 'Remember: only steps within the same job share a filesystem; different jobs always get separate runners'
|
|
111
|
+
- 'Use actions/upload-artifact@v4 for files; use job outputs for strings; use caches only for dependency restoration'
|
|
112
|
+
- 'Environment variables set with GITHUB_ENV are also job-scoped and do not persist across job boundaries'
|
|
113
|
+
docs:
|
|
114
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow'
|
|
115
|
+
label: 'GitHub Docs — Storing and sharing data between jobs using artifacts'
|
|
116
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/passing-information-between-jobs'
|
|
117
|
+
label: 'GitHub Docs — Passing information between jobs using outputs'
|
|
118
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-where-your-workflow-runs/about-github-hosted-runners'
|
|
119
|
+
label: 'GitHub Docs — About GitHub-hosted runners (each job gets a fresh VM)'
|
|
120
|
+
- url: 'https://github.com/orgs/community/discussions/26671'
|
|
121
|
+
label: 'GitHub Community — Sharing files and filesystem data between workflow jobs'
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
id: permissions-auth-062
|
|
2
|
+
title: 'create-github-app-token "Invalid keyData" — private key passed via env var with escaped \\n sequences'
|
|
3
|
+
category: permissions-auth
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- github-app
|
|
7
|
+
- private-key
|
|
8
|
+
- invalid-key-data
|
|
9
|
+
- environment-variable
|
|
10
|
+
- newlines
|
|
11
|
+
- create-github-app-token
|
|
12
|
+
- webcrypto
|
|
13
|
+
patterns:
|
|
14
|
+
- regex: 'Invalid keyData'
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'DOMException.*Invalid keyData|DataError.*Invalid keyData'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'Failed to create token for .+ \(attempt \d+\): Invalid keyData'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
error_messages:
|
|
21
|
+
- "DOMException [DataError]: Invalid keyData"
|
|
22
|
+
- "Failed to create token for \"repo-name\" (attempt 1): Invalid keyData"
|
|
23
|
+
- "Failed to create token for \"repo-name\" (attempt 2): Invalid keyData"
|
|
24
|
+
- "Error: Invalid keyData"
|
|
25
|
+
root_cause: |
|
|
26
|
+
The `actions/create-github-app-token` action v2+ uses the Web Crypto API
|
|
27
|
+
(`crypto.subtle.importKey()`) to load the GitHub App private key. This API
|
|
28
|
+
is strict about key formatting — it throws `DOMException [DataError]: Invalid keyData`
|
|
29
|
+
if the PEM key material is malformed at the byte level.
|
|
30
|
+
|
|
31
|
+
The most common trigger is passing the private key via an environment variable
|
|
32
|
+
where literal `\n` two-character sequences appear instead of actual newline (0x0A)
|
|
33
|
+
bytes. This happens when:
|
|
34
|
+
1. The key is constructed inline in YAML with `"-----BEGIN...\nMIIE...\n-----END..."`
|
|
35
|
+
where `\n` is a YAML string escape, not a real newline in the multi-line base64 body
|
|
36
|
+
2. An external CI system or secrets manager serializes the PEM key as a single line
|
|
37
|
+
with literal backslash-n separators before injecting it into the Actions environment
|
|
38
|
+
3. Shell variable interpolation collapses the newlines (e.g., `echo $PRIVATE_KEY`)
|
|
39
|
+
|
|
40
|
+
The Web Crypto SubtleCrypto API attempts to Base64-decode the key body. When the
|
|
41
|
+
PEM line breaks are backslash-n characters (0x5C 0x6E) instead of 0x0A, the Base64
|
|
42
|
+
chunks are malformed and importKey() throws "Invalid keyData" immediately — before
|
|
43
|
+
any GitHub API call is made.
|
|
44
|
+
|
|
45
|
+
This is distinct from "A JSON web token could not be decoded" (permissions-auth-021)
|
|
46
|
+
which occurs when the key IS imported successfully but the resulting JWT is rejected
|
|
47
|
+
by GitHub's API — a later-stage failure caused by different formatting issues such
|
|
48
|
+
as trailing whitespace, CRLF endings, or missing PEM headers.
|
|
49
|
+
fix: |
|
|
50
|
+
Pass the private key directly as an action input using the GitHub Actions secret
|
|
51
|
+
expression `${{ secrets.APP_PRIVATE_KEY }}`. When GitHub resolves a secret, it
|
|
52
|
+
preserves the original stored bytes including actual newlines. Do NOT pass the key
|
|
53
|
+
through env: variables or inline string construction.
|
|
54
|
+
|
|
55
|
+
To store the key with correct newlines, set the secret from the downloaded .pem file
|
|
56
|
+
using the GitHub CLI:
|
|
57
|
+
gh secret set APP_PRIVATE_KEY < my-app.private-key.pem
|
|
58
|
+
fix_code:
|
|
59
|
+
- language: yaml
|
|
60
|
+
label: 'Correct: pass private key directly as action input from secret'
|
|
61
|
+
code: |
|
|
62
|
+
- uses: actions/create-github-app-token@v1
|
|
63
|
+
id: app-token
|
|
64
|
+
with:
|
|
65
|
+
app-id: ${{ vars.APP_ID }}
|
|
66
|
+
private-key: ${{ secrets.APP_PRIVATE_KEY }} # newlines preserved by Actions runtime
|
|
67
|
+
- language: yaml
|
|
68
|
+
label: 'Wrong: constructing key inline with \\n escape sequences (causes Invalid keyData)'
|
|
69
|
+
code: |
|
|
70
|
+
# DO NOT DO THIS — \n are literal two-char sequences, not newlines
|
|
71
|
+
- name: Broken token generation
|
|
72
|
+
env:
|
|
73
|
+
KEY: "-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----"
|
|
74
|
+
run: |
|
|
75
|
+
echo "$KEY" > /tmp/key.pem
|
|
76
|
+
# The action will fail with: DOMException [DataError]: Invalid keyData
|
|
77
|
+
- language: shell
|
|
78
|
+
label: 'Set secret from .pem file using GitHub CLI (preserves real newlines)'
|
|
79
|
+
code: |
|
|
80
|
+
gh secret set APP_PRIVATE_KEY < my-app.2024-01-15.private-key.pem
|
|
81
|
+
prevention:
|
|
82
|
+
- 'Always set APP_PRIVATE_KEY secret using `gh secret set KEY < file.pem`, not by pasting the raw PEM text with \\n sequences'
|
|
83
|
+
- 'Pass the key exclusively as `private-key: ${{ secrets.KEY }}` — never via env: or inline string interpolation'
|
|
84
|
+
- 'If importing from an external secrets manager, ensure the manager preserves actual newline bytes (0x0A) when injecting into GitHub Actions secrets'
|
|
85
|
+
- 'Verify the secret was set correctly: run `gh secret list` and confirm the key was recently updated'
|
|
86
|
+
docs:
|
|
87
|
+
- url: 'https://github.com/actions/create-github-app-token'
|
|
88
|
+
label: 'actions/create-github-app-token README'
|
|
89
|
+
- url: 'https://github.com/actions/create-github-app-token/issues/184'
|
|
90
|
+
label: 'actions/create-github-app-token#184 — Invalid keyData when key passed via environment variable'
|
|
91
|
+
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey'
|
|
92
|
+
label: 'MDN — SubtleCrypto.importKey() — DOMException DataError causes'
|
|
93
|
+
- url: 'https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-private-key-for-a-github-app'
|
|
94
|
+
label: 'GitHub Docs — Generating a private key for a GitHub App'
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
id: runner-environment-178
|
|
2
|
+
title: 'ARC Runner v2.332.0 Regression — Container Job GITHUB_ENV and Workspace Permission Denied'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- arc
|
|
7
|
+
- actions-runner-controller
|
|
8
|
+
- container-job
|
|
9
|
+
- permissions
|
|
10
|
+
- GITHUB_ENV
|
|
11
|
+
- non-root
|
|
12
|
+
- kubernetes
|
|
13
|
+
- regression
|
|
14
|
+
- v2.332
|
|
15
|
+
patterns:
|
|
16
|
+
- regex: 'cannot create /__w/_temp/_runner_file_commands/set_env_[0-9a-f]+: Permission denied'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'cannot create /__w/_temp/_runner_file_commands/add_path_[0-9a-f]+: Permission denied'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'fatal: detected dubious ownership in repository at .+/__w/'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
- regex: '_runner_file_commands.*Permission denied'
|
|
23
|
+
flags: 'i'
|
|
24
|
+
error_messages:
|
|
25
|
+
- "/__w/_temp/36e38446.sh: 5: cannot create /__w/_temp/_runner_file_commands/set_env_7bb88aaa: Permission denied"
|
|
26
|
+
- "fatal: detected dubious ownership in repository at '/__w/repo/repo'"
|
|
27
|
+
- "/__w/_temp/_runner_file_commands/add_path_: Permission denied"
|
|
28
|
+
root_cause: |
|
|
29
|
+
Upgrading Actions Runner Controller (ARC) from runner v2.330.0 to v2.332.0
|
|
30
|
+
introduces a compound regression that breaks container jobs using non-root users.
|
|
31
|
+
|
|
32
|
+
The regression spans two runner releases:
|
|
33
|
+
|
|
34
|
+
1. v2.331.0 changed the runner container base image from Ubuntu 22.04 to
|
|
35
|
+
Ubuntu 24.04. The newer base ships git 2.43+ which enforces stricter
|
|
36
|
+
safe.directory checks. The mounted workspace volume is owned by the runner
|
|
37
|
+
UID, so a container running as a different non-root UID receives
|
|
38
|
+
"fatal: detected dubious ownership" on any git operation.
|
|
39
|
+
|
|
40
|
+
2. v2.332.0 bumped container hooks to v0.8.1, which updated workspace
|
|
41
|
+
ownership handling for the runner pod itself — but not for downstream job
|
|
42
|
+
containers. The _runner_file_commands directory under /__w/_temp/ is
|
|
43
|
+
still created with runner UID ownership. When a container step writes to
|
|
44
|
+
$GITHUB_ENV, $GITHUB_OUTPUT, $GITHUB_PATH, or $GITHUB_STEP_SUMMARY via a
|
|
45
|
+
shell redirect, the shell (running as the container's non-root user) cannot
|
|
46
|
+
create the file and exits non-zero.
|
|
47
|
+
|
|
48
|
+
This regression affects:
|
|
49
|
+
- ARC-managed self-hosted runners on Kubernetes (EKS, GKE, AKS, on-prem)
|
|
50
|
+
- Any workflow using `container: image: my-image` with `options: --user <uid>`
|
|
51
|
+
or a non-root USER in the Dockerfile
|
|
52
|
+
- Workflows that previously worked on runner v2.330.0 and below
|
|
53
|
+
|
|
54
|
+
GitHub-hosted runners (ubuntu-latest, etc.) are NOT affected.
|
|
55
|
+
fix: |
|
|
56
|
+
If you cannot immediately pin the runner version, add a workaround step at
|
|
57
|
+
the top of the affected job to fix ownership of the runner file command
|
|
58
|
+
directories. Alternatively, pin ARC runner images to v2.330.0 until an
|
|
59
|
+
upstream fix for container hooks is released.
|
|
60
|
+
|
|
61
|
+
The most robust long-term fix is to explicitly add the workspace to git's
|
|
62
|
+
safe.directory list and pre-create the file command directories with the
|
|
63
|
+
correct ownership.
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: 'Option A — Pre-create _runner_file_commands with container user ownership'
|
|
67
|
+
code: |
|
|
68
|
+
jobs:
|
|
69
|
+
build:
|
|
70
|
+
runs-on: self-hosted
|
|
71
|
+
container:
|
|
72
|
+
image: my-app:latest
|
|
73
|
+
options: --user 1000
|
|
74
|
+
steps:
|
|
75
|
+
- name: Fix runner file command directory ownership (v2.332.0 workaround)
|
|
76
|
+
# Run as root before any steps that use GITHUB_ENV/GITHUB_OUTPUT
|
|
77
|
+
run: |
|
|
78
|
+
chown -R 1000:1000 /__w/_temp/_runner_file_commands/ || true
|
|
79
|
+
git config --global --add safe.directory /__w/${{ github.repository }}
|
|
80
|
+
shell: bash
|
|
81
|
+
# Note: requires container image to have chown available as root
|
|
82
|
+
- language: yaml
|
|
83
|
+
label: 'Option B — Pin ARC runner image to v2.330.0 to avoid the regression'
|
|
84
|
+
code: |
|
|
85
|
+
# In your ARC HelmRelease or RunnerDeployment spec:
|
|
86
|
+
# spec:
|
|
87
|
+
# template:
|
|
88
|
+
# spec:
|
|
89
|
+
# containers:
|
|
90
|
+
# - name: runner
|
|
91
|
+
# image: ghcr.io/actions/actions-runner:2.330.0
|
|
92
|
+
- language: yaml
|
|
93
|
+
label: 'Option C — Run container job as root to avoid UID mismatch'
|
|
94
|
+
code: |
|
|
95
|
+
jobs:
|
|
96
|
+
build:
|
|
97
|
+
runs-on: self-hosted
|
|
98
|
+
container:
|
|
99
|
+
image: my-app:latest
|
|
100
|
+
options: --user root # avoid UID mismatch until ARC fix ships
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- run: echo "FOO=bar" >> $GITHUB_ENV
|
|
104
|
+
prevention:
|
|
105
|
+
- 'Test ARC runner version upgrades in a staging environment before rolling out to production — especially major bumps (v2.330 → v2.332).'
|
|
106
|
+
- 'Pin container jobs to run as root if your workflow uses GITHUB_ENV, GITHUB_OUTPUT, or GITHUB_PATH writes and you depend on non-root containers.'
|
|
107
|
+
- 'Subscribe to actions/runner releases and scan for changes to container-hooks between minor versions.'
|
|
108
|
+
- 'Add a smoke-test workflow that writes to GITHUB_ENV in a non-root container job — run it against each ARC upgrade to catch regressions early.'
|
|
109
|
+
docs:
|
|
110
|
+
- url: 'https://github.com/actions/runner/issues/4302'
|
|
111
|
+
label: 'actions/runner #4302 — v2.332.0: Container jobs fail with permission denied on GITHUB_ENV and workspace'
|
|
112
|
+
- url: 'https://github.com/actions/runner/issues/4131'
|
|
113
|
+
label: 'actions/runner #4131 — Permissions issue on runners v2.330.0 (/home/runner ownership regression)'
|
|
114
|
+
- url: 'https://github.com/actions/runner/issues/4251'
|
|
115
|
+
label: 'actions/runner #4251 — TempDirectoryManager fails to clean temp directory (permission denied on v2.331.0)'
|
|
116
|
+
- url: 'https://github.com/actions/runner-container-hooks/issues/282'
|
|
117
|
+
label: 'runner-container-hooks #282 — Permissions denied on workingDir'
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
id: runner-environment-177
|
|
2
|
+
title: 'Node.js 24.16.0 Toolcache Update Breaks Puppeteer, Playwright, and Cypress Browser Install'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- nodejs
|
|
7
|
+
- node24
|
|
8
|
+
- puppeteer
|
|
9
|
+
- playwright
|
|
10
|
+
- cypress
|
|
11
|
+
- toolcache
|
|
12
|
+
- browser-install
|
|
13
|
+
- extract-zip
|
|
14
|
+
- regression
|
|
15
|
+
patterns:
|
|
16
|
+
- regex: 'Could not find Chrome \(ver\. \d+\.\d+\.\d+'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
- regex: 'npx puppeteer browsers install .+ exited with code [^0]'
|
|
19
|
+
flags: 'i'
|
|
20
|
+
- regex: 'browserType\.launch: Executable doesn.t exist at .+/chromium'
|
|
21
|
+
flags: 'i'
|
|
22
|
+
- regex: 'Cannot find browser at path.*\.cache/puppeteer'
|
|
23
|
+
flags: 'i'
|
|
24
|
+
- regex: 'Failed to install browsers.*extract.*zip'
|
|
25
|
+
flags: 'i'
|
|
26
|
+
error_messages:
|
|
27
|
+
- "Error: Could not find Chrome (ver. 146.0.7680.153). This can occur if either 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome-headless-shell`) or 2. your cache path is incorrectly configured"
|
|
28
|
+
- "browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1169/chrome-linux/chrome"
|
|
29
|
+
- "Error: Failed to install browsers at /home/runner/.cache/ms-playwright"
|
|
30
|
+
root_cause: |
|
|
31
|
+
The ubuntu-24.04 image update from 20260518.149.1 → 20260525.161.1 bumped the
|
|
32
|
+
cached Node.js toolcache version from 24.15.0 to 24.16.0. Node.js 24.16.0
|
|
33
|
+
contains an upstream regression in the readable-stream.destroy() lifecycle
|
|
34
|
+
that breaks yauzl (a ZIP reading library) and extract-zip which depends on it.
|
|
35
|
+
|
|
36
|
+
The affected tools all use @puppeteer/browsers or equivalent ZIP-based browser
|
|
37
|
+
downloaders internally:
|
|
38
|
+
- Puppeteer: `npx puppeteer browsers install chrome-headless-shell`
|
|
39
|
+
- Playwright: `npx playwright install chromium` / `npx playwright install --with-deps`
|
|
40
|
+
- Cypress: `npx cypress install`
|
|
41
|
+
|
|
42
|
+
The ZIP archive download completes successfully and the partial extraction
|
|
43
|
+
begins, but the stream destroy bug causes yauzl to exit before all entries
|
|
44
|
+
are written. The browser binary never lands on disk. The browser installer
|
|
45
|
+
exits 0 (or a non-descriptive exit code) and the next step fails with
|
|
46
|
+
"Could not find Chrome at path..." or a missing executable error.
|
|
47
|
+
|
|
48
|
+
Root upstream issues:
|
|
49
|
+
- https://github.com/nodejs/node/issues/63487 (yauzl/extract-zip hang / partial extraction)
|
|
50
|
+
- https://github.com/nodejs/node/issues/63638 (libuv regression on Windows)
|
|
51
|
+
|
|
52
|
+
Because actions/setup-node resolves to the cached Node.js 24.16.0 when
|
|
53
|
+
node-version: '24' or node-version: '24.x' is specified (or when using the
|
|
54
|
+
default runner-baked Node 24 on ubuntu-24.04), every workflow that installs
|
|
55
|
+
a browser via these tools is affected until Node.js 24.17.0 ships a fix.
|
|
56
|
+
fix: |
|
|
57
|
+
Pin Node.js to 24.15.0 (the last known-good version) via actions/setup-node
|
|
58
|
+
until Node.js 24.17.0 is published and rolled into the runner toolcache.
|
|
59
|
+
|
|
60
|
+
If your workflow does not strictly require Node.js 24, fall back to Node.js 22
|
|
61
|
+
(the runner image default), which is unaffected by this regression.
|
|
62
|
+
|
|
63
|
+
Do NOT use node-version: '24' or node-version: 'latest' until the upstream
|
|
64
|
+
fix lands in Node.js 24.17.0.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: 'Option A — Pin Node.js to 24.15.0 (last known-good release)'
|
|
68
|
+
code: |
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/setup-node@v6
|
|
71
|
+
with:
|
|
72
|
+
node-version: '24.15.0' # pin until Node 24.17.0 fixes readable-stream regression
|
|
73
|
+
cache: 'npm'
|
|
74
|
+
|
|
75
|
+
- name: Install Puppeteer Chrome
|
|
76
|
+
run: npx puppeteer browsers install chrome-headless-shell
|
|
77
|
+
- language: yaml
|
|
78
|
+
label: 'Option B — Fall back to Node.js 22 (unaffected)'
|
|
79
|
+
code: |
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/setup-node@v6
|
|
82
|
+
with:
|
|
83
|
+
node-version: '22' # LTS, not affected by readable-stream regression
|
|
84
|
+
cache: 'npm'
|
|
85
|
+
|
|
86
|
+
- name: Install Playwright browsers
|
|
87
|
+
run: npx playwright install --with-deps chromium
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: 'Option C — Pin Playwright install to avoid extract-zip entirely (Playwright only)'
|
|
90
|
+
code: |
|
|
91
|
+
steps:
|
|
92
|
+
- uses: actions/setup-node@v6
|
|
93
|
+
with:
|
|
94
|
+
node-version: '24.15.0'
|
|
95
|
+
- uses: microsoft/playwright-github-action@v1 # uses pre-installed image browsers
|
|
96
|
+
prevention:
|
|
97
|
+
- 'Pin node-version to a specific patch (e.g. 24.15.0) rather than a major/minor range in workflows that install browser binaries via npx commands.'
|
|
98
|
+
- 'After bumping Node.js versions, verify browser install steps succeed by checking the binary path explicitly with `ls -la ~/.cache/puppeteer` or equivalent before running tests.'
|
|
99
|
+
- 'Subscribe to actions/runner-images releases to catch toolcache updates that may include Node.js patch regressions.'
|
|
100
|
+
- 'For Playwright, prefer `npx playwright install --with-deps` combined with an explicit Node.js pin rather than relying on runner-image cached Node versions.'
|
|
101
|
+
docs:
|
|
102
|
+
- url: 'https://github.com/actions/runner-images/issues/14173'
|
|
103
|
+
label: 'runner-images #14173 — Puppeteer broken in Ubuntu 24.04 version 20260525.161.1'
|
|
104
|
+
- url: 'https://github.com/nodejs/node/issues/63487'
|
|
105
|
+
label: 'nodejs/node #63487 — yauzl/extract-zip hang and partial extraction (readable-stream regression)'
|
|
106
|
+
- url: 'https://github.com/nodejs/node/issues/63638'
|
|
107
|
+
label: 'nodejs/node #63638 — libuv regression in Node.js 24.16.0'
|
|
108
|
+
- url: 'https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260525.161'
|
|
109
|
+
label: 'runner-images ubuntu24/20260525.161 release — Node.js toolcache bumped 24.15.0 → 24.16.0'
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
id: silent-failures-097
|
|
2
|
+
title: 'setup-node Silently Uses Runner-Baked Node Version When Download Fails — Wrong Version Active'
|
|
3
|
+
category: silent-failures
|
|
4
|
+
severity: silent-failure
|
|
5
|
+
tags:
|
|
6
|
+
- setup-node
|
|
7
|
+
- nodejs
|
|
8
|
+
- download-failure
|
|
9
|
+
- silent-failure
|
|
10
|
+
- wrong-version
|
|
11
|
+
- toolcache
|
|
12
|
+
- hosted-runner
|
|
13
|
+
- fallthrough
|
|
14
|
+
patterns:
|
|
15
|
+
- regex: 'Attempting to download \d+\.\d+\.\d+\.\.\.'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'Cannot find module.*engines.*node.*>=\s*24'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'The engine .node. is incompatible with this module\. Expected version .+\. Got .2[0-2]\.'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
- regex: 'ELIFECYCLE.*node --version.*v2[0-2]\.'
|
|
22
|
+
flags: 'i'
|
|
23
|
+
error_messages:
|
|
24
|
+
- "Attempting to download 24.15.0..."
|
|
25
|
+
- "error: The engine 'node' is incompatible with this module. Expected version '>=24.0.0'. Got '22.14.0'"
|
|
26
|
+
- "npm ERR! code ELIFECYCLE"
|
|
27
|
+
- "Error: Cannot find module 'node:crypto' (Node.js version too old)"
|
|
28
|
+
root_cause: |
|
|
29
|
+
When actions/setup-node's download or extract path fails transiently —
|
|
30
|
+
network blip, manifest miss, partial extract from a concurrent toolcache
|
|
31
|
+
write, or a transient S3/CDN cache failure — the action does not surface the
|
|
32
|
+
error. Instead, it falls back to a secondary download path. If that secondary
|
|
33
|
+
path also fails or returns an unusable toolPath, setup-node adds an empty or
|
|
34
|
+
incorrect directory to PATH and exits 0 (success).
|
|
35
|
+
|
|
36
|
+
Because the setup-node step succeeds, the runner-baked Node.js version
|
|
37
|
+
(e.g. v22.x on ubuntu-latest after the Node 20 removal) remains on PATH.
|
|
38
|
+
Downstream steps execute against the wrong Node.js major version with no
|
|
39
|
+
indication that setup-node did not install the requested version.
|
|
40
|
+
|
|
41
|
+
The mechanism (in official_builds.ts, as of 2026-05-21):
|
|
42
|
+
- Download/extract errors are logged via core.info(), not core.warning()
|
|
43
|
+
or core.error(), so they are buried in normal output
|
|
44
|
+
- After the fallback download attempt, there is no post-condition check
|
|
45
|
+
that verifies node --version matches the requested version
|
|
46
|
+
- core.addPath() is called even if toolPath/bin is empty or stale
|
|
47
|
+
|
|
48
|
+
Reported failing run: https://github.com/n8n-io/n8n/actions/runs/26100630929
|
|
49
|
+
The run showed "Attempting to download 24.15.0..." → 33 seconds of silence →
|
|
50
|
+
next step ran against runner-baked v20.20.0 with no error from setup-node.
|
|
51
|
+
|
|
52
|
+
This is distinct from silent-failures-028 which covers self-hosted runners
|
|
53
|
+
where node is completely absent (node: not found). This entry covers hosted
|
|
54
|
+
runners where the wrong version is silently active and node IS found.
|
|
55
|
+
|
|
56
|
+
Root upstream issue: actions/toolkit#804 — concurrent toolcache writes create
|
|
57
|
+
partial extracts that pass path existence checks.
|
|
58
|
+
fix: |
|
|
59
|
+
Add an explicit node --version verification step immediately after setup-node
|
|
60
|
+
and fail the job if the version does not match. This is the external workaround
|
|
61
|
+
used by affected projects (e.g., n8n/n8n PR #30849).
|
|
62
|
+
|
|
63
|
+
Until actions/setup-node ships a built-in post-install assertion, this
|
|
64
|
+
workflow-level guard is the only reliable way to catch the silent fallthrough.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: 'Add explicit version verification after setup-node'
|
|
68
|
+
code: |
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/setup-node@v6
|
|
71
|
+
with:
|
|
72
|
+
node-version: '24'
|
|
73
|
+
cache: 'npm'
|
|
74
|
+
|
|
75
|
+
- name: Verify Node.js version
|
|
76
|
+
shell: bash
|
|
77
|
+
run: |
|
|
78
|
+
ACTUAL=$(node --version)
|
|
79
|
+
EXPECTED_MAJOR="24"
|
|
80
|
+
if [[ "$ACTUAL" != v${EXPECTED_MAJOR}.* ]]; then
|
|
81
|
+
echo "::error::setup-node installed Node ${EXPECTED_MAJOR} but \`node --version\` reports $ACTUAL"
|
|
82
|
+
echo "::error::This usually indicates a transient download failure or partial toolcache extract."
|
|
83
|
+
exit 1
|
|
84
|
+
fi
|
|
85
|
+
echo "Node.js version confirmed: $ACTUAL"
|
|
86
|
+
|
|
87
|
+
- name: Install dependencies
|
|
88
|
+
run: npm ci
|
|
89
|
+
- language: yaml
|
|
90
|
+
label: 'Pin to exact patch version to reduce toolcache misses'
|
|
91
|
+
code: |
|
|
92
|
+
steps:
|
|
93
|
+
- uses: actions/setup-node@v6
|
|
94
|
+
with:
|
|
95
|
+
node-version: '24.15.0' # exact pin reduces manifest/toolcache lookup failures
|
|
96
|
+
cache: 'npm'
|
|
97
|
+
|
|
98
|
+
- name: Verify Node.js version (belt-and-suspenders)
|
|
99
|
+
run: |
|
|
100
|
+
node --version | grep -E '^v24\.15\.' || (echo "Wrong Node version" && exit 1)
|
|
101
|
+
prevention:
|
|
102
|
+
- 'Always verify node --version matches the requested major after setup-node, especially in workflows that depend on Node.js 24+ features or native modules.'
|
|
103
|
+
- 'Pin to an exact patch version (e.g. 24.15.0) rather than a range (24.x) to avoid unexpected toolcache miss fallbacks.'
|
|
104
|
+
- 'If you see "Attempting to download X.Y.Z..." followed by an unusually long pause in setup-node output, the download may have stalled and the fallback path may be active.'
|
|
105
|
+
- 'Watch setup-node releases for a built-in post-install assertion fix (tracked in actions/setup-node#1556 and actions/toolkit#804).'
|
|
106
|
+
docs:
|
|
107
|
+
- url: 'https://github.com/actions/setup-node/issues/1556'
|
|
108
|
+
label: 'setup-node #1556 — setup-node silently falls through to runner-baked Node on download/extract failure'
|
|
109
|
+
- url: 'https://github.com/actions/toolkit/issues/804'
|
|
110
|
+
label: 'actions/toolkit #804 — Concurrent toolcache writes cause partial extracts on multi-tenant runners'
|
|
111
|
+
- url: 'https://github.com/n8n-io/n8n/pull/30849'
|
|
112
|
+
label: 'n8n/n8n PR #30849 — External Verify Node.js Version workaround'
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
id: yaml-syntax-067
|
|
2
|
+
title: 'workflow_dispatch input type: object is not valid — "Unexpected value" validation error'
|
|
3
|
+
category: yaml-syntax
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- workflow_dispatch
|
|
7
|
+
- inputs
|
|
8
|
+
- type-object
|
|
9
|
+
- validation-error
|
|
10
|
+
- yaml
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: 'on\.workflow_dispatch\.inputs\.\w+\.type.*Unexpected value'
|
|
13
|
+
flags: 'i'
|
|
14
|
+
- regex: "Unexpected value 'object'"
|
|
15
|
+
flags: 'i'
|
|
16
|
+
- regex: 'Input type .object. is not supported'
|
|
17
|
+
flags: 'i'
|
|
18
|
+
error_messages:
|
|
19
|
+
- "Invalid workflow file: on.workflow_dispatch.inputs.config.type: Unexpected value 'object'"
|
|
20
|
+
- "Invalid workflow file: .github/workflows/deploy.yml: Unexpected value 'object'"
|
|
21
|
+
root_cause: |
|
|
22
|
+
`workflow_dispatch` inputs support only five types: `string`, `boolean`, `choice`,
|
|
23
|
+
`environment`, and `number`. There is no `object` type. Developers attempting to pass
|
|
24
|
+
complex structured data (JSON objects, arrays) via a workflow_dispatch input often
|
|
25
|
+
try `type: object`, which causes an immediate YAML schema validation error and
|
|
26
|
+
prevents the workflow from running at all.
|
|
27
|
+
|
|
28
|
+
The valid type list:
|
|
29
|
+
- string — plain text value
|
|
30
|
+
- boolean — true/false checkbox in UI
|
|
31
|
+
- choice — dropdown from a fixed options list
|
|
32
|
+
- environment — GitHub environment picker
|
|
33
|
+
- number — numeric value (coerced to string at runtime)
|
|
34
|
+
|
|
35
|
+
There is no object, array, list, or json type for workflow_dispatch inputs.
|
|
36
|
+
The workflow file fails validation and does not appear as runnable in the
|
|
37
|
+
Actions UI.
|
|
38
|
+
fix: |
|
|
39
|
+
Use `type: string` and serialize the complex data as a JSON string. Parse it inside
|
|
40
|
+
the workflow using the `fromJSON()` expression function or `jq` in a run step.
|
|
41
|
+
fix_code:
|
|
42
|
+
- language: yaml
|
|
43
|
+
label: 'Pass complex data as a JSON string — use type: string, not type: object'
|
|
44
|
+
code: |
|
|
45
|
+
on:
|
|
46
|
+
workflow_dispatch:
|
|
47
|
+
inputs:
|
|
48
|
+
config:
|
|
49
|
+
type: string # NOT type: object
|
|
50
|
+
description: 'JSON config e.g. {"env":"prod","replicas":3}'
|
|
51
|
+
default: '{}'
|
|
52
|
+
required: false
|
|
53
|
+
|
|
54
|
+
jobs:
|
|
55
|
+
deploy:
|
|
56
|
+
runs-on: ubuntu-latest
|
|
57
|
+
steps:
|
|
58
|
+
- name: Parse config input
|
|
59
|
+
run: |
|
|
60
|
+
ENV=$(echo '${{ inputs.config }}' | jq -r .env)
|
|
61
|
+
REPLICAS=$(echo '${{ inputs.config }}' | jq -r .replicas)
|
|
62
|
+
echo "Deploying to $ENV with $REPLICAS replicas"
|
|
63
|
+
- language: yaml
|
|
64
|
+
label: 'Access nested fields with fromJSON() in expressions'
|
|
65
|
+
code: |
|
|
66
|
+
jobs:
|
|
67
|
+
deploy:
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
env:
|
|
70
|
+
ENV_NAME: ${{ fromJSON(inputs.config).env }}
|
|
71
|
+
steps:
|
|
72
|
+
- run: echo "Environment is $ENV_NAME"
|
|
73
|
+
prevention:
|
|
74
|
+
- 'Only use type: string, boolean, choice, environment, or number for workflow_dispatch inputs'
|
|
75
|
+
- 'For structured data, serialize as a JSON string and parse inside the job with jq or fromJSON()'
|
|
76
|
+
- 'Use actionlint to catch unsupported input types before pushing the workflow file'
|
|
77
|
+
- 'Document the expected JSON schema in the input description field so callers know the format'
|
|
78
|
+
docs:
|
|
79
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch'
|
|
80
|
+
label: 'GitHub Docs — workflow_dispatch inputs (valid types: string, boolean, choice, environment, number)'
|
|
81
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#fromjson'
|
|
82
|
+
label: 'GitHub Docs — fromJSON() expression function'
|
|
83
|
+
- url: 'https://stackoverflow.com/questions/76181396/github-actions-workflow-with-input-type-object-not-running'
|
|
84
|
+
label: 'Stack Overflow — workflow_dispatch with input type object not running'
|
package/package.json
CHANGED