@htekdev/actions-debugger 1.0.13 → 1.0.15

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 (54) hide show
  1. package/dist/db/search.js +3 -1
  2. package/dist/db/search.js.map +1 -1
  3. package/dist/tools/suggest-fix.d.ts.map +1 -1
  4. package/dist/tools/suggest-fix.js +5 -1
  5. package/dist/tools/suggest-fix.js.map +1 -1
  6. package/errors/caching-artifacts/cache-key-too-long.yml +93 -0
  7. package/errors/caching-artifacts/cache-path-not-exist-skipped.yml +152 -0
  8. package/errors/caching-artifacts/docker-buildx-gha-cache-capacity.yml +107 -0
  9. package/errors/caching-artifacts/setup-ruby-bundler-ephemeral-workdir-cache-miss.yml +147 -0
  10. package/errors/caching-artifacts/upload-artifact-v3-retirement-blocked.yml +123 -0
  11. package/errors/concurrency-timing/always-cleanup-5min-forced-kill.yml +140 -0
  12. package/errors/concurrency-timing/concurrency-group-env-context-undefined.yml +99 -0
  13. package/errors/concurrency-timing/required-check-pending-path-filter-skip.yml +160 -0
  14. package/errors/concurrency-timing/wait-timer-cancel-in-progress-starvation.yml +125 -0
  15. package/errors/known-unsolved/composite-action-step-timeout-minutes-ignored.yml +146 -0
  16. package/errors/known-unsolved/reusable-workflow-no-composite-action-call.yml +116 -0
  17. package/errors/known-unsolved/schedule-trigger-default-branch-only.yml +113 -0
  18. package/errors/known-unsolved/secrets-not-allowed-in-if-conditions.yml +149 -0
  19. package/errors/permissions-auth/dependabot-pr-secrets-unavailable.yml +133 -0
  20. package/errors/permissions-auth/fine-grained-pat-deployment-write-required.yml +146 -0
  21. package/errors/permissions-auth/github-app-installation-token-new-format.yml +124 -0
  22. package/errors/permissions-auth/github-packages-read-requires-packages-permission.yml +128 -0
  23. package/errors/permissions-auth/oidc-id-token-write-permission-missing.yml +169 -0
  24. package/errors/permissions-auth/permissions-empty-block-removes-contents-read.yml +97 -0
  25. package/errors/permissions-auth/reusable-workflow-permissions-not-inherited.yml +114 -0
  26. package/errors/runner-environment/az-powershell-14-to-15-breaking.yml +108 -0
  27. package/errors/runner-environment/checkout-windows-ebusy-lock.yml +124 -0
  28. package/errors/runner-environment/deprecated-action-version-auto-rejected.yml +89 -0
  29. package/errors/runner-environment/github-hosted-runner-disk-space-full.yml +85 -0
  30. package/errors/runner-environment/github-path-same-step-not-found.yml +114 -0
  31. package/errors/runner-environment/github-script-v6-octokit-rest-actions-not-function.yml +87 -0
  32. package/errors/runner-environment/macos-15-mono-nuget-removed.yml +151 -0
  33. package/errors/runner-environment/macos-15-xcode-simulator-sdk-policy.yml +141 -0
  34. package/errors/runner-environment/runner-oom-exit-code-137.yml +117 -0
  35. package/errors/runner-environment/setup-go-go123-telemetry-cache-failure.yml +92 -0
  36. package/errors/runner-environment/setup-java-distribution-required.yml +108 -0
  37. package/errors/runner-environment/ubuntu-2204-precached-docker-removed.yml +110 -0
  38. package/errors/runner-environment/windows-latest-d-drive-removed.yml +104 -0
  39. package/errors/runner-environment/windows-msvc-ltcg-mixed-image-versions.yml +112 -0
  40. package/errors/runner-environment/windows-vs2026-cuda-host-compiler-unsupported.yml +145 -0
  41. package/errors/silent-failures/app-store-ios26-sdk-required.yml +113 -0
  42. package/errors/silent-failures/event-commits-empty-on-workflow-dispatch.yml +110 -0
  43. package/errors/silent-failures/fetch-tags-depth-one-silent-no-op.yml +77 -0
  44. package/errors/silent-failures/github-env-multiline-value-truncated.yml +127 -0
  45. package/errors/silent-failures/github-sha-pr-merge-commit-not-head.yml +150 -0
  46. package/errors/silent-failures/job-output-masked-as-secret-empty.yml +147 -0
  47. package/errors/silent-failures/upload-artifact-permissions-stripped.yml +98 -0
  48. package/errors/triggers/pull-request-branches-filter-matches-base-not-head.yml +140 -0
  49. package/errors/triggers/push-event-fires-on-branch-delete.yml +129 -0
  50. package/errors/triggers/push-first-commit-before-sha-zeros.yml +160 -0
  51. package/errors/yaml-syntax/fromjson-empty-string-crash.yml +99 -0
  52. package/errors/yaml-syntax/if-bang-negation-yaml-tag.yml +145 -0
  53. package/errors/yaml-syntax/local-action-path-always-top-level.yml +142 -0
  54. package/package.json +1 -1
