Skip to content

Bring the GitHub Actions up to date, and let Dependabot keep them there - #248

Merged
michakraus merged 3 commits into
mainfrom
update-github-actions
Aug 23, 2026
Merged

Bring the GitHub Actions up to date, and let Dependabot keep them there#248
michakraus merged 3 commits into
mainfrom
update-github-actions

Conversation

@michakraus

@michakraus michakraus commented Aug 23, 2026

Copy link
Copy Markdown
Member

Nothing in .github/workflows/ had been bumped since it was written, and two of the actions had
aged past working.

What was broken

The cache never restored. julia-actions/cache@v1 speaks a cache-service API GitHub has
retired, so every job logged

##[warning]Failed to restore: Cache service responded with 400
Cache not found for input keys: julia-cache;workflow=CI;job=test;os=macOS;version=1.12;…

CI has been running with no dependency cache at all — every job rebuilding and re-precompiling the
whole tree from scratch.

Node 20 was being force-migrated. The runners reported actions/checkout@v4,
julia-actions/setup-julia@v1 and the cache action's bundled actions/cache as targeting Node 20
and being forced onto Node 24.

Three pins were @latest, which is not a moving alias. It is a literal tag, and neither
upstream still moves theirs: julia-actions/setup-julia@latest is a commit from 2024-11-18 matching
no release, and julia-actions/RegisterAction@latest one from 2022-11-30 — older than that action's
own v0.3.2. Both read as if they track upstream and do not.

Bumps

action was now
actions/checkout v4 (CI, Latex), v3 (Documenter) v7
actions/upload-artifact v4 v7
julia-actions/setup-julia v1 (CI), @latest (Documenter, Latex) v3
julia-actions/cache v1 v3
codecov/codecov-action v3 v7
julia-actions/RegisterAction @latest v0.3.2

julia-buildpkg, julia-runtest, julia-processcoverage, julia-docdeploy and TagBot are all
still on their current major and unchanged.

Two behaviour changes

The arch: x64 matrix pin is gone. macOS-latest is aarch64, and setup-julia v3 refuses x64
there unless force-arch is set, because that build runs under Rosetta — not the platform anyone
deploys on. Each runner now gets its native architecture, and the job name loses its - x64
component. Nothing required those names: main's branch protection lists no required status checks.

cache-registries: false, against the action's default — see below. Artifacts, packages,
compiled code and scratchspaces are still cached, which is where the time goes.

Dependabot

.github/dependabot.yml watches github-actions weekly, one PR per action so that a major needing
a workflow change alongside it can be reviewed on its own. Julia dependencies are not included —
Dependabot has no Julia ecosystem, and CompatHelper.yml already opens those nightly.

The registry lag

The [compat] failures on #246 are a stale General snapshot on the Julia package server. There is
no JULIA_PKG_SERVER that avoids it — every official mirror serves the identical tree, in both
flavours, and so do the third-party storage mirrors:

registries.conservative registries.eager
us-east, us-west, eu-central, jp, sg, kr, in, au 4ead4e5d 4ead4e5d
tuna, nju, bfsu 4ead4e5d
General master 81bd456d

4ead4e5d is General as of 18:04 the previous evening — fifteen hours behind, and hours after
AbstractNeuralNetworks 0.7.0 (04:00), NeuralNetworkParameters 0.1.1 (04:12) and
GeometricOptimizers 0.4.1 (06:10) were registered. The lag is at the single storage server they
all pull from, not at the edges.

So CI.yml, Documenter.yml and Latex.yml now add General by git URL before anything resolves:

- name: Take General from git rather than the package server
  run: julia -e 'using Pkg; Pkg.Registry.add(Pkg.RegistrySpec(url = "https://github.com/JuliaRegistries/General.git"))'

