@htekdev/actions-debugger 1.0.70 → 1.0.71
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/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,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