jactionlint 2.6.0 adds jactionlint update, which finds newer releases of the actions and reusable workflows you use and can pin them to commit SHAs. This release also fixes jactionlint run --container for containers whose platform differs from the host, and the action can now download jactionlint with a token so it isn't hit by GitHub's limits on anonymous downloads.
Added
jactionlint update: update actions and pin to SHAs
jactionlint update checks the external actions and reusable workflows in your workflows and action.yml files. It finds the latest release your policy allows, then lists, previews or writes the new references. It is separate from --fix, so a lint run never changes a version. Use it locally, in a hook or as a CI check. Use Dependabot or Renovate if you want pull requests instead. (#335, @jdx)
jactionlint update # list available updates, change nothing
jactionlint update --check # exit 1 on an update, a policy violation or an unverifiable reference
jactionlint update --diff # unified diff, change nothing
jactionlint update --apply # write the changes- Policy. Set the policy in a new
update:section of the config file, or with command-line options, which override the config:The matching options are# .github/jactionlint.yaml update: cooldown-days: 7 freeze: true include-tags: "v*" exclude-tags: ["*-{alpha,beta,rc}*"] exclude-prereleases: true require-immutable-releases: true
--min-age,--freeze,--include-tagand--exclude-tag. Other options:--pin-onlypins the current release without upgrading it,--branch-to-tag REGEXconverts branch refs such as@mainto the latest release,--include-action/--exclude-actionfilter by action, and--action-rule REGEX=ignore|cooldown:DAYSsets a policy for specific actions. - Safety. It never moves a reference to an older version. If a newer release is held back by the cooldown, it says so. Before updating a pinned SHA, it checks the SHA and its version comment against the repository's tags. It edits only the ref and the version in the comment, and keeps quotes, indentation, line endings and comments that are still true. A line it can't edit without guessing is reported and left as is. A failed lookup is reported as
update-unverifiedand never counted as up to date. - Output. Findings have the IDs
update-available,update-policy,update-unverifiedandupdate-held, and work with every--format, including SARIF. They aren't linter rules, so--ignore,ignoresand ignore comments don't apply to them. Use--exclude-action,--action-ruleor--changed-sinceto leave references out.updatealways uses the online settings (token, cache, GHES, github.com fallback). - Actions lock file. If
.github/workflows/actions.lockexists,--applyends by runninggh actions-lock --relockfrom the repository root, even when no reference changed. The listing,--checkand--diffnever run it. Ifghor the extension is missing, or the relock fails,updateexits3. Workflow edits made before that point stay written. (#341, @jdx)
See the update guide for details.
Authenticated release downloads
When JACTIONLINT_TOKEN is set, download-jactionlint.bash sends it with the release download request to github.com. It is never sent to the redirect host. The GitHub Action passes its token input to the script, which is github.token by default. On GitHub Enterprise Server, the action doesn't pass the token. Without the variable, downloads work without credentials as before. (#346, @jdx, @joschi)
Fixed
jactionlint run --containernow uses the container's platform instead of the host's. Before, JavaScript actions (setup-*,actions/github-script,jdx/mise-action) failed with an exec format error when run from a Mac or in a container of another architecture. The platform comes from--platform, thenDOCKER_DEFAULT_PLATFORM, then the image's own platform. Each container platform gets its own tool cache and matching Node.js build, and anodeon the host'sPATHis never used inside a container.runner.os,runner.arch,RUNNER_OSandRUNNER_ARCHnow report the container's platform, so steps underif: runner.os == 'Linux'run instead of being skipped.runner.tempandrunner.tool_cache, which were empty before, now matchRUNNER_TEMPandRUNNER_TOOL_CACHE. (#344, @jdx)unpinned-tools(pedantic) no longer reportsgo install tool, which installs the tools at the versions fixed bygo.modandgo.sum. Bareall,stdandcmdare no longer reported either.go install example.com/xwithout a version is still reported. (#338, @ktsu2i)- Binaries are now built with Go 1.27.4, which fixes GO-2026-6859, an
net/httpserver crash. (#345, @jdx)
New Contributors
- @ktsu2i made their first contribution in #338
- @joschi made their first contribution in #346 (originally #342)
Full Changelog: v2.5.0...v2.6.0
💚 Sponsor jactionlint
jactionlint is a fork of rhysd/actionlint, maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If jactionlint has a place in your development workflow, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep jactionlint fast, free, and independent.