Announcing GoReleaser v2.16
Immutable releases, a new build target for Node.js, dockers_v2 graduating
out of experimental, and the legacy brews config finally getting the boot.
Immutable releases
v2.16.0 is the first non-nightly GoReleaser release published under our
new immutable releases policy.
Once a tag is published, its bytes can never be replaced โ pinning to
v2.16.0 gives you the exact same artifacts forever.
Nightlies changed too: instead of overwriting a single moving nightly tag,
each nightly run now creates its own immutable tag (e.g.
v2.16.0-abc1234-nightly). The old nightly tag is frozen and will be
deleted soon โ if you’re still pulling it, switch to the new format. To keep
the release list from growing forever, old nightly tags are periodically
pruned.
If you use goreleaser-action
(โฅ v7.2.0), the new nightly tag format is handled for you โ no config
changes needed.
See the blog post for the background (supply-chain safety) and the full nightly transition details.
Node.js single-executable apps
GoReleaser can now build Node.js Single Executable Application (SEA)
binaries via the new node builder!
This started as @vedantmgoyal9’s work in #6136 โ thanks for getting the ball rolling.
A minimal example:
builds:
- builder: node
main: index.js
targets:
- linux-x64
- darwin-arm64
- win-x64GoReleaser fetches the right Node.js distribution for each target and bundles
your entrypoint into a single executable. By default it builds for
darwin-arm64, darwin-x64, linux-arm64, linux-x64, win-arm64, and
win-x64.
Warning
The builder is experimental and requires Node โฅ v25.5.0.
See the documentation for the full configuration reference, including custom Node binaries, hooks to bundle dependencies, and per-target environment variables. There’s also a working example repository to get you started.
Docker (v2) is no longer experimental
dockers_v2 is no longer marked as experimental โ the experimental warning
is gone, and the pipe is ready for production use.
It also picks up three improvements this release.
The Dockerfile is now parsed to expose .BaseImage and .BaseImageDigest
template variables, which makes it trivial to set the standard OCI base-image
labels:
dockers_v2:
- images:
- myuser/myimage
labels:
"org.opencontainers.image.base.name": "{{ .BaseImage }}"
"org.opencontainers.image.base.digest": "{{ .BaseImageDigest }}"The resulting artifact now carries the list of built platforms in
extra.platforms, which custom publishers and other pipes can use to route
the image correctly.
And finally, you can now run pre and post hooks around the actual
docker buildx build invocation โ handy for staging files into the build
context, or for tagging/scanning the resulting image:
dockers_v2:
- images:
- myuser/myimage
hooks:
pre:
- cmd: ./scripts/before-docker.sh
dir: "{{ .ContextDir }}"
post:
- cmd: ./scripts/after-docker.sh {{ .Digest }}Hooks get the resolved .Dockerfile, .Images, and .ContextDir, plus the
final .Digest on post hooks.
See the documentation for more details.
brews is now fully deprecated
The legacy brews config โ which generated hackyish Homebrew formulas that
installed pre-compiled binaries โ has been soft-deprecated since v2.10 and is
now fully deprecated.
Migrate to homebrew_casks,
which is the right tool for the job: it’s how Homebrew expects pre-compiled
binaries to be distributed, and it gets all the new features (completion
generation, post-install hooks, and so on).
See the deprecation notice for the migration guide.
A note on the v2.15.x patch series
If you skipped any of the v2.15.x patches, v2.15.3 in particular is worth calling out: it shipped a security fix that prevents secret leaks in logs and improves redaction, along with a large pass of panic guards and retry improvements across most pipes (Docker, GitHub, gomod, nfpm, Rust, SBOM, templates, and more).
If you’re on v2.15.0โv2.15.2, please upgrade.
Other updates
- archives: added
xzformat (thanks to Jared Allard) - nightly: support templates in
tag_name; defer tag templating to evaluation time;runscripts now resolve nightly tags correctly - nix: support
meta.mainProgram - release: preserve prerelease state on publish; handle GitHub secondary rate limits; remove author lookup by email
- homebrew_casks: emit
generate_completions_from_executableafterpostflight - srpm: set
formatandextensionon the artifact - webhook and linkedin: error-handling improvements
- dependencies: Go 1.26.3
- pro/cloudsmith: upload Source RPMs; clearer error messages
- pro/gemfury: upload Source RPMs; include response body in errors
- pro/templates: new
listExcludetemplate function - pro/sign: allow signing macOS
.pkgfiles - pro/nightly: keep
.Tagpopulated; trimvprefix inversion_template; preserve prerelease flag - pro/npm: omit empty
enginesfrompackage.json
Other news
- GoReleaser now has ~15.8k stars and 432 contributors! Thanks, everyone!
- You can follow release updates on our Telegram channel.
- We often discuss new features in our Discord server. Join the conversation!
- nFPM had new releases as well, check it out.
Download
You can install or upgrade using your favorite package manager, or see the full release notes and download the pre-compiled binaries from GitHub:
Install v2.16.0 (OSS) v2.16.0 (Pro)
Helping out
You can help by reporting issues, contributing features, documentation improvements, and bug fixes. You can also sponsor the project, or get a GoReleaser Pro license.