package/dist/db/search.js CHANGED
@@ -112,9 +112,11 @@ function matchEntry(entry, input) {
112
112
  }
113
113
  }
114
114
  // 3. Title keyword matching (lowest confidence)
115
+ // Require words > 5 chars to avoid false positives from common short words
116
+ // (e.g. "text", "that", "some", "runs", "jobs" appearing in unrelated inputs)
115
117
  const inputLower = input.toLowerCase();
116
118
  const titleWords = entry.title.toLowerCase().split(/\s+/);
117
- const matchingWords = titleWords.filter(w => w.length > 3 && inputLower.includes(w));
119
+ const matchingWords = titleWords.filter(w => w.length > 5 && inputLower.includes(w));
118
120
  if (matchingWords.length >= 2) {
119
121
  bestScore = Math.max(bestScore, 20 + matchingWords.length * 5);
120
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/db/search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-fix.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGhE;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,aAAa,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,UAAU,EAAE,CAUd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA8CjE"}
1
+ {"version":3,"file":"suggest-fix.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGhE;;GAEG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,aAAa,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,UAAU,EAAE,CAed;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CA8CjE"}
@@ -8,7 +8,11 @@ import { lookupByPattern, searchByKeyword } from "../db/search.js";
8
8
  export function suggestFix(db, errorContext, category) {
9
9
  // Try regex matching first
10
10
  let results = lookupByPattern(db, errorContext, 5);
11
- // If no regex matches, try keyword search
11
+ // Apply category filter if provided (pattern matching doesn't filter by category)
12
+ if (category) {
13
+ results = results.filter(r => r.entry.category === category);
14
+ }
15
+ // If no matches after filtering, fall back to keyword search with category filter
12
16
  if (results.length === 0) {
13
17
  results = searchByKeyword(db, errorContext, { category, maxResults: 5 });
14
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-fix.js","sourceRoot":"","sources":["../../src/tools/suggest-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAiB,EACjB,YAAoB,EACpB,QAAiB;IAEjB,2BAA2B;IAC3B,IAAI,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAEnD,0CAA0C;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,4CAA4C;YAC5C,EAAE;YACF,UAAU;YACV,2DAA2D;YAC3D,+DAA+D;YAC/D,mFAAmF;SACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG;QACZ,qBAAqB,IAAI,CAAC,KAAK,EAAE;QACjC,EAAE;QACF,iBAAiB,IAAI,CAAC,QAAQ,oBAAoB,IAAI,CAAC,QAAQ,EAAE;QACjE,EAAE;QACF,iBAAiB;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACtB,EAAE;QACF,UAAU;QACV,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;KAChB,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,4BAA4B,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"suggest-fix.js","sourceRoot":"","sources":["../../src/tools/suggest-fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,EAAiB,EACjB,YAAoB,EACpB,QAAiB;IAEjB,2BAA2B;IAC3B,IAAI,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAEnD,kFAAkF;IAClF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,kFAAkF;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAqB;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,4CAA4C;YAC5C,EAAE;YACF,UAAU;YACV,2DAA2D;YAC3D,+DAA+D;YAC/D,mFAAmF;SACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG;QACZ,qBAAqB,IAAI,CAAC,KAAK,EAAE;QACjC,EAAE;QACF,iBAAiB,IAAI,CAAC,QAAQ,oBAAoB,IAAI,CAAC,QAAQ,EAAE;QACjE,EAAE;QACF,iBAAiB;QACjB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACtB,EAAE;QACF,UAAU;QACV,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;KAChB,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,6BAA6B,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,4BAA4B,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,93 @@
1
+ id: caching-artifacts-015
2
+ title: "actions/cache Key Exceeds 512-Character Limit — Cache Action Fails"
3
+ category: caching-artifacts
4
+ severity: error
5
+ tags:
6
+ - actions/cache
7
+ - cache-key
8
+ - key-length
9
+ - 512-char
10
+ - restore
11
+ - save
12
+ patterns:
13
+ - regex: "Cache key is too long"
14
+ flags: "i"
15
+ - regex: "cache.*key.*exceed|key.*too long"
16
+ flags: "i"
17
+ error_messages:
18
+ - "Cache key is too long"
19
+ - "Error: Cache key is too long (max: 512 characters)"
20
+ root_cause: |
21
+ The `actions/cache` action enforces a maximum cache key length of **512 characters**.
22
+ When the `key:` or any `restore-keys:` entry exceeds this limit, the action fails
23
+ immediately with "Cache key is too long" — no cache is saved or restored.
24
+
25
+ This limit is hit most often when developers concatenate multiple dynamic values into
26
+ a single key without length management:
27
+ - Long branch names (`github.ref_name` on feature branches can be 60+ chars)
28
+ - Full commit SHAs (`github.sha` = 40 chars)
29
+ - `github.event_name` + `github.actor` + `github.run_id` (11+ chars) combined with a
30
+ long dependency hash
31
+ - `toJSON()` output of a context object embedded directly into the key
32
+ - Monorepo setups that include multiple file paths in a single hashFiles() call with
33
+ deeply nested directory structures
34
+
35
+ The 512-character limit applies per key entry, including each `restore-keys` line.
36
+ Keys that would cause the action to fail entirely, leaving the job without any cache.
37
+
38
+ Source: GitHub Docs — actions/cache usage limits
39
+ fix: |
40
+ Shorten the cache key to stay under 512 characters. The primary strategies are:
41
+
42
+ 1. **Use `hashFiles()` for dependency content** — hashing a lockfile produces a
43
+ consistent 64-character SHA256 output regardless of the file's contents.
44
+ 2. **Remove redundant dynamic parts** — `github.run_id` is almost never appropriate
45
+ in a cache key (it changes every run, defeating cache sharing entirely).
46
+ 3. **Truncate long branch names** — use `github.ref_name` only if needed, or hash it.
47
+ 4. **Avoid embedding JSON strings** — never embed `toJSON()` outputs directly in keys.
48
+ 5. **Use `restore-keys` for partial matching** instead of encoding multiple variants
49
+ into one long key.
50
+ fix_code:
51
+ - language: yaml
52
+ label: "Broken — key too long from excessive concatenation"
53
+ code: |
54
+ # ❌ BROKEN: Key may exceed 512 chars with long branch names + run context
55
+ - uses: actions/cache@v4
56
+ with:
57
+ path: ~/.npm
58
+ key: ${{ runner.os }}-${{ github.workflow }}-${{ github.ref }}-${{ github.sha }}-${{ github.run_id }}-${{ hashFiles('**/package-lock.json', '**/yarn.lock', '**/pnpm-lock.yaml', 'packages/*/package-lock.json') }}
59
+ - language: yaml
60
+ label: "Fixed — concise key using OS + short context + lockfile hash"
61
+ code: |
62
+ # ✅ FIXED: OS prefix + workflow + lockfile hash — short and deterministic
63
+ - uses: actions/cache@v4
64
+ with:
65
+ path: ~/.npm
66
+ key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
67
+ restore-keys: |
68
+ ${{ runner.os }}-npm-
69
+ - language: yaml
70
+ label: "Fixed — long branch names: hash github.ref_name if needed"
71
+ code: |
72
+ # ✅ FIXED: When you need branch-scoped caches, hash the ref instead of embedding it
73
+ - name: Compute short ref hash
74
+ id: ref-hash
75
+ run: echo "value=$(echo '${{ github.ref }}' | sha256sum | cut -c1-16)" >> $GITHUB_OUTPUT
76
+
77
+ - uses: actions/cache@v4
78
+ with:
79
+ path: .build-cache
80
+ key: build-${{ runner.os }}-${{ steps.ref-hash.outputs.value }}-${{ hashFiles('**/go.sum') }}
81
+ restore-keys: |
82
+ build-${{ runner.os }}-
83
+ prevention:
84
+ - "Keep cache keys under 400 characters to leave comfortable headroom below the 512-char limit."
85
+ - "Never include `github.run_id` or `github.run_number` in cache keys — these values change every run and prevent cache hits entirely."
86
+ - "Prefer `hashFiles()` over embedding actual file content or long path lists into keys — the hash output is always 64 chars."
87
+ - "When branch-scoped caching is needed, hash `github.ref` to a short prefix rather than embedding the full ref string."
88
+ - "Test key length in a debug step: `run: echo \"Key length: $(echo -n '${{ KEY_EXPRESSION }}' | wc -c)\"`"
89
+ docs:
90
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache"
91
+ label: "GitHub Docs: Cache restrictions and usage limits (512-char key limit)"
92
+ - url: "https://github.com/actions/cache#inputs"
93
+ label: "actions/cache inputs — key and restore-keys documentation"
@@ -0,0 +1,152 @@
1
+ id: caching-artifacts-017
2
+ title: "actions/cache Path Validation Error — Specified Path Does Not Exist, Cache Skipped"
3
+ category: caching-artifacts
4
+ severity: warning
5
+ tags:
6
+ - cache
7
+ - path
8
+ - path-validation
9
+ - cache-miss
10
+ - warning
11
+ - actions-cache
12
+ patterns:
13
+ - regex: "Path Validation Error.*Path.*specified.*action.*caching.*do.*not exist"
14
+ flags: "i"
15
+ - regex: "Warning.*Path.*caching.*do.*not exist.*no cache.*saved"
16
+ flags: "i"
17
+ - regex: "no cache.*being saved.*path.*not exist"
18
+ flags: "i"
19
+ error_messages:
20
+ - "Warning: Path Validation Error: Path(s) specified in the action for caching do(es) not exist, hence no cache is being saved."
21
+ root_cause: |
22
+ `actions/cache` validates that all paths listed under the `path:` key actually
23
+ exist on disk **at the time the `Post cache` step runs** (the post-job cleanup
24
+ step that performs the cache save). If any path does not exist, the action logs a
25
+ warning and **silently skips the cache save entirely** — no cache entry is written
26
+ even if other listed paths do exist.
27
+
28
+ **Common causes:**
29
+
30
+ 1. **Conditional install step** — the path is only created when a specific install
31
+ step runs (e.g., `npm ci` or `pip install`), but the cache step's `key` matched
32
+ a previous cache, so the install step was skipped. The path therefore doesn't
33
+ exist when the post step runs.
34
+
35
+ 2. **Wrong working directory** — the `path:` is relative (e.g., `node_modules`)
36
+ but the working directory for the run step differs from where `actions/cache`
37
+ expects to find it.
38
+
39
+ 3. **Build output cached too early** — the `path:` references build output that
40
+ hasn't been generated yet (e.g., caching `dist/` before the build step runs).
41
+
42
+ 4. **Typo in path** — a simple typo (e.g., `node-modules` vs `node_modules`) means
43
+ the directory is never created under that name.
44
+
45
+ 5. **Cross-OS path format** — Windows backslash vs Linux forward slash mismatch
46
+ when the same workflow runs on multiple OS targets.
47
+
48
+ The action exits 0 (no failure), making this a **silent failure** — the workflow
49
+ appears to succeed, but the cache is never saved. Subsequent runs always experience
50
+ a full cache miss, causing slower CI without any visible error.
51
+
52
+ Source: mkdocs-material issue#7990, actions/cache documentation
53
+ fix: |
54
+ 1. **Verify the path exists before relying on it** — add a diagnostic step that
55
+ lists the directory structure before the cache save to confirm paths are present.
56
+
57
+ 2. **Always run the install step** — do not skip install steps based on
58
+ `cache-hit == 'true'`. Instead, use `cache-hit` to skip the install when the
59
+ restore succeeded, but still let the cache post step validate paths:
60
+
61
+ ```yaml
62
+ - uses: actions/cache@v4
63
+ id: cache-node
64
+ with:
65
+ path: node_modules
66
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
67
+
68
+ - run: npm ci
69
+ if: steps.cache-node.outputs.cache-hit != 'true'
70
+ ```
71
+
72
+ 3. **Use `setup-node` with caching** — instead of managing cache manually,
73
+ `actions/setup-node` with `cache: 'npm'` handles path validation internally.
74
+
75
+ 4. **Check for path typos** — confirm the literal path string matches exactly
76
+ what is created on disk (case-sensitive on Linux).
77
+ fix_code:
78
+ - language: yaml
79
+ label: "Correct pattern — run install only on cache miss, cache path always present"
80
+ code: |
81
+ jobs:
82
+ build:
83
+ runs-on: ubuntu-latest
84
+ steps:
85
+ - uses: actions/checkout@v4
86
+
87
+ - uses: actions/cache@v4
88
+ id: npm-cache
89
+ with:
90
+ path: ~/.npm # Cache the npm cache dir — always exists
91
+ key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
92
+ restore-keys: |
93
+ ${{ runner.os }}-npm-
94
+
95
+ # Always run npm ci so node_modules always exists for the cache post step
96
+ - run: npm ci
97
+
98
+ # ❌ Wrong — skipping npm ci on cache hit means node_modules may not exist
99
+ # - run: npm ci
100
+ # if: steps.npm-cache.outputs.cache-hit != 'true'
101
+ - language: yaml
102
+ label: "Use setup-node built-in cache instead of manual actions/cache"
103
+ code: |
104
+ jobs:
105
+ build:
106
+ runs-on: ubuntu-latest
107
+ steps:
108
+ - uses: actions/checkout@v4
109
+
110
+ # setup-node handles path validation and cache lifecycle correctly
111
+ - uses: actions/setup-node@v4
112
+ with:
113
+ node-version: '20'
114
+ cache: 'npm' # Manages npm cache path validation internally
115
+
116
+ - run: npm ci
117
+ - language: yaml
118
+ label: "Debug step — print path existence before cache save"
119
+ code: |
120
+ jobs:
121
+ build:
122
+ runs-on: ubuntu-latest
123
+ steps:
124
+ - uses: actions/checkout@v4
125
+
126
+ - uses: actions/cache@v4
127
+ with:
128
+ path: |
129
+ ~/.cache/pip
130
+ .venv
131
+ key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
132
+
133
+ - run: pip install -r requirements.txt --target .venv
134
+
135
+ # Diagnostic — verify paths exist before cache post step runs
136
+ - name: Verify cache paths
137
+ run: |
138
+ echo "~/.cache/pip exists: $(test -d ~/.cache/pip && echo YES || echo NO)"
139
+ echo ".venv exists: $(test -d .venv && echo YES || echo NO)"
140
+ prevention:
141
+ - "Always ensure every path listed under `actions/cache path:` is unconditionally created during the job — do not gate install steps on cache-hit in a way that leaves paths missing."
142
+ - "Prefer `setup-*` actions with their built-in `cache:` input over raw `actions/cache` — they manage path validation and lifecycle correctly."
143
+ - "Add a diagnostic step after your install/build steps to verify that each cached path exists before relying on the cache post step."
144
+ - "Use absolute paths (e.g., `~/.npm`, `~/.cache/pip`) rather than relative paths when caching language package caches."
145
+ - "Enable `ACTIONS_RUNNER_DEBUG: true` in repository secrets to get verbose cache-step output that reveals path validation details."
146
+ docs:
147
+ - url: "https://github.com/actions/cache/blob/main/README.md"
148
+ label: "actions/cache README — path and key documentation"
149
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows"
150
+ label: "GitHub Docs: Caching dependencies to speed up workflows"
151
+ - url: "https://github.com/squidfunk/mkdocs-material/issues/7990"
152
+ label: "mkdocs-material#7990 — Path Validation Error real-world example"
@@ -0,0 +1,107 @@
1
+ id: caching-artifacts-019
2
+ title: "Docker BuildKit type=gha cache silently stops working when repo cache is full"
3
+ category: caching-artifacts
4
+ severity: silent-failure
5
+ tags:
6
+ - docker
7
+ - buildkit
8
+ - buildx
9
+ - cache
10
+ - gha-cache
11
+ - type-gha
12
+ patterns:
13
+ - regex: "cache export feature is currently not supported"
14
+ flags: "i"
15
+ - regex: "failed to fetch remote cache"
16
+ flags: "i"
17
+ - regex: "importing cache manifest from gha"
18
+ flags: "i"
19
+ - regex: "exporting cache.*SKIPPED"
20
+ flags: "i"
21
+ error_messages:
22
+ - "WARNING: cache export feature is currently not supported for docker driver"
23
+ - "#0 importing cache manifest from gha"
24
+ - "failed to fetch remote cache: importing cache manifest: not found"
25
+ - "WARNING: failed to get cache: httpReadSeeker: failed open: unexpected status code 410 Gone"
26
+ root_cause: |
27
+ Docker BuildKit supports storing build layer cache directly in GitHub Actions
28
+ cache (type=gha) via docker/build-push-action. This cache backend shares the
29
+ same 10 GB per-repository cache limit enforced by actions/cache.
30
+
31
+ When large images or many active branches push their layer caches, the 10 GB
32
+ limit is reached. GitHub silently evicts the oldest cache entries using LRU
33
+ eviction. On the next run the build starts from scratch with no layers cached,
34
+ but the workflow still reports success — the only symptom is a much slower
35
+ build with no warning.
36
+
37
+ Additional silent failure mode: using the default docker driver (not
38
+ docker-container) causes "cache export feature is currently not supported"
39
+ warnings that are easy to miss. The type=gha backend requires the
40
+ docker-container (or docker-buildx) driver and the containerd image store.
41
+
42
+ Per-key limits: individual cache entries exceeding ~5 GB may fail to write
43
+ completely, resulting in partial caches that are never reusable on restore.
44
+ fix: |
45
+ Use mode=min so that only the final image layer is cached rather than all
46
+ intermediate build stages. This dramatically reduces cache pressure.
47
+
48
+ For large production images that need full layer caching, use
49
+ cache-to: type=registry pointing to GHCR (free for public repos) to bypass
50
+ the 10 GB GitHub Actions cache limit entirely.
51
+
52
+ Always configure setup-buildx-action before build-push-action to ensure
53
+ the docker-container driver is active and type=gha export is supported.
54
+ fix_code:
55
+ - language: yaml
56
+ label: "Use mode=min and ensure docker-container driver is configured"
57
+ code: |
58
+ jobs:
59
+ build:
60
+ runs-on: ubuntu-latest
61
+ steps:
62
+ - uses: actions/checkout@v4
63
+
64
+ - name: Set up Docker Buildx
65
+ uses: docker/setup-buildx-action@v3
66
+ # docker-container driver is the default for setup-buildx-action
67
+ # Required for type=gha cache export to work at all
68
+
69
+ - name: Build and push
70
+ uses: docker/build-push-action@v6
71
+ with:
72
+ push: true
73
+ tags: ghcr.io/${{ github.repository }}:latest
74
+ cache-from: type=gha
75
+ cache-to: type=gha,mode=min # min = final layer only, not all stages
76
+ - language: yaml
77
+ label: "Use GHCR registry cache to bypass the 10 GB GitHub Actions cache limit"
78
+ code: |
79
+ - name: Log in to GHCR
80
+ uses: docker/login-action@v3
81
+ with:
82
+ registry: ghcr.io
83
+ username: ${{ github.actor }}
84
+ password: ${{ secrets.GITHUB_TOKEN }}
85
+
86
+ - name: Build and push with registry cache
87
+ uses: docker/build-push-action@v6
88
+ with:
89
+ push: true
90
+ tags: ghcr.io/${{ github.repository }}:latest
91
+ cache-from: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache
92
+ cache-to: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache,mode=max
93
+ prevention:
94
+ - "Always add docker/setup-buildx-action before docker/build-push-action to enable type=gha"
95
+ - "Prefer mode=min for type=gha to minimize cache footprint per build"
96
+ - "Monitor cache usage in Settings > Actions > Caches — eviction is silent until builds slow down"
97
+ - "Use scope parameter to separate caches per branch: cache-to: type=gha,scope=${{ github.ref_name }},mode=min"
98
+ - "For large production images prefer type=registry (GHCR) over type=gha to avoid the 10 GB cap"
99
+ docs:
100
+ - url: "https://docs.docker.com/build/ci/github-actions/cache/#github-cache"
101
+ label: "Docker Docs — GitHub Actions cache backend for BuildKit"
102
+ - url: "https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy"
103
+ label: "GitHub Docs — Cache usage limits and eviction policy (10 GB limit)"
104
+ - url: "https://github.com/docker/build-push-action/issues/818"
105
+ label: "docker/build-push-action#818 — type=gha cache eviction behavior"
106
+ - url: "https://github.com/docker/setup-buildx-action"
107
+ label: "docker/setup-buildx-action — Required to enable BuildKit cache backends"
@@ -0,0 +1,147 @@
1
+ id: caching-artifacts-018
2
+ title: "setup-ruby Bundler Cache Always Misses on Ephemeral Self-Hosted Runners Due to Workdir in Cache Key"
3
+ category: caching-artifacts
4
+ severity: silent-failure
5
+ tags:
6
+ - ruby
7
+ - setup-ruby
8
+ - bundler
9
+ - cache
10
+ - self-hosted
11
+ - ephemeral
12
+ - cache-miss
13
+ - cache-key
14
+ patterns:
15
+ - regex: "Cache not found for.*setup-ruby-bundler-cache.*wd-.*[0-9]{8,}"
16
+ flags: "i"
17
+ - regex: "setup-ruby-bundler-cache.*wd-\\/.*[a-f0-9]{8,}.*Gemfile\\.lock"
18
+ flags: "i"
19
+ - regex: "No cache found.*setup-ruby-bundler.*workdir.*ephemeral"
20
+ flags: "i"
21
+ - regex: "Cache miss.*bundler.*setup-ruby.*self-hosted"
22
+ flags: "i"
23
+ error_messages:
24
+ - "Cache not found for input keys: setup-ruby-bundler-cache-v6-ubuntu-22.04-x64-ruby-3.3.6-wd-/codebuild/output/src1813367680/src/actions-runner/_work/myapp/myapp-with--without--only--Gemfile.lock-3f96ad38..."
25
+ - "No cache found for key: setup-ruby-bundler-cache-v6-..."
26
+ root_cause: |
27
+ `ruby/setup-ruby` includes the absolute working directory path (`wd-<path>`) as a
28
+ component of the Bundler cache key. The full cache key format is:
29
+
30
+ setup-ruby-bundler-cache-v{VERSION}-{OS}-{ARCH}-ruby-{RUBY_VERSION}-wd-{WORKDIR}-...{GEMFILE_HASH}
31
+
32
+ On GitHub-hosted runners, the working directory is deterministic per run
33
+ (`/home/runner/work/{repo}/{repo}` on Linux), so the cache key is stable across runs
34
+ and the cache is reused correctly.
35
+
36
+ On **ephemeral self-hosted runners** (e.g., AWS CodeBuild, GitLab CI runners with
37
+ unique workspace paths, or any runner that generates a unique working directory path
38
+ per run for isolation), the `wd-` component changes with each run. This makes every
39
+ cache lookup a miss — the Bundler gems are reinstalled from scratch on every run,
40
+ completely defeating the purpose of caching.
41
+
42
+ This affects:
43
+ - AWS CodeBuild with GitHub Actions runners (CodeBuild generates unique src paths per build)
44
+ - Kubernetes-based ephemeral runners where the pod workspace path includes a job ID
45
+ - Any custom runner setup that includes a timestamp or job ID in the workspace path
46
+
47
+ The issue is open (ruby/setup-ruby#904, April 2026) and has no upstream fix yet as of
48
+ mid-2026. The workdir was included in the cache key to allow multiple Ruby projects to
49
+ have separate caches within the same repository, but it breaks ephemeral runners as a
50
+ side effect.
51
+
52
+ Note: This is a **silent failure** — no error is thrown; the workflow succeeds but Bundler
53
+ installs all gems on every run, causing slow CI with no visible warning about cache
54
+ effectiveness.
55
+ fix: |
56
+ **Workaround 1 — Disable setup-ruby's built-in bundler cache, use actions/cache manually**:
57
+ Set `bundler-cache: false` in setup-ruby and manage the Bundler cache yourself with
58
+ `actions/cache`, using only the `BUNDLE_PATH` and `Gemfile.lock` hash as the key
59
+ (no workdir component). This is the most reliable fix for ephemeral runners.
60
+
61
+ **Workaround 2 — Normalize the working directory** (if your runner supports it):
62
+ Configure your runner to use a fixed, predictable working directory path instead of
63
+ a unique-per-job path. This makes the setup-ruby cache key stable.
64
+
65
+ **Workaround 3 — Cache the Ruby gems directory directly**:
66
+ Cache `~/.bundle` or the Bundler install path rather than the per-project `vendor/bundle`,
67
+ since the home directory path is typically stable even on ephemeral runners.
68
+ fix_code:
69
+ - language: yaml
70
+ label: "Disable setup-ruby cache and use actions/cache with stable key"
71
+ code: |
72
+ jobs:
73
+ test:
74
+ runs-on: self-hosted # ephemeral runner
75
+ steps:
76
+ - uses: actions/checkout@v4
77
+
78
+ - uses: ruby/setup-ruby@v1
79
+ with:
80
+ ruby-version: '3.3'
81
+ bundler-cache: false # Disable built-in cache (broken on ephemeral runners)
82
+
83
+ # Cache gems using a workdir-independent key
84
+ - uses: actions/cache@v4
85
+ id: bundle-cache
86
+ with:
87
+ path: ~/.bundle/cache
88
+ key: ${{ runner.os }}-bundle-${{ hashFiles('**/Gemfile.lock') }}
89
+ restore-keys: |
90
+ ${{ runner.os }}-bundle-
91
+
92
+ - name: Install gems
93
+ run: bundle install --path ~/.bundle/cache
94
+ if: steps.bundle-cache.outputs.cache-hit != 'true'
95
+
96
+ - name: Bundle check
97
+ run: bundle check || bundle install
98
+ - language: yaml
99
+ label: "Cache vendor/bundle with BUNDLE_PATH and stable key (no workdir)"
100
+ code: |
101
+ jobs:
102
+ test:
103
+ runs-on: self-hosted
104
+ steps:
105
+ - uses: actions/checkout@v4
106
+
107
+ - uses: ruby/setup-ruby@v1
108
+ with:
109
+ ruby-version: '3.3'
110
+ bundler-cache: false
111
+
112
+ - uses: actions/cache@v4
113
+ with:
114
+ path: vendor/bundle
115
+ key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
116
+ restore-keys: |
117
+ ${{ runner.os }}-gems-
118
+
119
+ - name: Install gems
120
+ run: |
121
+ bundle config path vendor/bundle
122
+ bundle install --jobs 4 --retry 3
123
+ - language: yaml
124
+ label: "GitHub-hosted runner — built-in cache works fine (no workaround needed)"
125
+ code: |
126
+ jobs:
127
+ test:
128
+ runs-on: ubuntu-latest # GitHub-hosted: stable workdir, cache works
129
+ steps:
130
+ - uses: actions/checkout@v4
131
+
132
+ - uses: ruby/setup-ruby@v1
133
+ with:
134
+ ruby-version: '3.3'
135
+ bundler-cache: true # Works correctly on GitHub-hosted runners
136
+ prevention:
137
+ - "Always use `bundler-cache: false` with `ruby/setup-ruby` on ephemeral self-hosted runners (CodeBuild, ephemeral Kubernetes runners) and manage caching manually."
138
+ - "Verify cache effectiveness by checking the `cache-hit` output and monitoring job duration across runs — a stable cache hit means no Bundler reinstall."
139
+ - "Use workdir-independent cache keys: `${{ runner.os }}-bundle-${{ hashFiles('**/Gemfile.lock') }}` instead of paths that include dynamic segments."
140
+ - "Track ruby/setup-ruby#904 for an upstream fix that makes the cache key workdir-independent by default."
141
+ docs:
142
+ - url: "https://github.com/ruby/setup-ruby/issues/904"
143
+ label: "ruby/setup-ruby#904: Bundler cache not working due to ephemeral workdir (open)"
144
+ - url: "https://github.com/ruby/setup-ruby#caching-bundle-install-automatically"
145
+ label: "setup-ruby README: Caching bundle install automatically"
146
+ - url: "https://github.com/actions/cache/blob/main/README.md"
147
+ label: "actions/cache README: manual caching approach"