Skip to content

ci(deps): bump the github-actions group and migrate changesets to v2 - #233

Merged
Bccorb merged 1 commit into
mainfrom
ci/bump-github-actions
Aug 31, 2026
Merged

ci(deps): bump the github-actions group and migrate changesets to v2#233
Bccorb merged 1 commit into
mainfrom
ci/bump-github-actions

Conversation

@Bccorb

@Bccorb Bccorb commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Supersedes #200. Same ten action bumps, plus the config migration one of them requires and a rebase that keeps a CI step #200 would have removed.

Why the bare bump was not safe

changesets/action v2 renamed every input release.yml passes, and renamed the output the release chain is gated on. Unknown inputs are ignored rather than rejected, so none of this would have failed loudly.

v1 v2
version: version-script:
title: pr-title:
commit: commit-message:
GITHUB_TOKEN env github-token: input
outputs.hasChangesets outputs.has-changesets

The output rename is the serious one. Tag release is gated on steps.changesets.outputs.hasChangesets == 'false', which under v2 reads as empty, never equals 'false', and never runs. No tag means no GitHub release, and publish-image is gated on new_tag == 'true', so no signed image either. The release pipeline would have gone quiet without a single red check.

The input renames are milder but still wrong: the version PR would have been titled Version Packages, which commitlint rejects.

Read against the v2 action.yml rather than inferred. The gate uses index syntax because the new name is hyphenated.

The stale-branch problem

#200 was cut before #218 landed, so merging it would have deleted the Check changeset bump level step from ci.yml, the guard that keeps a major changeset from releasing 1.0.0 as a side effect. This branch applies the bumps to current main instead, so that step survives.

The other nine

Checked each against its own action.yml for the inputs these workflows actually pass:

  • docker/build-push-action v7 still takes sbom, provenance, load, and still emits digest, which the cosign signing step consumes
  • aquasecurity/trivy-action v0.36.0 still takes image-ref, format, exit-code, severity, ignore-unfixed, skip-dirs, output
  • docker/metadata-action v6, docker/login-action v4, docker/setup-buildx-action v4 unchanged for our usage
  • actions/checkout v7, actions/setup-node v7, codecov/codecov-action v7, github/codeql-action v4 were all exercised green by CI on ci(deps): bump the github-actions group across 1 directory with 10 updates #200 itself

Worth being explicit about the coverage gap: a pull request only runs ci.yml and codeql.yml. docker-publish.yml and release.yml run on tag push and push to main, so nothing here proves them at PR time. That is why the changesets break needed reading rather than testing, and it is the same gap that lets a bad bump reach the release path unnoticed.

Verification

  • actionlint over all five workflows: clean, exit 0. This is what validates the outputs['has-changesets'] expression.
  • Full local gate via the pre-commit hook: lint, format, typecheck, 1194 tests, coverage, build, all passing.

Takes the ten action bumps from the Dependabot group and adds the config
migration changesets/action v2 requires, which the bump alone does not carry.

changesets/action v2 renamed every input this workflow passes: version to
version-script, title to pr-title, commit to commit-message. It also stopped
reading GITHUB_TOKEN from the environment in favour of a github-token input.
Unknown inputs are ignored rather than rejected, so on the bare bump the version
PR would have been titled "Version Packages", which commitlint rejects.

More seriously, the hasChangesets output is now has-changesets. The old name
reads as empty, so "Tag release" would never have run, and with no tag there is
no GitHub release and no published image. The whole release chain would have
gone quiet without failing.

Verified that the other nine keep every input these workflows use: build-push
v7 still takes sbom, provenance and load and still emits digest for the cosign
step; trivy v0.36.0 still takes image-ref, format, exit-code, severity,
ignore-unfixed, skip-dirs and output; metadata v6, login v4 and buildx v4 are
unchanged for our usage. ci.yml and codeql.yml were exercised by CI on the
Dependabot PR itself; docker-publish and release only run post-merge.

Rebased onto current main rather than merging the Dependabot branch, which was
cut before the pre-1.0 changeset guard landed and would have removed it.
@Bccorb
Bccorb merged commit dc75a36 into main Aug 31, 2026
4 checks passed
@Bccorb
Bccorb deleted the ci/bump-github-actions branch August 31, 2026 13:11
Bccorb added a commit that referenced this pull request Aug 31, 2026
A pull request only runs ci.yml and codeql.yml. Nothing reads release.yml or
docker-publish.yml until they run for real on a tag or a push to main, which is
how a broken release gate would reach main with every check green. This adds the
one job that parses all five workflows on every pull request.

Verified against deliberate regressions: it catches an undefined step id and
malformed expression syntax, and shellcheck is preinstalled on the runner so it
also covers the shell in every run: block. It does not validate inputs or
outputs of third party actions, so it would not have caught the changesets v2
output rename in #233. This narrows the gap rather than closing it.

actionlint is pinned by version and sha256 rather than installed through the
upstream download script, which pipes an unpinned ref into bash. Dependabot
tracks neither that script nor a docker:// reference, so the pair is bumped by
hand and the checksum makes a swapped artifact fail loudly.

Co-authored-by: Brandon Corbett <Bccorb@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant