@htekdev/actions-debugger 1.0.70 → 1.0.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/errors/known-unsolved/copilot-code-review-consumes-actions-minutes.yml +103 -0
- package/errors/known-unsolved/ubuntu-arm64-images-frozen-github-transition.yml +114 -0
- package/errors/runner-environment/actions-core-v3-esm-only-require-fails.yml +136 -0
- package/errors/runner-environment/arm64-runner-binary-exec-format-error.yml +100 -0
- package/errors/runner-environment/ubuntu-24-no-swap-oom-exit-137.yml +124 -0
- package/errors/runner-environment/ubuntu-24-openjdk11-no-installation-candidate.yml +99 -0
- package/errors/runner-environment/windows-2025-dotnet6-sdk-removed.yml +96 -0
- package/errors/yaml-syntax/schedule-timezone-actionlint-unknown-key.yml +135 -0
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
id: known-unsolved-044
|
|
2
|
+
title: 'Copilot code review consumes GitHub Actions minutes on private repositories — unexpected billing from June 1, 2026'
|
|
3
|
+
category: known-unsolved
|
|
4
|
+
severity: limitation
|
|
5
|
+
tags:
|
|
6
|
+
- copilot
|
|
7
|
+
- copilot-code-review
|
|
8
|
+
- billing
|
|
9
|
+
- actions-minutes
|
|
10
|
+
- private-repos
|
|
11
|
+
- spending-limit
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'copilot.*code.*review.*actions.*minutes'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'spending limit.*github actions'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'exceeded.*spending limit.*copilot'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'GitHub Actions minutes unexpectedly consumed by Copilot code review jobs'
|
|
21
|
+
- 'Actions billing spike after enabling Copilot code review on private repositories'
|
|
22
|
+
root_cause: |
|
|
23
|
+
Starting June 1, 2026, GitHub Copilot code review shifted to an agentic tool-calling
|
|
24
|
+
architecture that runs on GitHub Actions using GitHub-hosted runners. As a result, each
|
|
25
|
+
Copilot code review on a private repository now consumes GitHub Actions minutes in addition
|
|
26
|
+
to Copilot AI Credits (under the new usage-based billing model).
|
|
27
|
+
|
|
28
|
+
This is not an error in your workflow — your existing workflows are unaffected. The issue
|
|
29
|
+
is an invisible, automatic Actions workflow that GitHub creates and runs internally for
|
|
30
|
+
each Copilot code review request on your private repos. The runner time shows up in your
|
|
31
|
+
Actions billing dashboard as unexpected consumption.
|
|
32
|
+
|
|
33
|
+
Affected plans:
|
|
34
|
+
- GitHub Copilot Pro
|
|
35
|
+
- GitHub Copilot Pro+
|
|
36
|
+
- GitHub Copilot Business
|
|
37
|
+
- GitHub Copilot Enterprise
|
|
38
|
+
This also includes Copilot code reviews from non-licensed users billed via direct org billing.
|
|
39
|
+
|
|
40
|
+
The behavior is by design and cannot be disabled — if Copilot code review is active on
|
|
41
|
+
private repos, Actions minutes will be consumed. The rate depends on the runner type:
|
|
42
|
+
- Standard GitHub-hosted runners: standard per-minute Actions rates apply
|
|
43
|
+
- Larger runners: billed at the larger runner rate
|
|
44
|
+
- Self-hosted runners: no additional Actions minute charges (self-hosted runner costs apply)
|
|
45
|
+
|
|
46
|
+
Organizations that had spending limits set low for Actions (or spending limits set to $0)
|
|
47
|
+
may find that Copilot code reviews start being blocked when the Actions spending limit is hit,
|
|
48
|
+
causing the review to fail or not run at all — without a clear error message explaining why.
|
|
49
|
+
|
|
50
|
+
There is no way to separate "Copilot code review Actions minutes" from regular workflow
|
|
51
|
+
Actions minutes in the billing dashboard — they are aggregated together.
|
|
52
|
+
fix: |
|
|
53
|
+
There is no way to opt out of Actions minute consumption for Copilot code review on private
|
|
54
|
+
repos while keeping Copilot code review enabled. The available mitigations are:
|
|
55
|
+
|
|
56
|
+
1. **Use self-hosted runners**: Configure Copilot code review to use self-hosted runners.
|
|
57
|
+
Self-hosted runner usage does not count toward your GitHub Actions minute allowance.
|
|
58
|
+
This is the only way to eliminate the per-review Actions minute charge.
|
|
59
|
+
|
|
60
|
+
2. **Increase the Actions spending limit**: Review your organization's Actions spending limit
|
|
61
|
+
in Settings → Billing & Plans → Spending limits. Ensure the limit covers the expected
|
|
62
|
+
volume of Copilot code reviews in addition to your regular Actions usage.
|
|
63
|
+
|
|
64
|
+
3. **Set up budget controls**: Use GitHub's usage-based billing budget controls to set
|
|
65
|
+
per-user or organization-wide spending caps for Actions to prevent surprise overages.
|
|
66
|
+
|
|
67
|
+
4. **Monitor proactively**: Use GitHub Actions metrics and the Billing Usage Report to
|
|
68
|
+
track combined Actions + Copilot consumption before the end of the billing cycle.
|
|
69
|
+
|
|
70
|
+
5. **Public repositories**: Copilot code review on public repositories does not consume
|
|
71
|
+
Actions minutes (Actions minutes remain free for public repos).
|
|
72
|
+
fix_code:
|
|
73
|
+
- language: yaml
|
|
74
|
+
label: 'No workflow change needed — this is a billing configuration issue, not a workflow error'
|
|
75
|
+
code: |
|
|
76
|
+
# There is no workflow YAML to change.
|
|
77
|
+
# To use self-hosted runners for Copilot code review, configure the runner
|
|
78
|
+
# in your organization or repository settings:
|
|
79
|
+
# Settings → Actions → Runners → Add runner
|
|
80
|
+
# Then configure Copilot code review to use that runner label.
|
|
81
|
+
#
|
|
82
|
+
# To check your Actions spending limit:
|
|
83
|
+
# Settings → Billing & Plans → Spending limits → GitHub Actions
|
|
84
|
+
#
|
|
85
|
+
# Example: setting up a budget alert for Actions usage
|
|
86
|
+
# (done in GitHub UI or via REST API, not workflow YAML)
|
|
87
|
+
#
|
|
88
|
+
# Regular workflows are unaffected — no changes needed to existing .yml files.
|
|
89
|
+
prevention:
|
|
90
|
+
- 'Before enabling Copilot code review on private repositories, review your current GitHub Actions spending limit and adjust if needed'
|
|
91
|
+
- 'Monitor Actions usage in the first billing cycle after enabling Copilot code review to calibrate expected consumption'
|
|
92
|
+
- 'Configure self-hosted runners for Copilot code review to eliminate per-review Actions minute charges'
|
|
93
|
+
- 'Set an explicit Actions spending limit (not $0) to avoid Copilot reviews silently failing when the limit is hit'
|
|
94
|
+
- 'Public repositories are exempt — Copilot code review on public repos does not consume Actions minutes'
|
|
95
|
+
docs:
|
|
96
|
+
- url: 'https://github.blog/changelog/2026-04-27-github-copilot-code-review-will-start-consuming-github-actions-minutes-on-june-1-2026/'
|
|
97
|
+
label: 'GitHub Changelog: Copilot code review will start consuming Actions minutes on June 1, 2026'
|
|
98
|
+
- url: 'https://github.blog/changelog/2026-06-01-updates-to-github-copilot-billing-and-plans/'
|
|
99
|
+
label: 'GitHub Changelog: Copilot billing updates — usage-based billing is active (June 1, 2026)'
|
|
100
|
+
- url: 'https://docs.github.com/en/billing/managing-billing-for-your-products/managing-billing-for-github-actions/about-billing-for-github-actions'
|
|
101
|
+
label: 'GitHub Docs: About billing for GitHub Actions'
|
|
102
|
+
- url: 'https://docs.github.com/en/copilot/github-copilot-enterprise/copilot-code-review/using-github-copilot-code-review'
|
|
103
|
+
label: 'GitHub Docs: Using GitHub Copilot code review'
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
id: known-unsolved-045
|
|
2
|
+
title: 'ubuntu-24.04-arm and ubuntu-22.04-arm runner images paused during GitHub Arm64 takeover — no package updates during transition'
|
|
3
|
+
category: known-unsolved
|
|
4
|
+
severity: limitation
|
|
5
|
+
tags:
|
|
6
|
+
- arm64
|
|
7
|
+
- ubuntu-arm
|
|
8
|
+
- runner-images
|
|
9
|
+
- partner-runner-images
|
|
10
|
+
- package-updates
|
|
11
|
+
- security-updates
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'ubuntu-24\.04-arm'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'ubuntu-22\.04-arm'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'partner-runner-images'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'No recent runner-images release notes for ubuntu-24.04-arm during migration period'
|
|
21
|
+
- 'Package version pinned to stale ubuntu-arm runner image during GitHub transition'
|
|
22
|
+
root_cause: |
|
|
23
|
+
In May 2026, GitHub announced it was taking ownership of the Arm64 runner images for
|
|
24
|
+
GitHub Actions hosted runners, transitioning them away from Arm Limited, LLC (previously
|
|
25
|
+
maintained in the actions/partner-runner-images repository).
|
|
26
|
+
|
|
27
|
+
During this transition period:
|
|
28
|
+
- ubuntu-24.04-arm and ubuntu-22.04-arm images WILL NOT receive updates
|
|
29
|
+
- No new release notes appear in actions/runner-images for these images during migration
|
|
30
|
+
- The actions/partner-runner-images repository is being archived
|
|
31
|
+
- All open issues and future support are moving to actions/runner-images
|
|
32
|
+
|
|
33
|
+
This means workflows running on ubuntu-24.04-arm or ubuntu-22.04-arm during the
|
|
34
|
+
transition period (May 2026 until migration completes) are running on stale images that
|
|
35
|
+
may have:
|
|
36
|
+
- Unpatched security vulnerabilities (CVEs disclosed after the freeze date)
|
|
37
|
+
- Missing package versions that were released after the freeze date
|
|
38
|
+
- Outdated tool versions (e.g., Docker, Node.js, Python) compared to the x86 equivalents
|
|
39
|
+
|
|
40
|
+
The exact duration of the freeze is not published — GitHub states "during the transition."
|
|
41
|
+
Developers who pin specific package or tool versions that are only available in newer
|
|
42
|
+
releases may find those versions unavailable on arm runners while they are available on
|
|
43
|
+
the x86 equivalents.
|
|
44
|
+
|
|
45
|
+
This is a known, intentional operational decision by GitHub during the infrastructure
|
|
46
|
+
migration. There is no error message — workflows simply run on stale images silently.
|
|
47
|
+
fix: |
|
|
48
|
+
There is no immediate fix since the image freeze is a deliberate infrastructure choice
|
|
49
|
+
during the migration. Available mitigations:
|
|
50
|
+
|
|
51
|
+
1. **Track the migration status**: Monitor the actions/runner-images repository for
|
|
52
|
+
announcements about when the Ubuntu Arm64 images resume updates. GitHub has indicated
|
|
53
|
+
the partner-runner-images repo will be archived after the transition completes.
|
|
54
|
+
|
|
55
|
+
2. **Report critical issues directly**: For CVEs or critical vulnerabilities in the arm
|
|
56
|
+
images during the transition, open an issue in actions/runner-images (NOT
|
|
57
|
+
actions/partner-runner-images, which is being archived).
|
|
58
|
+
|
|
59
|
+
3. **Avoid pinning to specific recent package versions on arm runners**: If your workflow
|
|
60
|
+
installs packages with exact version pinning, add a fallback or use the latest available
|
|
61
|
+
version rather than a specific recent release that may not be in the frozen image.
|
|
62
|
+
|
|
63
|
+
4. **Use self-hosted Arm64 runners**: If the image freeze causes unacceptable security or
|
|
64
|
+
tool-version risk, consider switching to self-hosted Arm64 runners where you control
|
|
65
|
+
the image update cadence.
|
|
66
|
+
|
|
67
|
+
5. **Test cross-architecture differences**: If workflows behave differently on x86 vs arm
|
|
68
|
+
during this period, check whether the discrepancy is due to the arm image being stale
|
|
69
|
+
rather than a genuine architecture difference.
|
|
70
|
+
fix_code:
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Use self-hosted Arm64 runner to bypass the frozen GitHub-hosted arm image'
|
|
73
|
+
code: |
|
|
74
|
+
jobs:
|
|
75
|
+
arm-build:
|
|
76
|
+
# Temporarily use a self-hosted arm runner if the GitHub-hosted arm image
|
|
77
|
+
# is missing security patches or required packages during the migration period.
|
|
78
|
+
# Replace with ubuntu-24.04-arm once GitHub resumes image updates.
|
|
79
|
+
runs-on: self-hosted-arm64
|
|
80
|
+
|
|
81
|
+
steps:
|
|
82
|
+
- uses: actions/checkout@v4
|
|
83
|
+
|
|
84
|
+
- name: Build on Arm64
|
|
85
|
+
run: make build
|
|
86
|
+
|
|
87
|
+
- language: yaml
|
|
88
|
+
label: 'Avoid pinning exact recent package versions on arm runners during the transition'
|
|
89
|
+
code: |
|
|
90
|
+
jobs:
|
|
91
|
+
arm-build:
|
|
92
|
+
runs-on: ubuntu-24.04-arm
|
|
93
|
+
steps:
|
|
94
|
+
- uses: actions/checkout@v4
|
|
95
|
+
|
|
96
|
+
# AVOID: pinning to a very recent package version that may not be in frozen image
|
|
97
|
+
# - run: apt-get install -y libexample=2.6.3-1
|
|
98
|
+
|
|
99
|
+
# PREFER: install latest available version from the frozen image's apt cache
|
|
100
|
+
- run: |
|
|
101
|
+
sudo apt-get update
|
|
102
|
+
sudo apt-get install -y libexample
|
|
103
|
+
prevention:
|
|
104
|
+
- 'Monitor actions/runner-images (not actions/partner-runner-images) for Ubuntu Arm64 image update resumption announcements'
|
|
105
|
+
- 'For security-sensitive workloads on arm runners, track CVE advisories against the frozen image versions until the transition completes'
|
|
106
|
+
- 'Avoid cross-architecture version pinning assumptions — package versions on arm images may lag x86 images during the transition period'
|
|
107
|
+
- 'Open issues for Arm64 runner image problems in actions/runner-images — the partner-runner-images repository is being archived and will no longer receive support'
|
|
108
|
+
docs:
|
|
109
|
+
- url: 'https://github.blog/changelog/2026-05-14-github-actions-upcoming-image-migrations/'
|
|
110
|
+
label: 'GitHub Changelog: GitHub Actions Upcoming image migrations — Arm64 takeover (May 2026)'
|
|
111
|
+
- url: 'https://github.com/actions/runner-images'
|
|
112
|
+
label: 'actions/runner-images — new home for all runner image issues including Arm64'
|
|
113
|
+
- url: 'https://github.com/actions/partner-runner-images'
|
|
114
|
+
label: 'actions/partner-runner-images — being archived after Arm64 transition completes'
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
id: runner-environment-131
|
|
2
|
+
title: '@actions/core 3.0.0 is ESM-only — custom JavaScript actions using require() fail with ERR_REQUIRE_ESM'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- esm
|
|
7
|
+
- commonjs
|
|
8
|
+
- actions-core
|
|
9
|
+
- custom-action
|
|
10
|
+
- javascript
|
|
11
|
+
- toolkit
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'ERR_REQUIRE_ESM'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'No "exports" main defined in @actions/core'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'require\(\) of ES Module.*@actions/core'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: 'Must use import to load ES Module'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'Error [ERR_REQUIRE_ESM]: require() of ES Module .../node_modules/@actions/core/lib/core.js not supported'
|
|
23
|
+
- 'No "exports" main defined in @actions/core/package.json @v3'
|
|
24
|
+
- 'Must use import to load ES Module: .../node_modules/@actions/core/lib/core.js'
|
|
25
|
+
root_cause: |
|
|
26
|
+
@actions/core version 3.0.0 (published January 29, 2026) converted the package from CommonJS
|
|
27
|
+
to ESM-only. Before v3, the package shipped as CommonJS and was consumable with:
|
|
28
|
+
|
|
29
|
+
const core = require('@actions/core');
|
|
30
|
+
|
|
31
|
+
With v3.0.0 and later, the package is ESM-only. CommonJS callers that use require() receive
|
|
32
|
+
one of these errors at runtime:
|
|
33
|
+
|
|
34
|
+
- ERR_REQUIRE_ESM: Node.js refuses to require() an ES module
|
|
35
|
+
- "No 'exports' main defined in @actions/core/package.json @v3" — the ESM package.json
|
|
36
|
+
exports map does not expose a CommonJS entry point
|
|
37
|
+
|
|
38
|
+
This affects any custom JavaScript or TypeScript action that:
|
|
39
|
+
1. Uses require('@actions/core') — e.g., const core = require('@actions/core');
|
|
40
|
+
2. Uses TypeScript compiled to CommonJS (the default 'module': 'commonjs' in tsconfig.json)
|
|
41
|
+
even when source code uses import syntax — the compiled output uses require() calls
|
|
42
|
+
3. Bundles with webpack/ncc in CommonJS mode without transpiling the ESM dependency
|
|
43
|
+
|
|
44
|
+
The actions/typescript-action template and thousands of published community actions that
|
|
45
|
+
were written for @actions/core v1–v2 are affected when their dependencies are updated.
|
|
46
|
+
|
|
47
|
+
Note: This is a Node.js runtime error — the workflow definition is valid YAML. The failure
|
|
48
|
+
appears in the step log when Node.js tries to load the bundled action.
|
|
49
|
+
fix: |
|
|
50
|
+
There are two approaches depending on whether you control the action source code:
|
|
51
|
+
|
|
52
|
+
Option A — Migrate the action to ESM (recommended for new actions):
|
|
53
|
+
Update the action's package.json to "type": "module", convert all require() calls to
|
|
54
|
+
import statements, and recompile/rebundle. Use "module": "ESNext" or "module": "NodeNext"
|
|
55
|
+
in tsconfig.json for TypeScript actions.
|
|
56
|
+
|
|
57
|
+
Option B — Pin @actions/core to v2.x (quick fix for existing actions):
|
|
58
|
+
Pin to the last CommonJS-compatible version: @actions/core@^2.0.3 in package.json.
|
|
59
|
+
This avoids the ESM migration but misses v3 improvements (new APIs, performance).
|
|
60
|
+
|
|
61
|
+
For third-party community actions you don't control: check if the action maintainer has
|
|
62
|
+
published an updated version. If not, pin the action to the last working version tag
|
|
63
|
+
(before they upgraded to @actions/core v3).
|
|
64
|
+
fix_code:
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: 'Pin @actions/core to v2 in package.json (quick fix for existing CommonJS actions)'
|
|
67
|
+
code: |
|
|
68
|
+
# In the action's package.json, pin to v2 (last CommonJS-compatible release)
|
|
69
|
+
# {
|
|
70
|
+
# "dependencies": {
|
|
71
|
+
# "@actions/core": "^2.0.3"
|
|
72
|
+
# }
|
|
73
|
+
# }
|
|
74
|
+
jobs:
|
|
75
|
+
build-action:
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@v4
|
|
79
|
+
|
|
80
|
+
- uses: actions/setup-node@v4
|
|
81
|
+
with:
|
|
82
|
+
node-version: '20'
|
|
83
|
+
|
|
84
|
+
- name: Install pinned dependencies
|
|
85
|
+
run: npm ci
|
|
86
|
+
|
|
87
|
+
- name: Bundle action
|
|
88
|
+
run: npm run build
|
|
89
|
+
|
|
90
|
+
- language: yaml
|
|
91
|
+
label: 'Migrate action to ESM — update tsconfig and entry point for @actions/core v3'
|
|
92
|
+
code: |
|
|
93
|
+
# tsconfig.json for ESM TypeScript action:
|
|
94
|
+
# {
|
|
95
|
+
# "compilerOptions": {
|
|
96
|
+
# "module": "NodeNext",
|
|
97
|
+
# "moduleResolution": "NodeNext",
|
|
98
|
+
# "target": "ES2020"
|
|
99
|
+
# }
|
|
100
|
+
# }
|
|
101
|
+
#
|
|
102
|
+
# package.json:
|
|
103
|
+
# {
|
|
104
|
+
# "type": "module",
|
|
105
|
+
# "dependencies": { "@actions/core": "^3.0.0" }
|
|
106
|
+
# }
|
|
107
|
+
#
|
|
108
|
+
# In source, use ESM imports (not require):
|
|
109
|
+
# import * as core from '@actions/core';
|
|
110
|
+
jobs:
|
|
111
|
+
build-esm-action:
|
|
112
|
+
runs-on: ubuntu-latest
|
|
113
|
+
steps:
|
|
114
|
+
- uses: actions/checkout@v4
|
|
115
|
+
- uses: actions/setup-node@v4
|
|
116
|
+
with:
|
|
117
|
+
node-version: '20'
|
|
118
|
+
- name: Build ESM action
|
|
119
|
+
run: npm ci && npm run build
|
|
120
|
+
prevention:
|
|
121
|
+
- 'Always check the @actions/core RELEASES.md when upgrading — v3.0.0 is an ESM-only breaking change requiring migration'
|
|
122
|
+
- 'TypeScript actions compiled with "module": "commonjs" in tsconfig.json will produce require() calls even if source uses import — set "module": "NodeNext" for ESM compatibility'
|
|
123
|
+
- 'Use Dependabot or Renovate with a major version constraint so @actions/core upgrades are reviewed before merging'
|
|
124
|
+
- 'Bundle your action with ncc using --esm flag or use esbuild with format=esm to produce ESM-compatible bundles'
|
|
125
|
+
- 'Test bundled actions locally with node dist/index.js before publishing to catch ERR_REQUIRE_ESM before CI fails'
|
|
126
|
+
docs:
|
|
127
|
+
- url: 'https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md'
|
|
128
|
+
label: '@actions/core RELEASES.md — v3.0.0 ESM-only breaking change'
|
|
129
|
+
- url: 'https://github.com/actions/toolkit/issues/2294'
|
|
130
|
+
label: 'actions/toolkit #2294 — No "exports" main defined in @actions/core/package.json @v3 (8 reactions)'
|
|
131
|
+
- url: 'https://github.com/actions/toolkit/issues/2287'
|
|
132
|
+
label: 'actions/toolkit #2287 — Outdated require() docs for ESM packages (5 reactions)'
|
|
133
|
+
- url: 'https://github.com/actions/typescript-action/issues/1165'
|
|
134
|
+
label: 'actions/typescript-action #1165 — Example for @actions/core >= 3 migration'
|
|
135
|
+
- url: 'https://nodejs.org/api/esm.html#interoperability-with-commonjs'
|
|
136
|
+
label: 'Node.js docs — ESM/CommonJS interoperability'
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
id: runner-environment-133
|
|
2
|
+
title: 'ARM64 runners: downloaded x86_64 binary fails with "Exec format error" — wrong architecture'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- arm64
|
|
7
|
+
- aarch64
|
|
8
|
+
- binary
|
|
9
|
+
- exec-format-error
|
|
10
|
+
- ubuntu-arm
|
|
11
|
+
- architecture
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'cannot execute binary file: Exec format error'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'Exec format error'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'exec.*format error'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- './my-tool: cannot execute binary file: Exec format error'
|
|
21
|
+
- '/usr/local/bin/kubectl: cannot execute binary file: Exec format error'
|
|
22
|
+
- 'bash: ./tool: cannot execute binary file: Exec format error'
|
|
23
|
+
root_cause: |
|
|
24
|
+
GitHub-hosted ubuntu-24.04-arm and ubuntu-22.04-arm runners use ARM64 (aarch64) CPUs.
|
|
25
|
+
The RUNNER_ARCH environment variable returns ARM64 on these runners, not X64.
|
|
26
|
+
|
|
27
|
+
Workflows that download pre-built binaries using hardcoded architecture suffixes like
|
|
28
|
+
linux-amd64, linux-x86_64, or linux-x64 download x86_64 binaries that cannot execute on
|
|
29
|
+
ARM64 hardware. The Linux kernel rejects the binary with "Exec format error" (ENOEXEC)
|
|
30
|
+
because the ELF architecture header in the binary does not match the host CPU.
|
|
31
|
+
|
|
32
|
+
Common patterns that break:
|
|
33
|
+
- Hardcoded URL: https://example.com/tool-linux-amd64.tar.gz
|
|
34
|
+
- Shell variable set once: ARCH="amd64" without checking RUNNER_ARCH
|
|
35
|
+
- Workflow matrix that includes ubuntu-24.04-arm without updating download URLs
|
|
36
|
+
- Third-party scripts that assume x86_64 without ARM64 support
|
|
37
|
+
|
|
38
|
+
This is a silent-ish failure — the binary downloads successfully (HTTP 200), extracts
|
|
39
|
+
without error, but fails only when executed.
|
|
40
|
+
fix: |
|
|
41
|
+
Use the RUNNER_ARCH environment variable or uname -m to detect architecture and select
|
|
42
|
+
the correct binary:
|
|
43
|
+
|
|
44
|
+
- RUNNER_ARCH is X64 on x86_64 runners, ARM64 on ARM64 runners
|
|
45
|
+
- uname -m returns x86_64 on x86_64, aarch64 on ARM64
|
|
46
|
+
|
|
47
|
+
Normalize to the convention used by the tool's release naming (amd64/arm64 or x86_64/aarch64).
|
|
48
|
+
Where possible, prefer using setup-* actions that handle multi-architecture automatically.
|
|
49
|
+
fix_code:
|
|
50
|
+
- language: yaml
|
|
51
|
+
label: 'Detect architecture and download correct binary'
|
|
52
|
+
code: |
|
|
53
|
+
jobs:
|
|
54
|
+
install-tool:
|
|
55
|
+
runs-on: ${{ matrix.runner }}
|
|
56
|
+
strategy:
|
|
57
|
+
matrix:
|
|
58
|
+
runner: [ubuntu-24.04, ubuntu-24.04-arm]
|
|
59
|
+
steps:
|
|
60
|
+
- name: Detect architecture and download tool
|
|
61
|
+
run: |
|
|
62
|
+
ARCH=$(uname -m)
|
|
63
|
+
case "$ARCH" in
|
|
64
|
+
x86_64) DL_ARCH="amd64" ;;
|
|
65
|
+
aarch64) DL_ARCH="arm64" ;;
|
|
66
|
+
*) echo "Unsupported arch: $ARCH"; exit 1 ;;
|
|
67
|
+
esac
|
|
68
|
+
curl -sSL "https://example.com/tool-linux-${DL_ARCH}.tar.gz" | tar xz
|
|
69
|
+
sudo mv tool /usr/local/bin/
|
|
70
|
+
|
|
71
|
+
- language: yaml
|
|
72
|
+
label: 'Use RUNNER_ARCH environment variable (GitHub-native)'
|
|
73
|
+
code: |
|
|
74
|
+
jobs:
|
|
75
|
+
install-tool:
|
|
76
|
+
runs-on: ubuntu-24.04-arm
|
|
77
|
+
steps:
|
|
78
|
+
- name: Install tool using RUNNER_ARCH
|
|
79
|
+
run: |
|
|
80
|
+
# RUNNER_ARCH is X64 or ARM64 (uppercase)
|
|
81
|
+
if [ "$RUNNER_ARCH" = "ARM64" ]; then
|
|
82
|
+
DL_ARCH="arm64"
|
|
83
|
+
else
|
|
84
|
+
DL_ARCH="amd64"
|
|
85
|
+
fi
|
|
86
|
+
curl -sSL "https://releases.example.com/tool-linux-${DL_ARCH}" -o /usr/local/bin/tool
|
|
87
|
+
chmod +x /usr/local/bin/tool
|
|
88
|
+
prevention:
|
|
89
|
+
- 'Never hardcode linux-amd64 or linux-x86_64 in binary download URLs — always parameterize by architecture'
|
|
90
|
+
- 'Prefer setup-* GitHub Actions (setup-node, setup-go, setup-java) over manual binary downloads — they handle ARM64 automatically'
|
|
91
|
+
- 'Add ubuntu-24.04-arm to your test matrix to catch architecture issues before they affect users'
|
|
92
|
+
- 'Check tool release pages for ARM64 availability before migrating to ARM64 runners — not all tools provide arm64 builds'
|
|
93
|
+
- 'Use RUNNER_ARCH (GitHub variable) or uname -m (portable) to detect architecture in shell scripts'
|
|
94
|
+
docs:
|
|
95
|
+
- url: 'https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources'
|
|
96
|
+
label: 'GitHub-hosted runners — supported runner types including ARM64'
|
|
97
|
+
- url: 'https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables'
|
|
98
|
+
label: 'Default environment variables — RUNNER_ARCH values'
|
|
99
|
+
- url: 'https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-ARM64-Readme.md'
|
|
100
|
+
label: 'ubuntu-24.04-arm runner software report'
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
id: runner-environment-135
|
|
2
|
+
title: 'ubuntu-24.04: no swap memory — memory-intensive builds killed with exit code 137 (OOM)'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- oom
|
|
7
|
+
- memory
|
|
8
|
+
- swap
|
|
9
|
+
- ubuntu-24
|
|
10
|
+
- exit-137
|
|
11
|
+
- killed
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'Error 137'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'exit code 137'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: '^Killed\s*$'
|
|
18
|
+
flags: 'm'
|
|
19
|
+
- regex: 'out of memory|OOM|oom.killer'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'make: *** [Makefile:42: build] Error 137'
|
|
23
|
+
- 'Killed'
|
|
24
|
+
- 'Process exited with code 137'
|
|
25
|
+
- 'error Command failed with exit code 137'
|
|
26
|
+
- 'npm ERR! code 137'
|
|
27
|
+
root_cause: |
|
|
28
|
+
GitHub-hosted ubuntu-24.04 runners provide approximately 29GB RAM but have no swap space.
|
|
29
|
+
Ubuntu 22.04 runners provided about 6GB of swap as overflow capacity. When a job exhausts
|
|
30
|
+
physical RAM, the Linux OOM killer terminates the offending process with SIGKILL (signal 9),
|
|
31
|
+
producing exit code 137 (128 + 9).
|
|
32
|
+
|
|
33
|
+
The killed process may be:
|
|
34
|
+
- Node.js during webpack/esbuild/rollup bundle generation for large frontend projects
|
|
35
|
+
- Gradle during Android AAB/APK build or large multi-module Java projects
|
|
36
|
+
- Electron Forge/Builder packaging step
|
|
37
|
+
- C/C++ linker (ld) linking large binaries with many object files
|
|
38
|
+
- Cargo (Rust) compiling with high parallelism or many dependencies
|
|
39
|
+
|
|
40
|
+
The failure is often hard to diagnose because:
|
|
41
|
+
- No explicit "Out of Memory" message appears in the workflow log
|
|
42
|
+
- The step log simply shows "Killed" and exit code 137
|
|
43
|
+
- The runner does not report memory usage in the workflow summary
|
|
44
|
+
|
|
45
|
+
If the same workflow runs on ubuntu-22.04 without issues, missing swap is the likely cause.
|
|
46
|
+
fix: |
|
|
47
|
+
Option A — Add a swap file manually before the memory-intensive step. This adds ~30 seconds
|
|
48
|
+
to job setup but provides 8GB of overflow capacity:
|
|
49
|
+
|
|
50
|
+
Option B — Reduce peak memory usage:
|
|
51
|
+
- Node.js: pass --max-old-space-size=N (MB) to node or set NODE_OPTIONS env var
|
|
52
|
+
- Gradle: reduce org.gradle.jvmargs heap in gradle.properties
|
|
53
|
+
- Cargo: set CARGO_BUILD_JOBS=2 to reduce parallel compilation
|
|
54
|
+
- webpack: use --parallel false or reduce splitChunks settings
|
|
55
|
+
|
|
56
|
+
Option C — Use a larger GitHub-hosted runner with more RAM (requires paid plan):
|
|
57
|
+
ubuntu-24.04 with 64GB RAM is available as a larger runner.
|
|
58
|
+
fix_code:
|
|
59
|
+
- language: yaml
|
|
60
|
+
label: 'Add 8GB swap file before memory-intensive build step'
|
|
61
|
+
code: |
|
|
62
|
+
jobs:
|
|
63
|
+
build:
|
|
64
|
+
runs-on: ubuntu-24.04
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
|
|
68
|
+
- name: Add swap space
|
|
69
|
+
run: |
|
|
70
|
+
sudo fallocate -l 8G /swapfile
|
|
71
|
+
sudo chmod 600 /swapfile
|
|
72
|
+
sudo mkswap /swapfile
|
|
73
|
+
sudo swapon /swapfile
|
|
74
|
+
swapon --show
|
|
75
|
+
free -h
|
|
76
|
+
|
|
77
|
+
- name: Build (memory-intensive)
|
|
78
|
+
run: npm run build
|
|
79
|
+
|
|
80
|
+
- language: yaml
|
|
81
|
+
label: 'Reduce Node.js memory usage with --max-old-space-size'
|
|
82
|
+
code: |
|
|
83
|
+
jobs:
|
|
84
|
+
build:
|
|
85
|
+
runs-on: ubuntu-24.04
|
|
86
|
+
env:
|
|
87
|
+
NODE_OPTIONS: '--max-old-space-size=6144'
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
- uses: actions/setup-node@v4
|
|
91
|
+
with:
|
|
92
|
+
node-version: '20'
|
|
93
|
+
- run: npm ci
|
|
94
|
+
- run: npm run build
|
|
95
|
+
|
|
96
|
+
- language: yaml
|
|
97
|
+
label: 'Reduce Gradle heap for Android/Java builds'
|
|
98
|
+
code: |
|
|
99
|
+
jobs:
|
|
100
|
+
build:
|
|
101
|
+
runs-on: ubuntu-24.04
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v4
|
|
104
|
+
|
|
105
|
+
- name: Set Gradle memory limits
|
|
106
|
+
run: |
|
|
107
|
+
mkdir -p ~/.gradle
|
|
108
|
+
echo 'org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m' >> ~/.gradle/gradle.properties
|
|
109
|
+
|
|
110
|
+
- name: Build APK
|
|
111
|
+
run: ./gradlew assembleRelease
|
|
112
|
+
prevention:
|
|
113
|
+
- 'Test builds on ubuntu-24.04 explicitly — do not assume ubuntu-22.04 memory behavior transfers'
|
|
114
|
+
- 'Add a swap file as a build step when migrating large builds to ubuntu-24.04'
|
|
115
|
+
- 'Set NODE_OPTIONS=--max-old-space-size as a job-level env var for Node.js heavy workflows'
|
|
116
|
+
- 'Monitor build memory usage locally: /usr/bin/time -v npm run build shows peak RSS'
|
|
117
|
+
- 'Exit code 137 with no explicit error is the canonical indicator of OOM kill — add this as a diagnostic check'
|
|
118
|
+
docs:
|
|
119
|
+
- url: 'https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources'
|
|
120
|
+
label: 'GitHub-hosted runner hardware specs — RAM and storage per runner type'
|
|
121
|
+
- url: 'https://github.com/actions/runner-images/issues'
|
|
122
|
+
label: 'runner-images issues — search "OOM" or "exit 137" for community reports'
|
|
123
|
+
- url: 'https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes'
|
|
124
|
+
label: 'Node.js CLI docs — --max-old-space-size option'
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
id: runner-environment-134
|
|
2
|
+
title: 'ubuntu-24.04: openjdk-11-jdk has no installation candidate — Java 11 removed from Ubuntu 24 repos'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- java
|
|
7
|
+
- openjdk
|
|
8
|
+
- ubuntu-24
|
|
9
|
+
- apt
|
|
10
|
+
- java-11
|
|
11
|
+
- noble
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'Package .openjdk-11.*has no installation candidate'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'openjdk-11-jdk.*no installation candidate'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'E: Package .openjdk-11'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'E: Package ''openjdk-11-jdk'' has no installation candidate'
|
|
21
|
+
- 'E: Package ''openjdk-11-jre'' has no installation candidate'
|
|
22
|
+
- 'E: Unable to locate package openjdk-11-jdk'
|
|
23
|
+
root_cause: |
|
|
24
|
+
Ubuntu 24.04 LTS (Noble Numbat) dropped OpenJDK 11 from its official package repositories.
|
|
25
|
+
The minimum available Java version via apt on Ubuntu 24.04 is OpenJDK 17 (openjdk-17-jdk)
|
|
26
|
+
along with OpenJDK 21 (openjdk-21-jdk). OpenJDK 11 packages that existed in Ubuntu 22.04
|
|
27
|
+
(Jammy) are not present in Ubuntu 24.04 (Noble) main or universe repos.
|
|
28
|
+
|
|
29
|
+
Workflows that install Java via apt-get will fail:
|
|
30
|
+
sudo apt-get install -y openjdk-11-jdk # Fails on ubuntu-24.04
|
|
31
|
+
sudo apt-get install -y openjdk-11-jre # Fails on ubuntu-24.04
|
|
32
|
+
|
|
33
|
+
This affects workflows that:
|
|
34
|
+
- Directly install OpenJDK via apt without using actions/setup-java
|
|
35
|
+
- Use Docker images based on ubuntu:24.04 inside workflow steps
|
|
36
|
+
- Run scripts that call apt-get install openjdk-11* expecting Ubuntu 22 behavior
|
|
37
|
+
|
|
38
|
+
Note: Java 11 is still supported under long-term support plans but must be obtained from
|
|
39
|
+
third-party sources (Adoptium/Temurin, Amazon Corretto, Azul Zulu) rather than Ubuntu repos.
|
|
40
|
+
fix: |
|
|
41
|
+
Use actions/setup-java to install any Java version including 11. The action downloads from
|
|
42
|
+
a distribution vendor (Temurin, Corretto, Zulu, etc.) rather than Ubuntu packages, making
|
|
43
|
+
it distribution-independent and supporting Java 11 on ubuntu-24.04.
|
|
44
|
+
|
|
45
|
+
Never use apt-get to install Java on GitHub-hosted runners — always use actions/setup-java
|
|
46
|
+
which handles version discovery, caching, JAVA_HOME configuration, and multi-platform support.
|
|
47
|
+
fix_code:
|
|
48
|
+
- language: yaml
|
|
49
|
+
label: 'Use actions/setup-java to install Java 11 (works on ubuntu-24.04)'
|
|
50
|
+
code: |
|
|
51
|
+
jobs:
|
|
52
|
+
build:
|
|
53
|
+
runs-on: ubuntu-24.04
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
|
|
57
|
+
- uses: actions/setup-java@v4
|
|
58
|
+
with:
|
|
59
|
+
java-version: '11'
|
|
60
|
+
distribution: 'temurin'
|
|
61
|
+
cache: 'maven'
|
|
62
|
+
|
|
63
|
+
- name: Build with Maven
|
|
64
|
+
run: mvn -B package --file pom.xml
|
|
65
|
+
|
|
66
|
+
- language: yaml
|
|
67
|
+
label: 'Multi-version Java matrix — test across Java 11, 17, 21'
|
|
68
|
+
code: |
|
|
69
|
+
jobs:
|
|
70
|
+
test:
|
|
71
|
+
runs-on: ubuntu-24.04
|
|
72
|
+
strategy:
|
|
73
|
+
matrix:
|
|
74
|
+
java-version: ['11', '17', '21']
|
|
75
|
+
steps:
|
|
76
|
+
- uses: actions/checkout@v4
|
|
77
|
+
|
|
78
|
+
- uses: actions/setup-java@v4
|
|
79
|
+
with:
|
|
80
|
+
java-version: ${{ matrix.java-version }}
|
|
81
|
+
distribution: 'temurin'
|
|
82
|
+
|
|
83
|
+
- name: Run tests
|
|
84
|
+
run: mvn test
|
|
85
|
+
prevention:
|
|
86
|
+
- 'Always use actions/setup-java to install Java on GitHub-hosted runners — never rely on apt-get for Java'
|
|
87
|
+
- 'Pin the Java distribution explicitly (temurin, corretto, zulu) to avoid resolution differences across Ubuntu versions'
|
|
88
|
+
- 'Test workflows on ubuntu-24.04 explicitly when migrating from ubuntu-22.04 or ubuntu-20.04'
|
|
89
|
+
- 'Check Ubuntu package availability with https://packages.ubuntu.com before relying on apt for any tool installation'
|
|
90
|
+
- 'Validate Java availability in your workflow with: java -version && javac -version as an early smoke check'
|
|
91
|
+
docs:
|
|
92
|
+
- url: 'https://github.com/actions/setup-java'
|
|
93
|
+
label: 'actions/setup-java — install Java on any GitHub-hosted runner'
|
|
94
|
+
- url: 'https://packages.ubuntu.com/noble/'
|
|
95
|
+
label: 'Ubuntu 24.04 (Noble) package search — verify available package versions'
|
|
96
|
+
- url: 'https://adoptium.net/temurin/releases/?version=11'
|
|
97
|
+
label: 'Eclipse Temurin — Java 11 LTS builds for all platforms'
|
|
98
|
+
- url: 'https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2404-Readme.md'
|
|
99
|
+
label: 'ubuntu-24.04 runner software report — pre-installed Java versions'
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
id: runner-environment-132
|
|
2
|
+
title: 'windows-2025 runner: .NET 6 SDK removed — NETSDK1045 when targeting net6.0'
|
|
3
|
+
category: runner-environment
|
|
4
|
+
severity: error
|
|
5
|
+
tags:
|
|
6
|
+
- dotnet
|
|
7
|
+
- windows-2025
|
|
8
|
+
- net6
|
|
9
|
+
- sdk
|
|
10
|
+
- netsdk1045
|
|
11
|
+
- eol
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'NETSDK1045.*\.NET 6\.0'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'does not support targeting.*\.NET 6'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'error NETSDK1045'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
error_messages:
|
|
20
|
+
- 'error NETSDK1045: The current .NET SDK does not support targeting .NET 6.0.'
|
|
21
|
+
- 'error NETSDK1045: The current .NET SDK does not support targeting .NET 6.0. Either target .NET 8.0 or higher, or use a .NET SDK that supports .NET 6.0.'
|
|
22
|
+
root_cause: |
|
|
23
|
+
.NET 6 reached end-of-life on November 12, 2024. The windows-2025 runner image does not
|
|
24
|
+
include the .NET 6 SDK or runtime. Pre-installed .NET SDKs on windows-2025 are .NET 8
|
|
25
|
+
and .NET 9 only.
|
|
26
|
+
|
|
27
|
+
Workflows using dotnet build, dotnet test, or dotnet publish that target net6.0 TFM fail
|
|
28
|
+
with NETSDK1045 because no installed SDK can build or run .NET 6 targets. This affects:
|
|
29
|
+
- Projects with <TargetFramework>net6.0</TargetFramework> in their .csproj
|
|
30
|
+
- Multi-target projects including net6.0 in <TargetFrameworks>
|
|
31
|
+
- Workflows that run dotnet run with a net6.0 project
|
|
32
|
+
|
|
33
|
+
The windows-2022 runner still includes .NET 6 for legacy compatibility, so workflows using
|
|
34
|
+
runs-on: windows-2022 are unaffected. The breakage appears when migrating to windows-2025
|
|
35
|
+
or when windows-latest switches to windows-2025.
|
|
36
|
+
fix: |
|
|
37
|
+
Option A (recommended): Upgrade the project's TargetFramework to net8.0 or net9.0. .NET 8
|
|
38
|
+
is the current LTS release and is pre-installed on windows-2025.
|
|
39
|
+
|
|
40
|
+
Option B (legacy support): Use actions/setup-dotnet to explicitly install the .NET 6 SDK.
|
|
41
|
+
Note: .NET 6 is EOL and receives no security patches — this option is not recommended for
|
|
42
|
+
production workloads.
|
|
43
|
+
|
|
44
|
+
Option C (short-term): Pin to windows-2022 runner temporarily while upgrading.
|
|
45
|
+
fix_code:
|
|
46
|
+
- language: yaml
|
|
47
|
+
label: 'Option A — upgrade target framework to .NET 8 LTS (recommended)'
|
|
48
|
+
code: |
|
|
49
|
+
# In your .csproj, update:
|
|
50
|
+
# <TargetFramework>net8.0</TargetFramework>
|
|
51
|
+
# Then in your workflow:
|
|
52
|
+
jobs:
|
|
53
|
+
build:
|
|
54
|
+
runs-on: windows-2025
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/checkout@v4
|
|
57
|
+
|
|
58
|
+
- uses: actions/setup-dotnet@v4
|
|
59
|
+
with:
|
|
60
|
+
dotnet-version: '8.0.x'
|
|
61
|
+
|
|
62
|
+
- name: Build
|
|
63
|
+
run: dotnet build --configuration Release
|
|
64
|
+
|
|
65
|
+
- language: yaml
|
|
66
|
+
label: 'Option B — explicitly install .NET 6 SDK (EOL, not recommended for production)'
|
|
67
|
+
code: |
|
|
68
|
+
jobs:
|
|
69
|
+
build:
|
|
70
|
+
runs-on: windows-2025
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/checkout@v4
|
|
73
|
+
|
|
74
|
+
- uses: actions/setup-dotnet@v4
|
|
75
|
+
with:
|
|
76
|
+
dotnet-version: |
|
|
77
|
+
6.0.x
|
|
78
|
+
8.0.x
|
|
79
|
+
|
|
80
|
+
- name: Build
|
|
81
|
+
run: dotnet build --framework net6.0
|
|
82
|
+
prevention:
|
|
83
|
+
- 'Audit all TargetFramework and TargetFrameworks values before migrating to windows-2025'
|
|
84
|
+
- 'Monitor the .NET release lifecycle at https://dotnet.microsoft.com/platform/support/policy for upcoming EOL dates'
|
|
85
|
+
- 'Use Dependabot or Renovate to track .NET SDK versions referenced in global.json or setup-dotnet steps'
|
|
86
|
+
- 'Check the windows-2025 runner software report (runner-images/Windows2025-Readme.md) before migration to see pre-installed SDKs'
|
|
87
|
+
- 'Set up a CI matrix that tests both windows-2022 and windows-2025 during migration periods'
|
|
88
|
+
docs:
|
|
89
|
+
- url: 'https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md'
|
|
90
|
+
label: 'windows-2025 runner software report — pre-installed SDK versions'
|
|
91
|
+
- url: 'https://dotnet.microsoft.com/platform/support/policy/dotnet-core'
|
|
92
|
+
label: '.NET release lifecycle and EOL schedule'
|
|
93
|
+
- url: 'https://github.com/actions/setup-dotnet'
|
|
94
|
+
label: 'actions/setup-dotnet — install specific .NET SDK versions'
|
|
95
|
+
- url: 'https://github.com/actions/runner-images/discussions'
|
|
96
|
+
label: 'GitHub runner-images discussions — windows-2025 migration issues'
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
id: yaml-syntax-046
|
|
2
|
+
title: 'on.schedule timezone field causes actionlint and third-party parsers to report "expected cron key" syntax error'
|
|
3
|
+
category: yaml-syntax
|
|
4
|
+
severity: warning
|
|
5
|
+
tags:
|
|
6
|
+
- schedule
|
|
7
|
+
- cron
|
|
8
|
+
- timezone
|
|
9
|
+
- actionlint
|
|
10
|
+
- linting
|
|
11
|
+
- scorecard-action
|
|
12
|
+
patterns:
|
|
13
|
+
- regex: 'expected "cron" key for element of "schedule" section but got "timezone"'
|
|
14
|
+
flags: 'i'
|
|
15
|
+
- regex: 'unable to parse github workflow.*timezone'
|
|
16
|
+
flags: 'i'
|
|
17
|
+
- regex: 'workflow verification failed.*timezone.*syntax-check'
|
|
18
|
+
flags: 'i'
|
|
19
|
+
- regex: '\[syntax-check\].*timezone'
|
|
20
|
+
flags: 'i'
|
|
21
|
+
error_messages:
|
|
22
|
+
- 'expected "cron" key for element of "schedule" section but got "timezone" [syntax-check]'
|
|
23
|
+
- 'error sending scorecard results to webapp: http response 400, status: 400 Bad Request, error: {"code":400,"message":"workflow verification failed: unable to parse github workflow: [:9:7: expected \"cron\" key for element of \"schedule\" section but got \"timezone\" [syntax-check]]"}'
|
|
24
|
+
- 'on.schedule[0]: unexpected key "timezone"'
|
|
25
|
+
root_cause: |
|
|
26
|
+
GitHub Actions added IANA timezone support for scheduled workflows in March 2026
|
|
27
|
+
(announced in the Late March 2026 changelog). The new syntax allows specifying a timezone
|
|
28
|
+
alongside the cron expression:
|
|
29
|
+
|
|
30
|
+
on:
|
|
31
|
+
schedule:
|
|
32
|
+
- cron: '30 5 * * 1-5'
|
|
33
|
+
timezone: "America/New_York"
|
|
34
|
+
|
|
35
|
+
However, this feature was not immediately recognized by external workflow-parsing tools:
|
|
36
|
+
|
|
37
|
+
1. **actionlint** — The widely-used GitHub Actions linting tool (used in many CI pipelines
|
|
38
|
+
as a pre-commit or CI check) did not support the timezone key until version 0.7.4
|
|
39
|
+
(released March 30, 2026). Earlier versions report the error:
|
|
40
|
+
expected "cron" key for element of "schedule" section but got "timezone" [syntax-check]
|
|
41
|
+
This causes actionlint-based CI checks to fail even though the workflow is valid.
|
|
42
|
+
|
|
43
|
+
2. **ossf/scorecard-action** — The OpenSSF Scorecard action verifies workflow structure
|
|
44
|
+
using an internal parser that did not recognize the timezone key. When scorecard-action
|
|
45
|
+
runs on a workflow that contains `timezone:`, it returns HTTP 400 from the Scorecard API:
|
|
46
|
+
workflow verification failed: unable to parse github workflow: [...timezone [syntax-check]]
|
|
47
|
+
This causes the scorecard CI job to fail on otherwise-valid workflows.
|
|
48
|
+
|
|
49
|
+
3. **GitHub VS Code extension** — The vscode-github-actions extension (v0.29.1 and earlier)
|
|
50
|
+
marks timezone as an "unexpected value" in the schema validation overlay, producing
|
|
51
|
+
squiggly underlines even though the workflow runs correctly.
|
|
52
|
+
|
|
53
|
+
The root issue is that the new timezone key was added to GitHub's workflow syntax faster
|
|
54
|
+
than third-party tooling could update their schema definitions.
|
|
55
|
+
fix: |
|
|
56
|
+
Upgrade the affected tools to versions that support the timezone key:
|
|
57
|
+
|
|
58
|
+
1. **actionlint**: Upgrade to version 0.7.4 or later. Pin the actionlint version in your
|
|
59
|
+
CI workflow to avoid surprise failures on future schema changes.
|
|
60
|
+
|
|
61
|
+
2. **ossf/scorecard-action**: Upgrade to the latest version. The Scorecard API was updated
|
|
62
|
+
to recognize the timezone key. If you cannot upgrade, temporarily remove the timezone
|
|
63
|
+
field from your schedule — or use the @latest tag to stay on the most recent release.
|
|
64
|
+
|
|
65
|
+
3. **GitHub VS Code extension**: Upgrade to the latest version from the VS Code marketplace.
|
|
66
|
+
The false-positive schema warning has no runtime effect and does not affect workflow
|
|
67
|
+
execution.
|
|
68
|
+
|
|
69
|
+
If you are blocked from upgrading tools (e.g., in a corporate environment), you can work
|
|
70
|
+
around the linting error by keeping the cron in UTC and removing the timezone field,
|
|
71
|
+
adjusting the cron expression offset manually for the desired local time.
|
|
72
|
+
fix_code:
|
|
73
|
+
- language: yaml
|
|
74
|
+
label: 'Pin actionlint to v0.7.4+ in CI to support the timezone key'
|
|
75
|
+
code: |
|
|
76
|
+
jobs:
|
|
77
|
+
lint:
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
|
|
82
|
+
# Pin actionlint to v0.7.4+ which supports timezone in on.schedule
|
|
83
|
+
- name: Lint GitHub Actions workflows
|
|
84
|
+
uses: rhysd/actionlint@v0.7.4
|
|
85
|
+
with:
|
|
86
|
+
shellcheck: 'false'
|
|
87
|
+
|
|
88
|
+
- language: yaml
|
|
89
|
+
label: 'Valid on.schedule with timezone (requires actionlint 0.7.4+ and updated scorecard-action)'
|
|
90
|
+
code: |
|
|
91
|
+
on:
|
|
92
|
+
schedule:
|
|
93
|
+
# Run at 9 AM Eastern (UTC-5 in winter, UTC-4 in summer)
|
|
94
|
+
# With timezone support: specify local time directly
|
|
95
|
+
- cron: '0 9 * * 1-5'
|
|
96
|
+
timezone: "America/New_York"
|
|
97
|
+
|
|
98
|
+
jobs:
|
|
99
|
+
scheduled-job:
|
|
100
|
+
runs-on: ubuntu-latest
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- run: echo "Running at 9 AM Eastern"
|
|
104
|
+
|
|
105
|
+
- language: yaml
|
|
106
|
+
label: 'Workaround — use UTC offset in cron expression (no timezone key, works with all tool versions)'
|
|
107
|
+
code: |
|
|
108
|
+
on:
|
|
109
|
+
schedule:
|
|
110
|
+
# 9 AM Eastern Standard Time = 14:00 UTC (winter)
|
|
111
|
+
# Adjust manually for DST when needed
|
|
112
|
+
- cron: '0 14 * * 1-5'
|
|
113
|
+
|
|
114
|
+
jobs:
|
|
115
|
+
scheduled-job:
|
|
116
|
+
runs-on: ubuntu-latest
|
|
117
|
+
steps:
|
|
118
|
+
- uses: actions/checkout@v4
|
|
119
|
+
- run: echo "Running at approximately 9 AM Eastern"
|
|
120
|
+
prevention:
|
|
121
|
+
- 'When adopting new GitHub Actions syntax features, check that your CI linting tools (actionlint, mega-linter, super-linter) support the new key before adding it to workflows'
|
|
122
|
+
- 'Pin actionlint to a specific version in CI and bump intentionally — use rhysd/actionlint@v0.7.4 or later for timezone support'
|
|
123
|
+
- 'The vscode-github-actions extension schema squiggly-underline for "timezone" is cosmetic only — the workflow runs correctly on GitHub regardless'
|
|
124
|
+
- 'If using ossf/scorecard-action, always pin to a tagged release rather than @main to avoid unexpected parser failures from scorecard API schema changes'
|
|
125
|
+
docs:
|
|
126
|
+
- url: 'https://github.blog/changelog/2026-03-19-github-actions-late-march-2026-updates/#github-actions-timezone-support-for-scheduled-workflows'
|
|
127
|
+
label: 'GitHub Changelog: Timezone support for scheduled workflows (March 2026)'
|
|
128
|
+
- url: 'https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#onschedule'
|
|
129
|
+
label: 'GitHub Docs: on.schedule syntax including timezone field'
|
|
130
|
+
- url: 'https://github.com/rhysd/actionlint/issues/638'
|
|
131
|
+
label: 'actionlint #638 — Add support for timezone for schedule triggers (13 reactions, fixed in 0.7.4)'
|
|
132
|
+
- url: 'https://github.com/ossf/scorecard-action/issues/1645'
|
|
133
|
+
label: 'scorecard-action #1645 — Upload fails if schedule:timezone is used in a workflow'
|
|
134
|
+
- url: 'https://github.com/github/vscode-github-actions/issues/577'
|
|
135
|
+
label: 'vscode-github-actions #577 — schedule timezone marked as unknown in VS Code extension'
|
package/package.json
CHANGED