ci: move GitHub Actions to their Node 24 majors - #143
Merged
Merged
Conversation
Node 20 reached end-of-life on 2026-04-30, and these pins are all node20 (upload-pages-artifact v3 wraps node20 upload-artifact): actions/checkout v4 -> v7 (6 uses, 4 files) actions/setup-python v5 -> v7 (6 uses, 4 files) actions/upload-artifact v4 -> v7 (refresh-snapshots) actions/download-artifact v4 -> v8 (refresh-snapshots) actions/upload-pages-artifact v3 -> v5 (audit-dashboard) actions/configure-pages v5 -> v6 (audit-dashboard) actions/deploy-pages v4 -> v5 (audit-dashboard) refresh-snapshots notify: download-artifact v5+ unpacks a download that resolves to exactly one artifact straight into path/, with no <name>/ folder, and that includes pattern: downloads. When one canary leg fails (the usual case, as on 2026-09-01) failure.json and builder.log land in failures/ itself, `for dir in failures/*/` finds nothing, and the upstream-break issue is filed without its details, with nothing erroring. The loop now finds each failure.json wherever it landed and reads builder.log beside it, so it no longer depends on the layout. upload-pages-artifact v4+ drops dotfiles by default; the last deployed Pages artifact (94 entries) had none, so nothing is lost. Also adds a grouped weekly github-actions Dependabot config (the repo had none), in the form QuantEcon/actions uses. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟢 Approval recommended
The workflow pin updates are consistent across the repo’s workflows and the notifier change correctly handles both single- and multi-artifact extraction layouts without introducing YAML or shell-script errors.
Pull request overview
This PR updates the repository’s GitHub Actions workflow pins to the Node 24–based major versions and adjusts the refresh-snapshots notifier logic to handle actions/download-artifact’s v5+ single-artifact extraction layout, plus adds a Dependabot configuration to keep GitHub Actions pins current.
Changes:
- Bump
actions/checkoutandactions/setup-pythonpins across all workflows to their Node 24 majors. - Bump artifact/pages actions majors and update the
refresh-snapshotsnotify script to locatefailure.jsonregardless of whether artifacts extract intofailures/orfailures/<artifact>/. - Add grouped weekly Dependabot updates for the
github-actionsecosystem.
File summaries
| File | Description |
|---|---|
| .github/workflows/validate-datasets.yml | Updates action pins to Node 24 majors for the dataset validation matrix workflow. |
| .github/workflows/refresh-snapshots.yml | Updates action pins and fixes notifier artifact discovery to be robust to download-artifact v5+ layout. |
| .github/workflows/consumed-file-check.yml | Updates action pins to Node 24 majors for integrity and catalog freshness checks. |
| .github/workflows/audit-dashboard.yml | Updates action pins (including Pages actions) to Node 24 majors for dashboard build/deploy. |
| .github/dependabot.yml | Adds grouped weekly Dependabot updates for GitHub Actions pins. |
Review details
- Files reviewed: 5/5 changed files
- Comments generated: 0
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Moves every action pin in this repository's four workflows onto its Node 24 major, rewrites the
refresh-snapshotsnotifier so it survives the download-artifact v5+ layout change, and adds a grouped weekly Dependabot config for GitHub Actions. Node 20 reached end-of-life on 2026-04-30; this is data-lectures' part of the fleet-wide Node 24 upgrade approved on 2026-09-18.Pins
Each target's
action.ymlwas read at its ref and declaresruns.using: node24; upload-pages-artifact v5 is a composite whose only inneruses:is upload-artifact v7.0.0, also node24. Nothing is held back here: the fleet's one kept-back action (rossjrw/pr-preview-action, kept until its upstream node24 release, review date 2026-10-31) is not used in this repository, and no workflow here sets a job-levelnode-version.The notifier break, and the change
From v5, download-artifact extracts straight into
path/whenever a download matches exactly one artifact. The condition insrc/download-artifact.tsat v8 isisSingleArtifactDownload || inputs.mergeMultiple || artifacts.length === 1, so it coverspattern:downloads too, not onlyartifact-ids. The notify job downloadspattern: canary-failure-*intofailures/and walkedfailures/*/. When exactly one canary leg fails, which is the usual case (both failing runs behind #115 on 2026-09-01 were the singleus_business_cycle_monthly.csvleg),failure.jsonandbuilder.logland infailures/itself, the glob finds no subfolder, and the upstream-break issue is filed with only its boilerplate: no dataset, no classification, no log. Nothing errors, so notify stays green while the alarm loses its content.No input restores a per-artifact folder for a single artifact in v5+, so the change is on the reading side. The loop now takes its directories from
find failures -type f -name failure.json -exec dirname {} \; | sortand readsbuilder.logbeside eachfailure.json. That does not depend on the layout: one artifact unpacked flat yieldsfailures, several yield onefailures/<name>each, and no artifact at all (plan failed, or a leg failed before its builder ran) leaves nofailures/and yields nothing, as the old glob did.sortkeeps the old glob's alphabetical order, and the loop body is unchanged.Local test of the notifier in both layouts
The notify step's
run:script was extracted straight from the workflow YAML, both this branch's version andmain's, and each was run withbash -e(the runner's default for a step with noshell:), withghstubbed to log its calls and report no open issue. The fixtures were written exactly as the canary step writes them: the samejq -ncall forfailure.json, plus a three-line fakebuilder.log. The test ran on macOS (bash 3.2, BSD find); the runner has bash 5 and GNU find, and the script uses nothing that differs between them (process substitution,while read,find -type f -name -exec dirname). shellcheck reports nothing.main(glob)failures/failure.json,failures/builder.logfailures/canary-failure-gdp_growth_annual/{failure.json,builder.log},failures/canary-failure-us_business_cycle_monthly/{failure.json,builder.log}failures/In every case the stub recorded the same three calls:
gh label create upstream-break ...,gh issue list --label upstream-break ...andgh issue create ... --body-file body.md. The generatedbody.mdfiles follow.main, one artifact unpacked flat: the break (the issue carries no details)This branch, one artifact unpacked flat
This branch, two artifacts in subfolders
Other checks
include-hidden-files: true. The last deployed Pages artifact (run 34809670165, 2026-09-14) archived 94 entries under v3 and none is a dotfile, and Pages uses the workflow build type, so no.nojekyllis needed. This PR'sbuildjob archived the same 94 entries under v5 (the twotarlistings are identical), so nothing is lost.$RUNNER_TEMPthat git config includes, whichgit pushin the workspace still reads; nothing here reads the extraheader. The v7 fork-PR block applies only topull_request_targetandworkflow_run, which no workflow here uses.pip-install, which nothing here uses; every step setspython-version: "3.12".canary-failure-<stem>). v8 fails on a digest mismatch, which is right for an artifact from the same run.Dependabot
Adds
.github/dependabot.yml: the github-actions ecosystem, weekly, with two groups (minor and patch together, majors separately) as QuantEcon/actions does, the⬆️commit prefix the lecture repositories use, andopen-pull-requests-limit: 10. There is no conda stanza because this repository has noenvironment.yml. This is data-lectures' half of the first rider in QuantEcon/workspace-lectures#59; the lecture-wasm PR carries the other half.What CI proves
This PR's own CI runs
validate-datasets.yml(both pandas legs),consumed-file-check.yml(the requiredconsumed-filescheck) and thebuildjob ofaudit-dashboard.yml(itspull_requestpaths filter includes the workflow itself), which between them exercise checkout v7, setup-python v7 and upload-pages-artifact v5. PR check results, all on 7259977:validate (pandas 2.3.3)pass,validate (pandas 3.0.5)pass,consumed-filespass,build(audit-dashboard) pass;deployandnotifyskipped, as they always are on a pull request. The run logs show the runner fetching checkout@v7, setup-python@v7, upload-pages-artifact@v5 and its inner upload-artifact v7.0.0, and no job carries a Node 20 deprecation annotation (the only annotation is GitHub's notice about ubuntu-latest moving to Ubuntu 26).Dispatched on this branch:
refresh-snapshots.yml, run 35319536981, green.planand both canary legs (gdp_growth_annual.csv,us_business_cycle_monthly.csv) ran on checkout v7 and setup-python v7 with no Node 20 deprecation warning;main's last scheduled run (34815181947) carried three.notifyandrefreshwere skipped, as expected: a green run does not exercise the notifier, and nothing was due, so no refresh PR could be opened from this branch.Proven only after merge:
deployjob ofaudit-dashboard.yml, which runs only on push tomain, the weekly schedule or a dispatch. The merge run deploys the dashboard; it was not dispatched from this branch because that would publish a non-mainbuild to the live site.refreshjob (checkout v7 with the persisted token, thengit push), which runs only when a dataset is due. The next isus_business_cycle_monthly.csv, at the first scheduled run on or after 2026-10-01.🤖 Generated with Claude Code