JULIA_PKG_SERVER is deliberately left alone — unsetting it would route package tarballs off the
CDN too, and only the registry needs to bypass it. Verified locally: with General added this way,
Pkg.pkg_server() is still https://pkg.julialang.org and
Pkg.add(name = "AbstractNeuralNetworks", version = "0.7") resolves and installs 0.7.0.
julia-buildpkg calls Pkg.Registry.add() on Julia ≥ 1.8, which installs the default registries
only when none are present, so this step wins and nothing is duplicated — confirmed against a depot
that already had the clone.

The cost is a registry fetch per job, which is why cache-registries is false: a restored copy
would only shadow the fresh clone.

🤖 Generated with Claude Code

Nothing here had been bumped since it was written, and two of the actions had
aged past working.

`julia-actions/cache@v1` speaks a cache-service API GitHub has retired, so every
job logged

    ##[warning]Failed to restore: Cache service responded with 400
    Cache not found for input keys: julia-cache;workflow=CI;job=test;...

and CI has been running with no dependency cache at all — every job rebuilding
and re-precompiling the whole tree from scratch. And the runners were force-
migrating `actions/checkout@v4`, `julia-actions/setup-julia@v1` and the cache
action's bundled `actions/cache` off Node 20, which is on a deprecation clock.

Three of the pins were `@latest`, which is not a moving alias — it is a literal
tag, and neither upstream still moves theirs. `julia-actions/setup-julia@latest`
is a commit from November 2024 matching no release, and
`julia-actions/RegisterAction@latest` one from November 2022, older than that
action's own v0.3.2. Both read as if they track upstream and do not.

    actions/checkout                v4, v3 -> v7
    actions/upload-artifact         v4     -> v7
    julia-actions/setup-julia       v1, @latest -> v3
    julia-actions/cache             v1     -> v3
    codecov/codecov-action          v3     -> v7
    julia-actions/RegisterAction    @latest -> v0.3.2

`julia-buildpkg`, `julia-runtest`, `julia-processcoverage`, `julia-docdeploy`
and `TagBot` are all still on their current major.

Two behaviour changes come with this.

The `arch: x64` matrix pin is gone. `macOS-latest` is aarch64, and setup-julia v3
refuses `x64` there unless `force-arch` is set, because that build runs under
Rosetta — which is not the platform anyone deploys on. Each runner now gets its
native architecture, and the job name loses its `- x64` component. Nothing
required those names: `main`'s branch protection lists no required status checks.

`cache-registries: false`, against the action's default. The registry is the one
part of the depot that must not persist between runs. The package server's
General snapshot already lags the registry by hours — a run at 08:01 UTC today
still reported `AbstractNeuralNetworks ... possible versions are: 0.1.0 - 0.6.4`
four hours after 0.7.0 was registered — and caching it on top of that would keep
a freshly registered dependency invisible to CI for days. Artifacts, packages,
compiled code and scratchspaces are still cached, which is where the time goes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 23, 2026 14:11

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

michakraus and others added 2 commits August 23, 2026 23:17
There is no `JULIA_PKG_SERVER` that works. Every official mirror —
us-east, us-west, eu-central, jp, sg, kr, in, au — serves the identical
registry tree, in both the conservative and the eager flavour, and so do
the third-party storage mirrors (tuna, nju, bfsu). Checked this morning
they were all on `4ead4e5d`, which is General as of 18:04 the previous
evening: fifteen hours behind, and hours after `AbstractNeuralNetworks`
0.7.0 (04:00), `NeuralNetworkParameters` 0.1.1 (04:12) and
`GeometricOptimizers` 0.4.1 (06:10) were registered. The lag is at the
single storage server they all pull from, not at the edges, so picking a
different one changes nothing.

Cloning General over git is the only thing that sees a version the moment
it is registered, and it is what #246 needs to resolve at all. The clone
costs a fetch of the registry per job; against jobs that currently cannot
resolve, that is worth paying.

`JULIA_PKG_SERVER` itself is deliberately left alone. Unsetting it would
route package tarballs off the CDN as well, which is not wanted — only the
registry needs to bypass it. Verified locally: with General added by URL,
`Pkg.pkg_server()` is still `https://pkg.julialang.org`, and
`Pkg.add(name = "AbstractNeuralNetworks", version = "0.7")` resolves and
installs 0.7.0.

