@htekdev/actions-debugger 1.0.0 → 1.0.2
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/LICENSE +21 -21
- package/README.md +108 -108
- package/errors/_schema.json +89 -89
- package/errors/caching-artifacts/artifact-storage-quota-exceeded.yml +118 -0
- package/errors/caching-artifacts/cache-miss.yml +56 -56
- package/errors/caching-artifacts/cache-save-cancelled-job.yml +82 -0
- package/errors/caching-artifacts/cache-v3-to-v4-breaking-changes.yml +95 -0
- package/errors/caching-artifacts/cross-repo-artifacts-not-supported.yml +102 -0
- package/errors/caching-artifacts/upload-artifact-no-files-found.yml +92 -0
- package/errors/caching-artifacts/upload-artifact-v4-breaking.yml +67 -67
- package/errors/concurrency-timing/cancel-in-progress-deploy-drops.yml +97 -0
- package/errors/concurrency-timing/jobs-cancelled-unexpectedly.yml +60 -60
- package/errors/concurrency-timing/skipped-needs-cascade.yml +103 -0
- package/errors/concurrency-timing/workflow-run-conclusion-unchecked.yml +100 -0
- package/errors/known-unsolved/composite-input-env-vars-missing.yml +91 -0
- package/errors/known-unsolved/composite-nested-outputs-null.yml +101 -0
- package/errors/known-unsolved/no-dynamic-secret-access.yml +111 -0
- package/errors/known-unsolved/no-step-level-rerun.yml +94 -0
- package/errors/known-unsolved/no-step-retry.yml +53 -53
- package/errors/known-unsolved/workflow-rerun-limit.yml +101 -0
- package/errors/permissions-auth/checkout-submodule-private-auth.yml +91 -0
- package/errors/permissions-auth/fork-pr-secrets-unavailable.yml +97 -0
- package/errors/permissions-auth/gcp-oidc-workload-identity-misconfigured.yml +130 -0
- package/errors/permissions-auth/github-token-403.yml +64 -64
- package/errors/permissions-auth/github-token-protected-branch-push.yml +109 -0
- package/errors/permissions-auth/oidc-aws-failure.yml +85 -85
- package/errors/permissions-auth/oidc-azure-subject-mismatch.yml +91 -0
- package/errors/runner-environment/disk-space.yml +57 -57
- package/errors/runner-environment/docker-buildx-not-setup.yml +106 -0
- package/errors/runner-environment/macos-homebrew-path.yml +90 -0
- package/errors/runner-environment/node-runtime-deprecation.yml +56 -56
- package/errors/runner-environment/node20-to-node24-migration.yml +118 -0
- package/errors/runner-environment/npm-ci-lockfile-mismatch.yml +112 -0
- package/errors/runner-environment/self-hosted-stale-toolcache.yml +73 -0
- package/errors/runner-environment/setup-node-version-file-missing.yml +105 -0
- package/errors/runner-environment/windows-execution-policy.yml +83 -0
- package/errors/silent-failures/add-mask-no-retroactive-masking.yml +75 -0
- package/errors/silent-failures/composite-boolean-inputs-as-strings.yml +110 -0
- package/errors/silent-failures/conditional-output-null-downstream.yml +82 -0
- package/errors/silent-failures/continue-on-error-masks-failure.yml +86 -0
- package/errors/silent-failures/github-token-no-trigger.yml +57 -57
- package/errors/silent-failures/reusable-workflow-env-secrets-empty.yml +90 -0
- package/errors/silent-failures/scheduled-workflow-disabled.yml +59 -59
- package/errors/silent-failures/sparse-checkout-sticky-cone-mode.yml +120 -0
- package/errors/triggers/cron-schedule-late.yml +59 -59
- package/errors/triggers/pull-request-target-rce-risk.yml +117 -0
- package/errors/triggers/workflow-not-triggering.yml +60 -60
- package/errors/triggers/workflow-run-default-branch-requirement.yml +78 -0
- package/errors/yaml-syntax/anchors-not-supported.yml +95 -0
- package/errors/yaml-syntax/dynamic-matrix-fromjson-failure.yml +99 -0
- package/errors/yaml-syntax/if-always-true.yml +52 -52
- package/errors/yaml-syntax/missing-expression-wrapper.yml +67 -0
- package/errors/yaml-syntax/needs-indirect-outputs.yml +91 -0
- package/errors/yaml-syntax/reusable-workflow-missing-output-declaration.yml +140 -0
- package/errors/yaml-syntax/secrets-in-if.yml +55 -55
- package/errors/yaml-syntax/unexpected-yaml-key.yml +69 -69
- package/errors/yaml-syntax/working-directory-ignored-on-uses.yml +66 -0
- package/package.json +70 -67
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Hector Flores (htekdev)
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hector Flores (htekdev)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
# @htekdev/actions-debugger
|
|
2
|
-
|
|
3
|
-
[](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml)
|
|
4
|
-
[](https://www.npmjs.com/package/@htekdev/actions-debugger)
|
|
5
|
-
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
|
|
7
|
-
> 65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.
|
|
8
|
-
|
|
9
|
-
**Stop debugging the same CI failures over and over.** This repo packages 65+ real-world GitHub Actions error scenarios — with regex-matchable patterns, root causes, and copy-paste fixes — into formats that both humans and AI agents can consume.
|
|
10
|
-
|
|
11
|
-
## What's Inside
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
errors/ → Structured YAML error database (65+ entries)
|
|
15
|
-
src/ → MCP server (TypeScript + @modelcontextprotocol/sdk)
|
|
16
|
-
.github/skills/ → Copilot CLI skills for CI debugging
|
|
17
|
-
.github/agents/ → Copilot agent definition
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Quick Start
|
|
21
|
-
|
|
22
|
-
### As an MCP Server (Claude Desktop, Copilot CLI, Cursor, etc.)
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
npx @htekdev/actions-debugger
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Add to your MCP client config:
|
|
29
|
-
|
|
30
|
-
```json
|
|
31
|
-
{
|
|
32
|
-
"mcpServers": {
|
|
33
|
-
"actions-debugger": {
|
|
34
|
-
"command": "npx",
|
|
35
|
-
"args": ["@htekdev/actions-debugger"]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**Client config locations:**
|
|
42
|
-
- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
|
|
43
|
-
- **Cursor**: `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global)
|
|
44
|
-
- **VS Code (Copilot Chat)**: `.vscode/mcp.json`
|
|
45
|
-
- **Copilot CLI**: `.github/mcp.json` (repo-level)
|
|
46
|
-
- **Windsurf**: `~/.codeium/windsurf/mcp_config.json`
|
|
47
|
-
|
|
48
|
-
### As a Copilot CLI Skill (No MCP Required)
|
|
49
|
-
|
|
50
|
-
Copy `.github/skills/actions-debugging/SKILL.md` to your repo's `.github/skills/` directory. Reference it in your agent:
|
|
51
|
-
|
|
52
|
-
```markdown
|
|
53
|
-
> **Skill reference:** For CI debugging, use the `actions-debugging` skill.
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Programmatic (npm Package)
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
import { loadErrorDatabase, lookupError, diagnoseWorkflow } from "@htekdev/actions-debugger";
|
|
60
|
-
|
|
61
|
-
const db = await loadErrorDatabase();
|
|
62
|
-
|
|
63
|
-
// Lookup by error message
|
|
64
|
-
const matches = lookupError(db, "Permission to org/repo.git denied");
|
|
65
|
-
console.log(matches[0].fix);
|
|
66
|
-
|
|
67
|
-
// Analyze a workflow
|
|
68
|
-
const issues = diagnoseWorkflow(db, workflowYamlString);
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## MCP Tools
|
|
72
|
-
|
|
73
|
-
| Tool | Description |
|
|
74
|
-
|------|-------------|
|
|
75
|
-
| `lookup_error` | Match an error message against 65+ known issues |
|
|
76
|
-
| `diagnose_workflow` | Static analysis of workflow YAML for common mistakes |
|
|
77
|
-
| `suggest_fix` | Contextual fix suggestions from error context |
|
|
78
|
-
| `search_errors` | Full-text search by keyword, category, severity |
|
|
79
|
-
| `list_categories` | Browse error categories with counts |
|
|
80
|
-
|
|
81
|
-
## Error Categories
|
|
82
|
-
|
|
83
|
-
| Category | Description |
|
|
84
|
-
|----------|-------------|
|
|
85
|
-
| `yaml-syntax` | YAML validation, key typos, expression errors |
|
|
86
|
-
| `silent-failures` | No error shown, but wrong behavior |
|
|
87
|
-
| `runner-environment` | Runner issues, disk space, Docker, PATH |
|
|
88
|
-
| `permissions-auth` | GITHUB_TOKEN, OIDC, secrets, 403s |
|
|
89
|
-
| `caching-artifacts` | Cache misses, artifact v4 changes, corruption |
|
|
90
|
-
| `triggers` | Workflow not running, cron issues, dispatch |
|
|
91
|
-
| `concurrency-timing` | Job cancellation, matrix, timeouts |
|
|
92
|
-
| `known-unsolved` | Platform limitations with no fix |
|
|
93
|
-
|
|
94
|
-
## Contributing
|
|
95
|
-
|
|
96
|
-
See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for how to add new error entries. It's easy:
|
|
97
|
-
|
|
98
|
-
1. Create a YAML file in the appropriate `errors/{category}/` directory
|
|
99
|
-
2. Follow the schema in `errors/_schema.json`
|
|
100
|
-
3. Open a PR — CI validates your entry automatically
|
|
101
|
-
|
|
102
|
-
## Source
|
|
103
|
-
|
|
104
|
-
All error scenarios sourced from: **[The Definitive GitHub Actions Debugging Guide](https://htek.dev/articles/github-actions-debugging-guide)**
|
|
105
|
-
|
|
106
|
-
## License
|
|
107
|
-
|
|
108
|
-
MIT — [Hector Flores](https://htek.dev) (htekdev)
|
|
1
|
+
# @htekdev/actions-debugger
|
|
2
|
+
|
|
3
|
+
[](https://github.com/htekdev/actions-debugger/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@htekdev/actions-debugger)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
> 65+ real GitHub Actions errors, queryable by agents. MCP server + Copilot skills + error database.
|
|
8
|
+
|
|
9
|
+
**Stop debugging the same CI failures over and over.** This repo packages 65+ real-world GitHub Actions error scenarios — with regex-matchable patterns, root causes, and copy-paste fixes — into formats that both humans and AI agents can consume.
|
|
10
|
+
|
|
11
|
+
## What's Inside
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
errors/ → Structured YAML error database (65+ entries)
|
|
15
|
+
src/ → MCP server (TypeScript + @modelcontextprotocol/sdk)
|
|
16
|
+
.github/skills/ → Copilot CLI skills for CI debugging
|
|
17
|
+
.github/agents/ → Copilot agent definition
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
### As an MCP Server (Claude Desktop, Copilot CLI, Cursor, etc.)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx @htekdev/actions-debugger
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Add to your MCP client config:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"actions-debugger": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["@htekdev/actions-debugger"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Client config locations:**
|
|
42
|
+
- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) / `%APPDATA%\Claude\claude_desktop_config.json` (Windows)
|
|
43
|
+
- **Cursor**: `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global)
|
|
44
|
+
- **VS Code (Copilot Chat)**: `.vscode/mcp.json`
|
|
45
|
+
- **Copilot CLI**: `.github/mcp.json` (repo-level)
|
|
46
|
+
- **Windsurf**: `~/.codeium/windsurf/mcp_config.json`
|
|
47
|
+
|
|
48
|
+
### As a Copilot CLI Skill (No MCP Required)
|
|
49
|
+
|
|
50
|
+
Copy `.github/skills/actions-debugging/SKILL.md` to your repo's `.github/skills/` directory. Reference it in your agent:
|
|
51
|
+
|
|
52
|
+
```markdown
|
|
53
|
+
> **Skill reference:** For CI debugging, use the `actions-debugging` skill.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Programmatic (npm Package)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { loadErrorDatabase, lookupError, diagnoseWorkflow } from "@htekdev/actions-debugger";
|
|
60
|
+
|
|
61
|
+
const db = await loadErrorDatabase();
|
|
62
|
+
|
|
63
|
+
// Lookup by error message
|
|
64
|
+
const matches = lookupError(db, "Permission to org/repo.git denied");
|
|
65
|
+
console.log(matches[0].fix);
|
|
66
|
+
|
|
67
|
+
// Analyze a workflow
|
|
68
|
+
const issues = diagnoseWorkflow(db, workflowYamlString);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## MCP Tools
|
|
72
|
+
|
|
73
|
+
| Tool | Description |
|
|
74
|
+
|------|-------------|
|
|
75
|
+
| `lookup_error` | Match an error message against 65+ known issues |
|
|
76
|
+
| `diagnose_workflow` | Static analysis of workflow YAML for common mistakes |
|
|
77
|
+
| `suggest_fix` | Contextual fix suggestions from error context |
|
|
78
|
+
| `search_errors` | Full-text search by keyword, category, severity |
|
|
79
|
+
| `list_categories` | Browse error categories with counts |
|
|
80
|
+
|
|
81
|
+
## Error Categories
|
|
82
|
+
|
|
83
|
+
| Category | Description |
|
|
84
|
+
|----------|-------------|
|
|
85
|
+
| `yaml-syntax` | YAML validation, key typos, expression errors |
|
|
86
|
+
| `silent-failures` | No error shown, but wrong behavior |
|
|
87
|
+
| `runner-environment` | Runner issues, disk space, Docker, PATH |
|
|
88
|
+
| `permissions-auth` | GITHUB_TOKEN, OIDC, secrets, 403s |
|
|
89
|
+
| `caching-artifacts` | Cache misses, artifact v4 changes, corruption |
|
|
90
|
+
| `triggers` | Workflow not running, cron issues, dispatch |
|
|
91
|
+
| `concurrency-timing` | Job cancellation, matrix, timeouts |
|
|
92
|
+
| `known-unsolved` | Platform limitations with no fix |
|
|
93
|
+
|
|
94
|
+
## Contributing
|
|
95
|
+
|
|
96
|
+
See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for how to add new error entries. It's easy:
|
|
97
|
+
|
|
98
|
+
1. Create a YAML file in the appropriate `errors/{category}/` directory
|
|
99
|
+
2. Follow the schema in `errors/_schema.json`
|
|
100
|
+
3. Open a PR — CI validates your entry automatically
|
|
101
|
+
|
|
102
|
+
## Source
|
|
103
|
+
|
|
104
|
+
All error scenarios sourced from: **[The Definitive GitHub Actions Debugging Guide](https://htek.dev/articles/github-actions-debugging-guide)**
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
MIT — [Hector Flores](https://htek.dev) (htekdev)
|
package/errors/_schema.json
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "Actions Debugger Error Entry",
|
|
4
|
-
"description": "Schema for GitHub Actions error database entries",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["id", "title", "category", "severity", "patterns", "root_cause", "fix"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"id": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"pattern": "^[a-z-]+-\\d{3}$",
|
|
11
|
-
"description": "Unique ID: {category}-{number}"
|
|
12
|
-
},
|
|
13
|
-
"title": {
|
|
14
|
-
"type": "string",
|
|
15
|
-
"description": "Human-readable error title"
|
|
16
|
-
},
|
|
17
|
-
"category": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"enum": [
|
|
20
|
-
"yaml-syntax",
|
|
21
|
-
"silent-failures",
|
|
22
|
-
"runner-environment",
|
|
23
|
-
"permissions-auth",
|
|
24
|
-
"caching-artifacts",
|
|
25
|
-
"triggers",
|
|
26
|
-
"concurrency-timing",
|
|
27
|
-
"known-unsolved"
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
"severity": {
|
|
31
|
-
"type": "string",
|
|
32
|
-
"enum": ["error", "warning", "silent-failure", "limitation"]
|
|
33
|
-
},
|
|
34
|
-
"tags": {
|
|
35
|
-
"type": "array",
|
|
36
|
-
"items": { "type": "string" }
|
|
37
|
-
},
|
|
38
|
-
"patterns": {
|
|
39
|
-
"type": "array",
|
|
40
|
-
"items": {
|
|
41
|
-
"type": "object",
|
|
42
|
-
"required": ["regex"],
|
|
43
|
-
"properties": {
|
|
44
|
-
"regex": { "type": "string" },
|
|
45
|
-
"flags": { "type": "string", "default": "i" }
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
"error_messages": {
|
|
50
|
-
"type": "array",
|
|
51
|
-
"items": { "type": "string" },
|
|
52
|
-
"description": "Exact error message strings for full-text search"
|
|
53
|
-
},
|
|
54
|
-
"root_cause": { "type": "string" },
|
|
55
|
-
"fix": { "type": "string" },
|
|
56
|
-
"fix_code": {
|
|
57
|
-
"type": "array",
|
|
58
|
-
"items": {
|
|
59
|
-
"type": "object",
|
|
60
|
-
"properties": {
|
|
61
|
-
"language": { "type": "string" },
|
|
62
|
-
"label": { "type": "string" },
|
|
63
|
-
"code": { "type": "string" }
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
"prevention": {
|
|
68
|
-
"type": "array",
|
|
69
|
-
"items": { "type": "string" }
|
|
70
|
-
},
|
|
71
|
-
"docs": {
|
|
72
|
-
"type": "array",
|
|
73
|
-
"items": {
|
|
74
|
-
"type": "object",
|
|
75
|
-
"properties": {
|
|
76
|
-
"url": { "type": "string", "format": "uri" },
|
|
77
|
-
"label": { "type": "string" }
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
"source": {
|
|
82
|
-
"type": "object",
|
|
83
|
-
"properties": {
|
|
84
|
-
"article": { "type": "string", "format": "uri" },
|
|
85
|
-
"section": { "type": "string" }
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Actions Debugger Error Entry",
|
|
4
|
+
"description": "Schema for GitHub Actions error database entries",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["id", "title", "category", "severity", "patterns", "root_cause", "fix"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"id": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"pattern": "^[a-z-]+-\\d{3}$",
|
|
11
|
+
"description": "Unique ID: {category}-{number}"
|
|
12
|
+
},
|
|
13
|
+
"title": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Human-readable error title"
|
|
16
|
+
},
|
|
17
|
+
"category": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"enum": [
|
|
20
|
+
"yaml-syntax",
|
|
21
|
+
"silent-failures",
|
|
22
|
+
"runner-environment",
|
|
23
|
+
"permissions-auth",
|
|
24
|
+
"caching-artifacts",
|
|
25
|
+
"triggers",
|
|
26
|
+
"concurrency-timing",
|
|
27
|
+
"known-unsolved"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"severity": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"enum": ["error", "warning", "silent-failure", "limitation"]
|
|
33
|
+
},
|
|
34
|
+
"tags": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": { "type": "string" }
|
|
37
|
+
},
|
|
38
|
+
"patterns": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"required": ["regex"],
|
|
43
|
+
"properties": {
|
|
44
|
+
"regex": { "type": "string" },
|
|
45
|
+
"flags": { "type": "string", "default": "i" }
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"error_messages": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": { "type": "string" },
|
|
52
|
+
"description": "Exact error message strings for full-text search"
|
|
53
|
+
},
|
|
54
|
+
"root_cause": { "type": "string" },
|
|
55
|
+
"fix": { "type": "string" },
|
|
56
|
+
"fix_code": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"properties": {
|
|
61
|
+
"language": { "type": "string" },
|
|
62
|
+
"label": { "type": "string" },
|
|
63
|
+
"code": { "type": "string" }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"prevention": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"items": { "type": "string" }
|
|
70
|
+
},
|
|
71
|
+
"docs": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"items": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"properties": {
|
|
76
|
+
"url": { "type": "string", "format": "uri" },
|
|
77
|
+
"label": { "type": "string" }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"source": {
|
|
82
|
+
"type": "object",
|
|
83
|
+
"properties": {
|
|
84
|
+
"article": { "type": "string", "format": "uri" },
|
|
85
|
+
"section": { "type": "string" }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: caching-artifacts-006
|
|
2
|
+
title: "Artifact Upload Fails: Storage Quota Exceeded or 413 Request Too Large"
|
|
3
|
+
category: caching-artifacts
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- artifacts
|
|
7
|
+
- upload-artifact
|
|
8
|
+
- storage-quota
|
|
9
|
+
- 413
|
|
10
|
+
- size-limit
|
|
11
|
+
patterns:
|
|
12
|
+
- regex: "Artifact storage quota has been hit"
|
|
13
|
+
flags: "i"
|
|
14
|
+
- regex: "Unable to upload any new artifacts"
|
|
15
|
+
flags: "i"
|
|
16
|
+
- regex: "413 Request Entity Too Large"
|
|
17
|
+
flags: "i"
|
|
18
|
+
- regex: "Create Artifact Container failed"
|
|
19
|
+
flags: "i"
|
|
20
|
+
- regex: "No space left on device"
|
|
21
|
+
flags: "i"
|
|
22
|
+
- regex: "Status Code: 500 Internal Server Error"
|
|
23
|
+
flags: "i"
|
|
24
|
+
error_messages:
|
|
25
|
+
- "Create Artifact Container failed: Artifact storage quota has been hit. Unable to upload any new artifacts"
|
|
26
|
+
- "413 Request Entity Too Large"
|
|
27
|
+
- "Unexpected response. Unable to upload chunk to pipelines.actions.githubusercontent.com... Status Code: 500 Internal Server Error"
|
|
28
|
+
- "Unhandled exception. System.IO.IOException: No space left on device"
|
|
29
|
+
root_cause: |
|
|
30
|
+
Artifact upload failures in GitHub Actions have three distinct root causes:
|
|
31
|
+
|
|
32
|
+
1. **Repository/org storage quota exceeded** (`Artifact storage quota has been hit`):
|
|
33
|
+
GitHub includes a limited amount of artifact storage per plan (e.g., 500 MB for
|
|
34
|
+
free, 2 GB for Teams, 50 GB for Enterprise). When the cumulative size of all stored
|
|
35
|
+
artifacts crosses this limit, the backend refuses to create new artifact containers
|
|
36
|
+
and every new upload fails immediately.
|
|
37
|
+
|
|
38
|
+
2. **Upload chunk too large / server error** (`413 Request Entity Too Large` or `500`):
|
|
39
|
+
GitHub Actions uploads artifacts in chunks. If a single artifact or its chunk
|
|
40
|
+
exceeds the backend's per-request limits, the server returns 413 or 500. This
|
|
41
|
+
typically happens with artifacts larger than ~2 GB in a single upload call.
|
|
42
|
+
|
|
43
|
+
3. **Runner disk space exhausted** (`No space left on device`):
|
|
44
|
+
The hosted runner's ephemeral disk (typically ~14 GB on ubuntu-latest) fills up
|
|
45
|
+
during artifact packaging/compression. This is common when building large binaries,
|
|
46
|
+
Docker images, or test results that accumulate over a long job.
|
|
47
|
+
|
|
48
|
+
Old or unretained artifacts accumulate silently — developers rarely clean up artifacts
|
|
49
|
+
manually, so quota errors often appear suddenly after months of builds.
|
|
50
|
+
fix: |
|
|
51
|
+
**For storage quota errors:**
|
|
52
|
+
- Delete old artifacts via the GitHub UI (Actions → Artifacts) or the REST API.
|
|
53
|
+
- Lower artifact retention days using the `retention-days` parameter on upload-artifact
|
|
54
|
+
so old artifacts expire automatically.
|
|
55
|
+
- If quota is still consistently exceeded, upgrade the plan or add Actions storage.
|
|
56
|
+
|
|
57
|
+
**For 413 / chunk errors:**
|
|
58
|
+
- Split the artifact into smaller logical pieces using multiple upload-artifact steps.
|
|
59
|
+
- Compress before uploading (zip/tar the directory first) to reduce payload size.
|
|
60
|
+
|
|
61
|
+
**For runner disk exhaustion:**
|
|
62
|
+
- Use a self-hosted runner with more disk, or add a disk-cleanup step early in the job.
|
|
63
|
+
- Upload intermediate artifacts (e.g., build outputs) before running additional steps
|
|
64
|
+
that generate more disk usage.
|
|
65
|
+
fix_code:
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: "Set retention to auto-expire artifacts and avoid quota buildup"
|
|
68
|
+
code: |
|
|
69
|
+
- uses: actions/upload-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
name: build-output
|
|
72
|
+
path: dist/
|
|
73
|
+
retention-days: 7 # Delete after 7 days; default is 90
|
|
74
|
+
- language: yaml
|
|
75
|
+
label: "Split large artifacts into logical pieces"
|
|
76
|
+
code: |
|
|
77
|
+
- uses: actions/upload-artifact@v4
|
|
78
|
+
with:
|
|
79
|
+
name: binaries-linux
|
|
80
|
+
path: dist/linux/
|
|
81
|
+
retention-days: 3
|
|
82
|
+
|
|
83
|
+
- uses: actions/upload-artifact@v4
|
|
84
|
+
with:
|
|
85
|
+
name: binaries-windows
|
|
86
|
+
path: dist/windows/
|
|
87
|
+
retention-days: 3
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: "Free up runner disk space before large uploads"
|
|
90
|
+
code: |
|
|
91
|
+
- name: Free disk space
|
|
92
|
+
run: |
|
|
93
|
+
df -h
|
|
94
|
+
sudo apt-get clean
|
|
95
|
+
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
|
96
|
+
df -h
|
|
97
|
+
- language: yaml
|
|
98
|
+
label: "Delete all artifacts older than N days via API"
|
|
99
|
+
code: |
|
|
100
|
+
- name: Delete old artifacts
|
|
101
|
+
uses: c-hive/gha-remove-artifacts@v1
|
|
102
|
+
with:
|
|
103
|
+
age: '1 week'
|
|
104
|
+
skip-recent: 3
|
|
105
|
+
prevention:
|
|
106
|
+
- "Always set `retention-days` on upload-artifact — the 90-day default accumulates quota quickly in active repos."
|
|
107
|
+
- "Monitor Actions storage usage in your org settings (Settings → Billing → Actions) before you hit the limit."
|
|
108
|
+
- "Add a disk-space check step (`df -h`) at the start of jobs that produce large build outputs."
|
|
109
|
+
- "Split artifacts by purpose (binaries, test results, logs) so each part stays below chunk limits."
|
|
110
|
+
docs:
|
|
111
|
+
- url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow"
|
|
112
|
+
label: "Storing and sharing data from a workflow (artifacts)"
|
|
113
|
+
- url: "https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes"
|
|
114
|
+
label: "About billing for GitHub Actions — included storage"
|
|
115
|
+
- url: "https://stackoverflow.com/questions/70730786/github-actions-create-artifact-container-failed-artifact-storage-quota-has-b"
|
|
116
|
+
label: "Stack Overflow: Artifact storage quota has been hit"
|
|
117
|
+
- url: "https://github.com/actions/upload-artifact/issues/9"
|
|
118
|
+
label: "upload-artifact#9 — chunk upload failures and size limits"
|