@htekdev/actions-debugger 1.0.76 → 1.0.78

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.
@@ -0,0 +1,103 @@
1
+ id: runner-environment-142
2
+ title: "macOS-15 Sequoia Removes system python and python2 Stubs — Command Not Found in Workflows"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - macos
7
+ - macos-15
8
+ - macos-latest
9
+ - python2
10
+ - python
11
+ - sequoia
12
+ - setup-python
13
+ patterns:
14
+ - regex: 'python[23]?: command not found'
15
+ flags: 'i'
16
+ - regex: '/usr/bin/python.*[Nn]o such file'
17
+ flags: ''
18
+ - regex: 'xcrun: error:.*python.*not a developer tool'
19
+ flags: 'i'
20
+ - regex: 'env: python: No such file or directory'
21
+ flags: ''
22
+ error_messages:
23
+ - "python: command not found"
24
+ - "python2: command not found"
25
+ - "/usr/bin/python: No such file or directory"
26
+ - "env: python: No such file or directory"
27
+ - "xcrun: error: unable to find utility 'python', not a developer tool or in PATH"
28
+ root_cause: |
29
+ Apple removed all Python stubs from macOS in macOS 15 (Sequoia). On macOS 12 through 14,
30
+ running `python` or `python2` would show a dialog prompting users to install Command Line
31
+ Tools, but the stub binary was present in /usr/bin/python so the command was technically
32
+ found (it just exited non-zero in CI where dialogs are suppressed). macOS 15 removed
33
+ these stubs entirely — /usr/bin/python and /usr/bin/python2 no longer exist.
34
+
35
+ GitHub Actions macos-15 runners and macos-latest (which resolves to macos-15 on 2025+
36
+ runners) have no `python` or `python2` in PATH unless explicitly installed via
37
+ actions/setup-python or Homebrew.
38
+
39
+ Affected workflow patterns:
40
+ - `run: python script.py` without a preceding setup-python step
41
+ - Build tools that internally call `python` (node-gyp, certain CMake scripts,
42
+ legacy Makefiles, scons, gyp-based builds)
43
+ - Shell scripts with `#!/usr/bin/env python` shebangs
44
+ - `pip` commands (also absent without setup-python)
45
+
46
+ Python 2 is also fully removed from Homebrew — `brew install python@2` is no longer
47
+ available. Any remaining Python 2 dependency must be ported to Python 3.
48
+ fix: |
49
+ Use actions/setup-python to install Python explicitly on macOS runners.
50
+ Set the python-version to the version your workflow needs (3.12 or higher recommended).
51
+
52
+ For node-gyp or native module builds that internally call `python`, set the
53
+ npm_config_python environment variable to point to the Python 3 binary from
54
+ setup-python.
55
+
56
+ For shell scripts with `#!/usr/bin/env python` shebangs, update the shebang to
57
+ `#!/usr/bin/env python3` or call the script explicitly with `python3 script.py`.
58
+ fix_code:
59
+ - language: yaml
60
+ label: "Add actions/setup-python before any step that needs python"
61
+ code: |
62
+ jobs:
63
+ build:
64
+ runs-on: macos-latest
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+ - uses: actions/setup-python@v5
68
+ with:
69
+ python-version: '3.12'
70
+ - name: Run script
71
+ run: python script.py # resolves to Python 3.12 from setup-python
72
+ - language: yaml
73
+ label: "Fix node-gyp calling python internally (native npm modules)"
74
+ code: |
75
+ steps:
76
+ - uses: actions/setup-python@v5
77
+ with:
78
+ python-version: '3.12'
79
+ - name: Install native modules
80
+ env:
81
+ npm_config_python: ${{ env.pythonLocation }}/bin/python3
82
+ run: npm ci
83
+ - language: yaml
84
+ label: "Cache Python between runs on macOS for faster CI"
85
+ code: |
86
+ steps:
87
+ - uses: actions/setup-python@v5
88
+ with:
89
+ python-version: '3.12'
90
+ cache: 'pip' # caches pip downloads automatically
91
+ - run: pip install -r requirements.txt
92
+ prevention:
93
+ - "Always use actions/setup-python on macOS jobs — never rely on system Python."
94
+ - "Search workflow files for bare `python` calls (without `3` suffix) and update to `python3` or add setup-python."
95
+ - "When migrating from macos-13 or macos-14 to macos-15, audit all steps invoking build tools (node-gyp, CMake, scons) that may call `python` internally."
96
+ - "Pin macos runner versions (e.g., macos-14) and plan an explicit upgrade window when testing macOS version bumps."
97
+ docs:
98
+ - url: "https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md"
99
+ label: "macOS-15 runner image readme"
100
+ - url: "https://github.com/actions/setup-python"
101
+ label: "actions/setup-python"
102
+ - url: "https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes"
103
+ label: "Xcode 16 Release Notes (ships with macOS-15 runners)"
@@ -0,0 +1,117 @@
1
+ id: runner-environment-139
2
+ title: "Binaries Built on ubuntu-24.04 Require GLIBC 2.39 — Fail to Execute on ubuntu-22.04 Targets"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - ubuntu-latest
8
+ - glibc
9
+ - binary-compatibility
10
+ - linker
11
+ - distribution
12
+ patterns:
13
+ - regex: 'version ''GLIBC_2\.3[6-9]'' not found'
14
+ flags: 'i'
15
+ - regex: 'libc\.so\.[0-9]+: version ''GLIBC_'
16
+ flags: 'i'
17
+ - regex: 'GLIBC_2\.3[6-9] not found \(required by'
18
+ flags: 'i'
19
+ error_messages:
20
+ - "/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.38' not found (required by ./myapp)"
21
+ - "/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.39' not found (required by ./myapp)"
22
+ - "GLIBC_2.39 not found (required by /usr/local/bin/app)"
23
+ - "version 'GLIBC_2.38' not found"
24
+ root_cause: |
25
+ GitHub Actions ubuntu-24.04 runners ship with GLIBC 2.39 (GNU C Library). When a
26
+ binary is compiled or dynamically linked on ubuntu-24.04, the resulting ELF binary
27
+ records minimum GLIBC version requirements based on the newest symbol version used —
28
+ either directly or via a linked shared library. If any symbol first introduced in
29
+ GLIBC 2.36–2.39 is referenced, the binary will fail to load on older systems.
30
+
31
+ GLIBC versions by runner image:
32
+ - ubuntu-20.04: GLIBC 2.31
33
+ - ubuntu-22.04: GLIBC 2.35
34
+ - ubuntu-24.04: GLIBC 2.39
35
+
36
+ This affects workflows that:
37
+ 1. Build release binaries on ubuntu-latest (which resolved to ubuntu-24.04 in mid-2025)
38
+ and distribute them for Linux users on ubuntu-22.04 or older.
39
+ 2. Produce binaries in one job on ubuntu-24.04 and run them in a matrix job on
40
+ ubuntu-22.04 — the artifact fails to execute in the older-runner job.
41
+ 3. Build Docker images using ubuntu-24.04 as the build stage but target a
42
+ FROM ubuntu:22.04 or FROM debian:bookworm base image in the runtime stage.
43
+
44
+ The error only surfaces at execution time, not at compile or link time. The
45
+ binary appears healthy; only when it is actually run on the older system does
46
+ the dynamic linker report the missing GLIBC version.
47
+ fix: |
48
+ Option 1 — Pin the build runner to the oldest supported OS:
49
+ Use ubuntu-22.04 as the build runner to ensure binaries link against GLIBC 2.35,
50
+ which is compatible with both ubuntu-22.04 and ubuntu-24.04 targets.
51
+
52
+ Option 2 — Build inside a container matching the target OS:
53
+ Use a Docker container (e.g., ubuntu:22.04) in the build job so the compiler
54
+ links against the correct GLIBC version regardless of the host runner.
55
+
56
+ Option 3 — Cross-compile with musl-libc (static, no GLIBC dependency):
57
+ For Rust, use the x86_64-unknown-linux-musl target. For C/C++, use musl-gcc or
58
+ musl-cross. The resulting binary has no GLIBC dependency and runs anywhere.
59
+
60
+ Option 4 — Verify GLIBC requirement in CI:
61
+ Add a validation step that runs objdump or readelf to assert the binary's
62
+ minimum GLIBC requirement before it reaches distribution.
63
+ fix_code:
64
+ - language: yaml
65
+ label: "Pin build runner to ubuntu-22.04 for GLIBC 2.35 compatibility"
66
+ code: |
67
+ jobs:
68
+ build:
69
+ runs-on: ubuntu-22.04 # GLIBC 2.35 — compatible with ubuntu-22.04 targets
70
+ steps:
71
+ - uses: actions/checkout@v4
72
+ - name: Build binary
73
+ run: cargo build --release
74
+ - uses: actions/upload-artifact@v4
75
+ with:
76
+ name: my-binary
77
+ path: target/release/myapp
78
+ - language: yaml
79
+ label: "Build inside a Docker container targeting ubuntu:22.04"
80
+ code: |
81
+ jobs:
82
+ build:
83
+ runs-on: ubuntu-latest
84
+ container:
85
+ image: ubuntu:22.04
86
+ steps:
87
+ - name: Install build tools
88
+ run: |
89
+ apt-get update
90
+ apt-get install -y build-essential curl
91
+ - uses: actions/checkout@v4
92
+ - name: Build binary
93
+ run: make release
94
+ - language: yaml
95
+ label: "Rust: build static binary with musl (no GLIBC dependency)"
96
+ code: |
97
+ jobs:
98
+ build:
99
+ runs-on: ubuntu-latest
100
+ steps:
101
+ - uses: actions/checkout@v4
102
+ - name: Add musl target
103
+ run: rustup target add x86_64-unknown-linux-musl
104
+ - name: Build static binary
105
+ run: cargo build --release --target x86_64-unknown-linux-musl
106
+ prevention:
107
+ - "Pin the build runner to the oldest Linux OS your users run when distributing compiled binaries."
108
+ - "Test binary artifacts in a matrix that includes the oldest supported runner (ubuntu-22.04) as a separate job."
109
+ - "Use `objdump -T myapp | grep -o 'GLIBC_[0-9.]*' | sort -V | tail -1` to check the minimum GLIBC version before release."
110
+ - "For maximum portability, use musl-libc or static linking to eliminate the GLIBC runtime dependency entirely."
111
+ docs:
112
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners"
113
+ label: "GitHub-hosted runners: available images"
114
+ - url: "https://wiki.ubuntu.com/Releases"
115
+ label: "Ubuntu release versions and GLIBC versions"
116
+ - url: "https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md"
117
+ label: "ubuntu-24.04 runner image readme"
@@ -0,0 +1,104 @@
1
+ id: runner-environment-141
2
+ title: "ubuntu-24.04 MySQL 8.4 Removes mysql_native_password Plugin — Client Authentication Fails"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - mysql
8
+ - mysql-8.4
9
+ - authentication
10
+ - service-container
11
+ - database
12
+ patterns:
13
+ - regex: 'Plugin ''mysql_native_password'' is not loaded'
14
+ flags: 'i'
15
+ - regex: 'mysql_native_password.*cannot be loaded'
16
+ flags: 'i'
17
+ - regex: 'ER_NOT_SUPPORTED_AUTH_MODE'
18
+ flags: 'i'
19
+ - regex: 'Client does not support authentication protocol requested by server'
20
+ flags: 'i'
21
+ error_messages:
22
+ - "ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded"
23
+ - "Authentication plugin 'mysql_native_password' cannot be loaded"
24
+ - "ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client"
25
+ root_cause: |
26
+ Ubuntu 24.04 ships MySQL 8.4 LTS as its default MySQL version. MySQL 8.4 permanently
27
+ removed the `mysql_native_password` authentication plugin that was deprecated in
28
+ MySQL 8.0.4 and disabled by default in MySQL 8.0.34. In MySQL 8.4, the plugin
29
+ binary no longer exists — it cannot be re-enabled via server configuration.
30
+
31
+ The new default authentication plugin is `caching_sha2_password`, which requires
32
+ either a TLS/SSL connection or an RSA public key exchange during authentication.
33
+ Older MySQL client libraries that were compiled expecting mysql_native_password
34
+ behavior cannot authenticate against MySQL 8.4.
35
+
36
+ Commonly affected clients in GitHub Actions workflows:
37
+ - mysql2 Ruby gem versions < 0.5.6
38
+ - mysqljs/mysql npm package (use mysql2 npm package instead)
39
+ - mysql-connector-python < 8.0.28 without SSL configuration
40
+ - phpMyAdmin and other tools linking against older libmysqlclient
41
+
42
+ Workflows that use `image: mysql:latest` in service containers are at highest risk
43
+ as mysql:latest advanced to 8.4 and then 9.x after ubuntu-24.04 was released.
44
+ fix: |
45
+ Option 1 — Pin MySQL service container to mysql:8.0:
46
+ Use `image: mysql:8.0` in your service container definition. MySQL 8.0 supports
47
+ mysql_native_password and is fully compatible with existing client libraries.
48
+ This is the fastest fix for affected workflows.
49
+
50
+ Option 2 — Update the MySQL client library:
51
+ - Ruby: upgrade mysql2 gem to >= 0.5.6 (caching_sha2_password support added)
52
+ - Node.js: replace `mysql` package with `mysql2` (>= 3.x)
53
+ - Python: upgrade mysql-connector-python to latest and configure ssl_disabled: false
54
+
55
+ Option 3 — Configure MySQL 8.4 to allow password auth with --default-auth:
56
+ MySQL 8.4 still supports caching_sha2_password for all connections. The issue is
57
+ the client, not the server. Update the client library — not the server auth policy.
58
+ fix_code:
59
+ - language: yaml
60
+ label: "Pin MySQL service container to 8.0 to preserve native password support"
61
+ code: |
62
+ services:
63
+ mysql:
64
+ image: mysql:8.0 # Pin — mysql:latest is now 8.4+ (native_password removed)
65
+ env:
66
+ MYSQL_ROOT_PASSWORD: rootpassword
67
+ MYSQL_DATABASE: testdb
68
+ options: >-
69
+ --health-cmd="mysqladmin ping -h 127.0.0.1"
70
+ --health-interval=10s
71
+ --health-timeout=5s
72
+ --health-retries=5
73
+ - language: yaml
74
+ label: "Update mysql2 Ruby gem and use mysql:8.4 correctly"
75
+ code: |
76
+ # Gemfile — update to mysql2 >= 0.5.6 for caching_sha2_password support
77
+ # gem 'mysql2', '>= 0.5.6'
78
+
79
+ # Node.js — replace mysql (1.x) with mysql2 (3.x)
80
+ # npm install mysql2 # supports SHA2 auth; old mysql package does not
81
+
82
+ services:
83
+ mysql:
84
+ image: mysql:8.4
85
+ env:
86
+ MYSQL_ROOT_PASSWORD: rootpassword
87
+ MYSQL_DATABASE: testdb
88
+ options: >-
89
+ --health-cmd="mysqladmin ping -h 127.0.0.1"
90
+ --health-interval=10s
91
+ --health-timeout=5s
92
+ --health-retries=5
93
+ prevention:
94
+ - "Always pin service container image versions (e.g., mysql:8.0) — mysql:latest advances silently and introduces breaking changes."
95
+ - "Test with the exact MySQL version your production environment uses, not mysql:latest."
96
+ - "When upgrading MySQL service container versions, update client gems/packages to versions that support caching_sha2_password."
97
+ - "Use the mysql health check option to fail fast when the container is misconfigured rather than timing out later."
98
+ docs:
99
+ - url: "https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html"
100
+ label: "MySQL 8.4.0 Release Notes — mysql_native_password removed"
101
+ - url: "https://docs.github.com/en/actions/use-cases-and-examples/using-containerized-services/about-service-containers"
102
+ label: "GitHub Actions: about service containers"
103
+ - url: "https://github.com/brianmario/mysql2"
104
+ label: "mysql2 Ruby gem — caching_sha2_password support"
@@ -0,0 +1,90 @@
1
+ id: runner-environment-140
2
+ title: "ubuntu-24.04 pip install Fails With 'externally-managed-environment' — PEP 668 Blocks System Python"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu-24.04
7
+ - ubuntu-latest
8
+ - python
9
+ - pip
10
+ - pep-668
11
+ - venv
12
+ patterns:
13
+ - regex: 'error: externally-managed-environment'
14
+ flags: 'i'
15
+ - regex: 'This environment is externally managed'
16
+ flags: 'i'
17
+ - regex: 'EXTERNALLY-MANAGED'
18
+ flags: ''
19
+ error_messages:
20
+ - "error: externally-managed-environment"
21
+ - "× This environment is externally managed"
22
+ - "hint: See PEP 668 for the detailed specification."
23
+ root_cause: |
24
+ Ubuntu 24.04 implements PEP 668, which marks the system Python environment as
25
+ "externally managed" — pip is not permitted to install or modify packages into
26
+ the system Python site-packages directory. The restriction is enforced by an
27
+ EXTERNALLY-MANAGED marker file placed at /usr/lib/python3.X/EXTERNALLY-MANAGED
28
+ by the Ubuntu package maintainers.
29
+
30
+ On GitHub Actions ubuntu-24.04 runners (and ubuntu-latest, which resolved to
31
+ ubuntu-24.04 in mid-2025), the default system Python 3 (3.12) ships this marker.
32
+ Any workflow step that calls `pip install` or `pip3 install` without a virtual
33
+ environment or the setup-python action will hit this error immediately.
34
+
35
+ Workflows migrated from ubuntu-22.04 — which did not enforce PEP 668 — will fail
36
+ on first run without any other changes. The error is clear in the output but
37
+ unexpected for workflows that previously relied on system-wide pip installs.
38
+ fix: |
39
+ Option 1 — Use actions/setup-python (recommended):
40
+ Replace the bare system Python with a setup-python step. actions/setup-python
41
+ creates its own isolated Python installation outside the system path, making
42
+ pip install work without virtual environments or bypass flags.
43
+
44
+ Option 2 — Create a virtual environment:
45
+ Run `python3 -m venv .venv && source .venv/bin/activate` before pip install.
46
+ This is the correct long-term fix for any environment.
47
+
48
+ Option 3 — Pass --break-system-packages:
49
+ Append `--break-system-packages` to the pip install command. This bypasses
50
+ PEP 668 enforcement. Acceptable in ephemeral CI environments but not
51
+ recommended for production systems.
52
+ fix_code:
53
+ - language: yaml
54
+ label: "Use actions/setup-python — recommended approach"
55
+ code: |
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+ - uses: actions/setup-python@v5
59
+ with:
60
+ python-version: '3.12'
61
+ - name: Install dependencies
62
+ run: pip install -r requirements.txt # works: isolated Python, not system
63
+ - language: yaml
64
+ label: "Create a virtual environment before pip install"
65
+ code: |
66
+ steps:
67
+ - uses: actions/checkout@v4
68
+ - name: Install in venv
69
+ run: |
70
+ python3 -m venv .venv
71
+ source .venv/bin/activate
72
+ pip install -r requirements.txt
73
+ - language: yaml
74
+ label: "Quick fix: --break-system-packages flag (CI-only workaround)"
75
+ code: |
76
+ steps:
77
+ - name: Install dependencies
78
+ run: pip install --break-system-packages -r requirements.txt
79
+ prevention:
80
+ - "Use actions/setup-python on ubuntu-24.04 runners — do not rely on system Python for pip installs."
81
+ - "Audit all `pip install` steps when migrating from ubuntu-22.04 to ubuntu-24.04 or ubuntu-latest."
82
+ - "Pin your Python version in actions/setup-python to prevent unexpected changes when the runner default Python changes."
83
+ - "Cache the virtual environment with actions/cache using a hash of requirements.txt as the key to speed up runs."
84
+ docs:
85
+ - url: "https://peps.python.org/pep-0668/"
86
+ label: "PEP 668 — Marking Python base environments as externally managed"
87
+ - url: "https://github.com/actions/setup-python"
88
+ label: "actions/setup-python"
89
+ - url: "https://wiki.ubuntu.com/NobleNumbat/ReleaseNotes"
90
+ label: "Ubuntu 24.04 (Noble Numbat) Release Notes"
@@ -0,0 +1,92 @@
1
+ id: runner-environment-143
2
+ title: "snap install Fails on All GitHub-Hosted Runners — snapd Requires systemd Which Is Absent in CI"
3
+ category: runner-environment
4
+ severity: error
5
+ tags:
6
+ - ubuntu
7
+ - snap
8
+ - snapd
9
+ - systemd
10
+ - package-management
11
+ - runner-limitation
12
+ patterns:
13
+ - regex: 'cannot communicate with server.*snapd'
14
+ flags: 'i'
15
+ - regex: 'snap: command not found'
16
+ flags: 'i'
17
+ - regex: 'snapd\.socket.*connect.*no such file'
18
+ flags: 'i'
19
+ - regex: 'error: cannot list snaps: cannot communicate with server'
20
+ flags: 'i'
21
+ error_messages:
22
+ - "error: cannot communicate with server: Post \"http+unix://%2Frun%2Fsnapd.socket/v2/snaps\": dial unix /run/snapd.socket: connect: no such file or directory"
23
+ - "snapd is not running"
24
+ - "snap: command not found"
25
+ - "cannot communicate with server: Post http+unix:///run/snapd.socket/v2/snaps: dial unix /run/snapd.socket: connect: no such file or directory"
26
+ root_cause: |
27
+ GitHub-hosted Ubuntu runners do not run systemd as PID 1. They use a custom
28
+ initialization environment where systemd is not the init system. The snap package
29
+ manager (snapd) requires systemd for:
30
+ - Daemon lifecycle management (snapd.service unit)
31
+ - D-Bus socket activation (/run/snapd.socket)
32
+ - AppArmor profile enforcement for snap confinement
33
+ - Mount namespace management for snap application isolation
34
+
35
+ Without systemd, the snapd daemon never starts, and /run/snapd.socket does not
36
+ exist. Any `snap install` command immediately fails because the snap client
37
+ cannot reach the daemon socket to submit the install request.
38
+
39
+ This is a structural limitation of GitHub-hosted runners across ALL Ubuntu versions
40
+ (ubuntu-20.04, ubuntu-22.04, ubuntu-24.04, ubuntu-latest) and has not changed
41
+ since Actions was launched. Attempting to start snapd manually with `systemctl start snapd`
42
+ also fails because systemctl is non-functional without systemd.
43
+
44
+ While `snap` binary may be present in PATH on some runner images, it is non-functional
45
+ and the underlying daemon cannot be started in the current runner architecture.
46
+ fix: |
47
+ Replace snap install with an alternative package source:
48
+
49
+ - Use apt/apt-get: Most snap packages have apt equivalents or PPA repositories
50
+ - Use dedicated GitHub Actions: Many popular tools have official or maintained Actions
51
+ (e.g., azure/setup-kubectl, helm/kind-action, hashicorp/setup-terraform)
52
+ - Download official binary releases: curl the release binary from GitHub Releases
53
+ or the tool's official download page, then move to /usr/local/bin
54
+ - Use Homebrew (macOS) or the tool's official install script
55
+ fix_code:
56
+ - language: yaml
57
+ label: "Replace snap install kubectl with the official setup-kubectl action"
58
+ code: |
59
+ steps:
60
+ # Instead of: run: sudo snap install kubectl --classic
61
+ - uses: azure/setup-kubectl@v4
62
+ with:
63
+ version: 'v1.30.0'
64
+ - language: yaml
65
+ label: "Replace snap install helm with the official Helm install script"
66
+ code: |
67
+ steps:
68
+ # Instead of: run: sudo snap install helm --classic
69
+ - name: Install Helm
70
+ run: |
71
+ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
72
+ - language: yaml
73
+ label: "Generic: replace snap install with direct binary download"
74
+ code: |
75
+ steps:
76
+ - name: Install tool via binary release (snap alternative)
77
+ run: |
78
+ VERSION="1.2.3"
79
+ curl -fsSL "https://example.com/releases/${VERSION}/tool-linux-amd64.tar.gz" \
80
+ | tar -xz -C /usr/local/bin tool
81
+ prevention:
82
+ - "Never use `snap install` in GitHub Actions — snapd does not work on any GitHub-hosted runner."
83
+ - "Search all workflow files for `snap install` and replace with apt, binary downloads, or official GitHub Actions."
84
+ - "When evaluating new tools for CI, prefer those distributed via apt, Homebrew, or binary releases over snap-only distributions."
85
+ - "Check the tool's GitHub repository for an official GitHub Action before writing a custom install step."
86
+ docs:
87
+ - url: "https://github.com/actions/runner-images/issues/3206"
88
+ label: "runner-images #3206: snap install fails on GitHub Actions (long-running issue)"
89
+ - url: "https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners"
90
+ label: "GitHub-hosted runners overview"
91
+ - url: "https://snapcraft.io/docs/installing-snapd"
92
+ label: "Snapcraft: installing snapd (requires systemd)"
@@ -0,0 +1,96 @@
1
+ id: silent-failures-072
2
+ title: "inputs Context Empty on Non-Dispatch Events — Multi-Trigger Workflows Leave inputs.* as Empty String"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - inputs
7
+ - workflow-dispatch
8
+ - push
9
+ - multi-trigger
10
+ - context
11
+ - empty-string
12
+ patterns:
13
+ - regex: 'inputs\.[a-zA-Z_][a-zA-Z0-9_-]* (?:is empty|not set|undefined|was null)'
14
+ flags: 'i'
15
+ error_messages:
16
+ - "Deploy target is empty — expected inputs.environment to be non-empty"
17
+ - "Error: Input required and not supplied: environment"
18
+ root_cause: |
19
+ The `inputs` context in GitHub Actions is ONLY populated when a workflow is triggered
20
+ by a `workflow_dispatch` or `workflow_call` event. When the same workflow is triggered
21
+ by any other event — push, pull_request, schedule, release, workflow_run, etc. — the
22
+ entire `inputs` context is empty. Every `${{ inputs.anything }}` expression evaluates
23
+ to `""` (empty string) without raising an error or printing a warning.
24
+
25
+ This commonly affects developers who:
26
+ 1. Add `on: workflow_dispatch` with inputs to an existing push-triggered workflow
27
+ to enable manual override capability.
28
+ 2. Reference `${{ inputs.environment }}` or `${{ inputs.deploy_target }}` in `run:`
29
+ steps, `with:` parameters, or `env:` blocks — expecting a sensible default when
30
+ triggered automatically by push.
31
+ 3. Use `if: inputs.skip_tests == 'true'` — on push events this is effectively
32
+ `if: '' == 'true'` which evaluates to false silently.
33
+ 4. Pass `${{ inputs.version }}` to an action's `with: version:` parameter — the
34
+ action receives an empty string and may silently use its own default or fail
35
+ with an opaque "invalid version" message.
36
+
37
+ The `inputs` context is distinct from `github.event.inputs` (legacy alias, same
38
+ empty behavior on non-dispatch events) and from the `vars` context (org/repo
39
+ configuration variables which are always populated).
40
+ fix: |
41
+ Use the `||` fallback operator to provide defaults for all inputs in workflows
42
+ that support multiple triggers. This guarantees non-dispatch triggers receive
43
+ a sensible default instead of an empty string.
44
+
45
+ Guard dispatch-only logic blocks with `if: github.event_name == 'workflow_dispatch'`
46
+ to explicitly skip input-dependent steps on automated trigger runs.
47
+ fix_code:
48
+ - language: yaml
49
+ label: "Provide fallback defaults for all inputs in multi-event workflows"
50
+ code: |
51
+ on:
52
+ push:
53
+ branches: [main]
54
+ workflow_dispatch:
55
+ inputs:
56
+ environment:
57
+ type: choice
58
+ options: [staging, production]
59
+ default: staging
60
+ skip_tests:
61
+ type: boolean
62
+ default: false
63
+
64
+ jobs:
65
+ deploy:
66
+ runs-on: ubuntu-latest
67
+ env:
68
+ # Use || to fall back to defaults when triggered by push
69
+ DEPLOY_ENV: ${{ inputs.environment || 'staging' }}
70
+ SKIP_TESTS: ${{ inputs.skip_tests || 'false' }}
71
+ steps:
72
+ - name: Deploy
73
+ run: echo "Deploying to $DEPLOY_ENV (skip_tests=$SKIP_TESTS)"
74
+ - language: yaml
75
+ label: "Guard input-dependent logic with event_name check"
76
+ code: |
77
+ steps:
78
+ - name: Apply manual override (dispatch only)
79
+ if: github.event_name == 'workflow_dispatch'
80
+ run: echo "Manual dispatch with environment=${{ inputs.environment }}"
81
+
82
+ - name: Default automated deploy
83
+ if: github.event_name != 'workflow_dispatch'
84
+ run: echo "Automated push deploy to staging"
85
+ prevention:
86
+ - "Always use `${{ inputs.param || 'default' }}` when a workflow supports more than one trigger — never assume inputs will be populated."
87
+ - "Log `github.event_name` at the start of the workflow to trace which trigger fired and aid debugging of empty-input behavior."
88
+ - "Use the 'Context availability' table in GitHub Actions documentation to verify which contexts are populated for each event type before referencing them."
89
+ - "Consider splitting dispatch workflows (with inputs) from automated trigger workflows — combining both in one file with shared input-referencing code is a common source of subtle bugs."
90
+ docs:
91
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#inputs-context"
92
+ label: "GitHub Actions: inputs context"
93
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch"
94
+ label: "workflow_dispatch event"
95
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#context-availability"
96
+ label: "Context availability by event type"
@@ -0,0 +1,84 @@
1
+ id: silent-failures-073
2
+ title: "vars. Context Returns Empty String for Undefined Organization or Repository Variables — No Error Raised"
3
+ category: silent-failures
4
+ severity: silent-failure
5
+ tags:
6
+ - vars
7
+ - configuration-variables
8
+ - context
9
+ - empty-string
10
+ - organization
11
+ - repository
12
+ patterns:
13
+ - regex: 'vars\.[A-Z_][A-Z0-9_]* (?:is empty|not set|missing|undefined|not defined)'
14
+ flags: 'i'
15
+ error_messages:
16
+ - "Error: REGISTRY_URL is empty — check that vars.REGISTRY_URL is defined in repository variables"
17
+ - "Error: docker tag '' is not valid"
18
+ - "fatal: repository '' does not exist"
19
+ root_cause: |
20
+ GitHub Actions configuration variables (the `vars` context, introduced 2023) provide a
21
+ non-secret key/value store at the organization, repository, or environment level. When
22
+ a `${{ vars.MY_VARIABLE }}` expression references a variable that has not been defined
23
+ at any applicable scope, the expression evaluates to `""` (empty string) without
24
+ raising any error, warning, or annotation in the Actions run UI.
25
+
26
+ Unlike missing secrets (which also silently return empty string), `vars` variables are
27
+ user-visible and frequently forgotten when:
28
+ 1. A workflow is used in a new repository that hasn't had its variables configured.
29
+ 2. A variable is defined at the repository level but the job targets an environment
30
+ that doesn't inherit repo-level variables (environment-scoped variables override
31
+ but do not merge with repo-scoped variables of the same name).
32
+ 3. A variable is defined only at the organization level but the repository is
33
+ a fork — forked repositories cannot access parent org variables.
34
+ 4. The variable name has a typo in the workflow file.
35
+
36
+ Silent empty values cascade into confusing downstream errors: Docker tags become `":latest"`
37
+ instead of `"ghcr.io/org/image:latest"`, API endpoints receive empty base URLs, and
38
+ notification webhooks silently fail with HTTP 400.
39
+
40
+ Environment-scoped variables are ONLY available when the job specifies `environment:`.
41
+ If a job has no `environment:` key, env-scoped variables are not available even if
42
+ the env-scoped variable has the same name as a repo-scoped variable.
43
+ fix: |
44
+ Use the `||` fallback operator to provide safe defaults, and add an explicit
45
+ validation step for variables that are required for the workflow to succeed.
46
+ fix_code:
47
+ - language: yaml
48
+ label: "Use || fallback for optional vars"
49
+ code: |
50
+ env:
51
+ REGISTRY: ${{ vars.REGISTRY_URL || 'ghcr.io' }}
52
+ LOG_LEVEL: ${{ vars.LOG_LEVEL || 'info' }}
53
+ API_BASE: ${{ vars.API_BASE_URL || 'https://api.example.com' }}
54
+ - language: yaml
55
+ label: "Validate required vars at workflow start with fail-fast"
56
+ code: |
57
+ jobs:
58
+ preflight:
59
+ runs-on: ubuntu-latest
60
+ steps:
61
+ - name: Validate required configuration variables
62
+ env:
63
+ REGISTRY_URL: ${{ vars.REGISTRY_URL }}
64
+ DEPLOY_ENV: ${{ vars.DEPLOY_ENV }}
65
+ run: |
66
+ missing=()
67
+ [ -z "$REGISTRY_URL" ] && missing+=("vars.REGISTRY_URL")
68
+ [ -z "$DEPLOY_ENV" ] && missing+=("vars.DEPLOY_ENV")
69
+ if [ ${#missing[@]} -gt 0 ]; then
70
+ echo "::error::Missing required variables: ${missing[*]}"
71
+ echo "Set them at: Settings → Secrets and Variables → Variables"
72
+ exit 1
73
+ fi
74
+ prevention:
75
+ - "Document all required `vars.*` variables in the repository README or CONTRIBUTING guide — unlike required inputs, they have no built-in validation."
76
+ - "Add a preflight validation job that checks for required variables and fails immediately with a clear error message."
77
+ - "Use `${{ vars.SETTING || 'sensible-default' }}` consistently to make empty-variable behavior explicit."
78
+ - "For environment-scoped variables, ensure the job specifies `environment:` — variables defined only on an environment are not available to jobs that omit the environment key."
79
+ - "Use repository variable naming conventions (UPPER_SNAKE_CASE) and check for typos in workflow YAML against the variables defined in Settings."
80
+ docs:
81
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables"
82
+ label: "GitHub Actions: configuration variables (vars context)"
83
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#vars-context"
84
+ label: "vars context reference"
@@ -0,0 +1,101 @@
1
+ id: yaml-syntax-049
2
+ title: "env Variable Name with Dots — ${{ env.MY.VAR }} Silently Reads Undefined Subproperty"
3
+ category: yaml-syntax
4
+ severity: silent-failure
5
+ tags:
6
+ - env-context
7
+ - expression-syntax
8
+ - dots
9
+ - property-access
10
+ - empty-string
11
+ - naming
12
+ patterns:
13
+ - regex: '\$\{\{\s*env\.[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_]'
14
+ flags: ''
15
+ - regex: '\$\{\{\s*vars\.[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_]'
16
+ flags: ''
17
+ error_messages:
18
+ - "Error: Expected non-empty value but got '' (env.MY.VAR resolved to empty string)"
19
+ - "::error::Variable 'app.version' is empty — check expression syntax"
20
+ root_cause: |
21
+ GitHub Actions expression syntax uses the dot (`.`) character as a property accessor
22
+ for traversing nested context objects. When an environment variable name contains a
23
+ dot (e.g., `MY.VAR`, `app.version`, `node.options`), the expression `${{ env.MY.VAR }}`
24
+ is evaluated by the expression parser as two sequential property dereferences:
25
+
26
+ 1. `env.MY` — look up the property named exactly `MY` on the env object
27
+ 2. `.VAR` — look up the property named `VAR` on the result of step 1
28
+
29
+ If no environment variable named exactly `MY` exists (only `MY.VAR` does), then
30
+ `env.MY` returns `""` (empty string), and the entire expression silently evaluates
31
+ to `""` with no error or warning.
32
+
33
+ This is legal YAML — `env: MY.VAR: 'hello'` is valid YAML syntax and DOES set the
34
+ shell environment variable `MY.VAR` in `run:` steps. Linux and macOS allow dots in
35
+ env var names. The problem is exclusively in the expression layer: `${{ env.MY.VAR }}`
36
+ cannot reach the variable because `.` is an operator, not part of the identifier.
37
+
38
+ The same issue affects the `vars` context: `${{ vars.app.version }}` attempts to
39
+ read a sub-property `version` of a variable named `app`, not a variable named
40
+ `app.version`.
41
+
42
+ actionlint does not currently warn on dotted env/vars expressions because the
43
+ expression syntax is technically valid — it just resolves to empty string at runtime.
44
+ fix: |
45
+ Option 1 — Rename environment variables to use underscores instead of dots (recommended):
46
+ Change `MY.VAR` to `MY_VAR`. This is the POSIX-conventional approach and works
47
+ reliably with all GitHub Actions expression syntax.
48
+
49
+ Option 2 — Use bracket property accessor syntax:
50
+ `${{ env['MY.VAR'] }}` uses the array/bracket notation which treats the entire
51
+ string `MY.VAR` as a single property key, correctly reading the dotted variable.
52
+
53
+ Option 3 — Access the variable via shell syntax in run: steps:
54
+ In `run:` steps the shell receives the full env var with its dotted name. Use
55
+ the shell variable reference directly in shell scripts, not in expressions.
56
+ fix_code:
57
+ - language: yaml
58
+ label: "Rename to underscores (recommended)"
59
+ code: |
60
+ env:
61
+ MY_VAR: 'hello' # was MY.VAR — underscore works in expressions
62
+ APP_VERSION: '1.2.3' # was app.version
63
+
64
+ steps:
65
+ - name: Read variable
66
+ run: echo "Version is ${{ env.APP_VERSION }}"
67
+ - language: yaml
68
+ label: "Bracket syntax for dotted env var names"
69
+ code: |
70
+ env:
71
+ MY.VAR: 'hello' # dotted name is set in the shell env
72
+
73
+ steps:
74
+ - name: Read via bracket syntax
75
+ run: echo "Value is ${{ env['MY.VAR'] }}"
76
+ # BAD: ${{ env.MY.VAR }} → silently reads undefined subproperty
77
+ # GOOD: ${{ env['MY.VAR'] }} → reads the full dotted variable name
78
+ - language: yaml
79
+ label: "Access dotted env var directly in shell (run: steps only)"
80
+ code: |
81
+ env:
82
+ MY.VAR: 'hello'
83
+
84
+ steps:
85
+ - name: Use shell variable directly
86
+ run: |
87
+ # The shell receives the env var with its dotted name
88
+ # Access it via indirect parameter expansion
89
+ VAR_NAME='MY.VAR'
90
+ echo "${!VAR_NAME}" # bash indirect expansion
91
+ prevention:
92
+ - "Never use dots in environment variable names in `env:` blocks — always use UPPER_SNAKE_CASE with underscores."
93
+ - "When consuming third-party tooling that sets dotted env var names, immediately re-export them with underscore names for safe use in expressions."
94
+ - "Review any expression containing two dots in the same context path (e.g., `env.a.b`) — this almost always indicates a naming mistake."
95
+ docs:
96
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#env-context"
97
+ label: "GitHub Actions: env context"
98
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions#property-dereference"
99
+ label: "Property dereference in expressions"
100
+ - url: "https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions"
101
+ label: "Evaluate expressions in workflows and actions"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@htekdev/actions-debugger",
3
- "version": "1.0.76",
3
+ "version": "1.0.78",
4
4
  "description": "65+ real GitHub Actions errors, queryable by agents. CLI + MCP server + Copilot skills + error database.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",