`julia-buildpkg` calls `Pkg.Registry.add()` on Julia >= 1.8, which installs
the default registries only when none are present, so the step lands before
it and nothing is duplicated — confirmed against a depot that already had
the git clone.

Added to `CI.yml`, `Documenter.yml` and `Latex.yml`, the three workflows
that resolve. `cache-registries` stays false: a restored registry would only
shadow the fresh clone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Same effect as the explicit `Pkg.Registry.add(RegistrySpec(url = ...))`
step this replaces — both end up cloning General over git — but it is the
idiom the sibling repo already runs, it is one `env:` block rather than a
step per workflow, and it needs no reasoning about where it sits relative
to `julia-buildpkg`'s own `Pkg.Registry.add()`.

The objection to it was that an empty `JULIA_PKG_SERVER` routes package
tarballs off the CDN as well, not just the registry. Measured, that costs
nothing worth having: the registry clone is 68 s and 275 MB either way
(it is the same git clone), and installing `HDF5` with its jll artifacts
took 8.8 s without a package server against 10.1 s with one. The CDN is not
carrying the weight here.

`arch: default` comes back with it, again matching SymbolicNeuralNetworks —
the previous commit had dropped the matrix dimension entirely to get off
`x64` on aarch64 macOS, which also dropped the arch component from every job
name. `default` is the runner's own architecture and keeps the names.

`cache-registries: false` stays, which is the one deliberate difference from
the sibling repo. `julia-actions/cache` saves the depot at the end of a job
and restores it at the start of the next, so a cached registry is whatever
the previous run cloned — for a repo whose CI runs a few times a day that is
the same staleness this commit is working around, reintroduced through the
back door. Everything else in the depot is still cached.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Aug 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 66.80%. Comparing base (d908c26) to head (b146301).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #248   +/-   ##
=======================================
  Coverage   66.80%   66.80%           
=======================================
  Files          99       99           
  Lines        2931     2931           
=======================================
  Hits         1958     1958           
  Misses        973      973           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@michakraus
michakraus merged commit afde98f into main Aug 23, 2026
12 of 15 checks passed
@michakraus
michakraus deleted the update-github-actions branch August 23, 2026 15:50
michakraus added a commit that referenced this pull request Aug 23, 2026
The four upstream releases this one's `[compat]` points at are all in the General
registry as of 2026-08-23 — `AbstractNeuralNetworks` 0.7.0 at 04:00 UTC,
`NeuralNetworkParameters` 0.1.1 at 04:12, `GeometricOptimizers` 0.4.1 at 06:10
and `SymbolicNeuralNetworks` 0.6.0 at 16:11. The *Merge order* note said the last
of those was outstanding and that CI failing at `Pkg.instantiate` was expected;
both are spent, so it is replaced by what actually resolves. Verified locally:
`Pkg.update()` against the git registry takes ANN 0.7.0, NNP 0.1.1, GO 0.4.2 and
SNN 0.6.0 with nothing `dev`'d, and LazyArrays floats from 2.3.2 to 2.12.0 —
which is the `"=2.3.2"` pin's removal doing what the entry for it claims.

The section also gains a preamble, in the shape 0.5.0's has: the parameter
container moving out to its own package, Zygote 0.7 as the other half, and the
three exports that go.

Two changes the section did not mention, both infrastructure rather than
package, now have entries: the GitHub Actions bumps of #248 — including that
`julia-actions/cache@v1` had left CI with no dependency cache at all, and that
dropping the `arch: x64` pin renames every job — and the `JULIA_PKG_SERVER=""`
registry workaround. That one is still needed: the served snapshot
(`4ead4e5df816`) stops at `AbstractNeuralNetworks` 0.6.4 and
`SymbolicNeuralNetworks` 0.5.0, both excluded by this release's bounds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

2 participants