Replace Makefile releases with GoReleaser Pro - #660
Conversation
Nightly pushes to unstable publish Hub/GHCR :unstable without moving latest; tags still cut GitHub releases, AUR, brew, and signed packages. Co-authored-by: Cursor <cursoragent@cursor.com>
The release job failed at docker/login-action with "Password required" because secrets.DOCKERHUB_PASSWORD is empty in this repository. Map the secret for step ifs, skip Hub login and Hub image publish when it is blank, and keep GHCR plus the rest of GoReleaser running. Co-authored-by: Andreas Echavez <oceanplexian@users.noreply.github.com>
There was a problem hiding this comment.
Stale comment
CI failure:
build-and-release/releaseonunstable(same SHA as this PR head) failed at Log into Docker Hub.docker/login-action@v4 username: golift ##[error]Password requiredJob: https://github.com/Unpackerr/unpackerr/actions/runs/33043925078
Why:
password: ${{ secrets.DOCKERHUB_PASSWORD }}is empty in this public repository. GitHub omits the input, anddocker/login-actionaborts before contacting Hub. GHCR login withGITHUB_TOKENsucceeded. This repo did not previously need a Hub token (Docker Hub autobuild hooks handled Hub); the org secret is either unset here or not granted to public repos (Notifiarr uses the same name in a different org).Fix: 12ed604
- Map
DOCKERHUB_PASSWORDto job env sosteps.ifcan see it.- Skip Hub login when empty; set
DOCKERHUB_PUBLISH=1only when it is present.- Split GHCR vs Hub in
dockers_v2and disable Hub configs unless that flag is set.GHCR and the rest of GoReleaser can proceed without Hub credentials. Hub
:unstable/:lateststay stale untilDOCKERHUB_PASSWORDis granted to this public repo (Hub access token, usergolift).
build-and-releaseonly runs onunstableandv*tags. Fast-forwardunstableto this commit to re-run the nightly job.Sent by Cursor Automation: CI Failure Auto-Fixer
GoReleaser --nightly now means "not a GitHub release." A daily cron (and manual dispatch on main) publishes Hub/GHCR :nightly from main; pushing the unstable branch still publishes :unstable only. Co-authored-by: Cursor <cursoragent@cursor.com>
v2.18 expects glob/name_template on dmg extra_files, not archive-style src/dst. Co-authored-by: Cursor <cursoragent@cursor.com>
The unpackerr-darwin target used CGO_ENABLED=0, so GitHub's Linux release job omitted energye/systray's Objective-C Cocoa backend and failed with undefined nativeLoop/setInternalLoop/quit while compiling darwin/amd64. Restore CGO_ENABLED=1 (same as the old Makefile) and install osxcross from goreleaser-cross so ubuntu-latest can compile it. Co-authored-by: Andreas Echavez <oceanplexian@users.noreply.github.com>
There was a problem hiding this comment.
Stale comment
CI failure:
release(Darwin systray CGO)What failed: GoReleaser died while compiling
darwin_amd64_v1with# github.com/energye/systrayundefined symbols (setInternalLoop,nativeLoop,setOnClick,nativeStart,registerSystray,quit, …). Linux, FreeBSD, and Windows binaries had already built.Why:
unpackerr-darwinin.goreleaser.yamlwasCGO_ENABLED=0. The Darwin backend ofgithub.com/energye/systrayis Objective-C/Cocoa, so those native functions are not compiled without CGO. The old Makefile usedCGO_ENABLED=1onmacos-latest; this Pro rewrite builds Darwin onubuntu-latest(quill signing) but left CGO off.Fix: 5e1a83f
- Set
CGO_ENABLED=1forunpackerr-darwin(same as the Makefile) and pointCC/CXXat osxcross whenOSX_CROSSis set.- Copy
/usr/local/osxcrossfromghcr.io/goreleaser/goreleaser-cross:v1.27.0-1in the Linuxreleasejob soo64-clang/oa64-clangcan link Cocoa.The
releaseworkflow still only runs onunstableandv*tags. Confirm Darwin on the next push tounstable(or a tag), not on this PR'stest-and-lintjobs.Sent by Cursor Automation: CI Failure Auto-Fixer
Go 1.27 emits macOS 13 objects, so 10.8 only produced ld warnings. Repo-scoped Hub tokens cannot pull docker/buildkit-syft-scanner, which dockers_v2 SBOM attestations require. Co-authored-by: Cursor <cursoragent@cursor.com>
Cask service: is Automator, not brew services, and casks have no etc helper. Flatten archives so the cask finds the binary, install a LaunchAgent in postflight, and restore Docker SBOM now that the Hub token can pull the scanner. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
Migrates release automation from Make/FPM/Gon scripts to a unified GoReleaser Pro workflow.
Changes:
- Adds cross-platform builds, packages, containers, Homebrew, AUR, signing, and notarization configuration.
- Consolidates tagged, unstable, and nightly releases into one workflow.
- Removes legacy release scripts and templates.
Reviewed changes
Copilot reviewed 20 out of 21 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
.goreleaser.yaml |
Defines the unified release pipeline. |
.github/workflows/release.yml |
Runs channel-specific GoReleaser releases. |
.github/scripts/unstable_upload.sh |
Uploads unstable artifacts and metadata. |
.gitignore |
Ignores GoReleaser output. |
init/docker/Dockerfile |
Creates copy-binary Alpine images. |
init/docker/makedocker.sh |
Removes legacy Docker builder. |
init/docker/hooks/build |
Removes Docker Hub build hook. |
init/docker/hooks/pre_build |
Removes QEMU setup hook. |
init/docker/hooks/push |
Removes obsolete push hook. |
init/windows/signexe.sh |
Supports temporary GoReleaser signing CLI. |
init/macos/Info.plist.tmpl |
Adds templated app metadata. |
init/macos/makedmg.sh |
Removes legacy DMG creation. |
init/macos/notarize.sh |
Removes legacy notarization flow. |
init/macos/notarize.json |
Removes Gon notarization configuration. |
init/macos/sign.json |
Removes Gon signing configuration. |
init/archlinux/PKGBUILD.template |
Removes legacy AUR template. |
init/archlinux/SRCINFO.template |
Removes legacy AUR metadata template. |
init/archlinux/aur-deploy.sh |
Removes custom AUR deployment. |
init/archlinux/README.md |
Removes obsolete template documentation. |
Makefile |
Removes legacy build and release targets. |
settings.sh |
Removes Make-based release metadata. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| ids: | ||
| - unpackerr-darwin |
| - id: freebsd | ||
| ids: [unpackerr-freebsd] | ||
| formats: [tar.xz] | ||
| wrap_in_directory: false |
| if: env.CHANNEL == 'unstable' | ||
| env: | ||
| UNSTABLE_UPLOAD_KEY: ${{ secrets.UNSTABLE_UPLOAD_KEY }} | ||
| VERSION: ${{ github.ref_name }} |
… versions. nFPM maps both GOARM 6 and 7 to Debian armhf, so golift/upload-packagecloud rejected the second file with "filename has already been taken". Skip GOARM=7 nfpms (keep GOARM=6, matching the old Makefile) and include REVISION in the nightly version so later unstable pushes are not the same Debian filename. Co-authored-by: Andreas Echavez <oceanplexian@users.noreply.github.com>
There was a problem hiding this comment.
Stale comment
CI failure:
release(packagecloud duplicate armhf)What failed: build-and-release on
unstable(SHA12e53ee) died atgolift/upload-packagecloudafter goreleaser succeeded:Pushing dist//unpackerr_0.15.3-unstable_linux_armv7.deb... error: filename: 'unpackerr_0.15.3~unstable+git_armhf.deb' has already been taken386, amd64, arm64, and armv6 debs uploaded; armv7 did not.
Why: nFPM maps both GOARM 6 and 7 to Debian
armhf. On-disk names differ (linux_armv6.debvslinux_armv7.deb), but packagecloud keys on the control filename. The old Makefile built one armhf package fromGOARM=6. Nightly versions were also0.15.3-unstableplus+gitwith no iteration, so the next unstable push would collide even after dropping the extra armhf.Fix: 1989e40
- Skip GOARM=7 in nfpms (
if); keep GOARM=6 as the armhf package. Archives andlinux/arm/v7Docker images still build both.- Append
.{{ .Env.REVISION }}tonightly.version_template(the workflow already setsREVISIONfromgit rev-list --count).
build-and-releaseonly runs onunstableandv*tags. Fast-forwardunstableto this commit to re-run the job.Sent by Cursor Automation: CI Failure Auto-Fixer
Keep one armhf for Packagecloud (GOARM=7, matching Docker) instead of skipping v7. Use nFPM release as the old fpm iteration so every upload has a unique Debian/RPM filename. Co-authored-by: Cursor <cursoragent@cursor.com>
GoReleaser passes nfpms.release through to nFPM without applying Go
templates, so '{{ with .Env.REVISION }}...' was written into the Debian
Version and PackageCloud rejected the .deb as unreadable. Put REVISION
on nightly.version_template instead, which is templated, and keep a
single linux GOARM=7 armhf package.
Co-authored-by: Andreas Echavez <oceanplexian@users.noreply.github.com>
There was a problem hiding this comment.
The release job failed at golift/upload-packagecloud while pushing dist/unpackerr_0.15.3-unstable_linux_386.deb:
repository: Debian package parsing error. We weren't able to read your Deb package.
Cause: 09efe7d moved uniqueness onto nfpms.release with a Go template ({{ with .Env.REVISION }}...). GoReleaser does not template that field (it is passed through to nFPM as-is), so the Debian Version became 0.15.3~unstable+git-{{ with .Env.REVISION }}{{ . }}{{ else }}0{{ end }}. {, }, and spaces are invalid in a Debian version, and PackageCloud refused the package.
Fix: 2d5c858 drops the untemplated nfpms.release and puts REVISION back on nightly.version_template (which GoReleaser does template), producing a unique, valid version such as 0.15.3~unstable.1028+git. Linux stays GOARM=7 only so there is still a single armhf package.
Sent by Cursor Automation: CI Failure Auto-Fixer
Unstable debs already go to golift/unstable, so encoding CHANNEL in the Debian version only added noise. Keep uniqueness with REVISION on the templated nightly.version_template. Co-authored-by: Cursor <cursoragent@cursor.com>
nightly.version_template reads .Env.REVISION; the action env map did not include it, so uniqueness never reached nFPM. Co-authored-by: Cursor <cursoragent@cursor.com>
getlantern attached the menu to the status item; energye only fires click callbacks. Without ShowMenu, the macOS menu-bar icon (and Windows left-click) does nothing. Co-authored-by: Cursor <cursoragent@cursor.com>
…to ci/goreleaser-pro
…unstable.golift.io. Quill cannot notarize an .app/DMG from Linux, and versioned GoReleaser archives break auto-update URLs. Co-authored-by: Cursor <cursoragent@cursor.com>
signerd 401'd because the split job had no id-token; Darwin died on an empty repo MACOS_SIGN_PASSWORD that shadowed the org secret. Co-authored-by: Cursor <cursoragent@cursor.com>


Summary
build-and-releasejob.pushtounstable) publishes Hub+GHCRgolift/unpackerr:unstableandghcr.io/unpackerr/unpackerr:unstableonly — it does not movelatest. Tags (v*) still publishlatest+semver, GitHub Release, AUR source package, Homebrew formula, signed/notarized DMG, and packagecloudgolift/pkgs.dockers_v2(linux/amd64,linux/arm64,linux/arm/v7). Org secretDOCKERHUB_PASSWORD(Hub access token, usergolift) is already set.Test plan
build-and-releaseonunstablesucceeds and Hubgolift/unpackerr:unstableupdates (amd64/arm64/arm)ghcr.io/unpackerr/unpackerr:unstableupdateslatest, does not open a GitHub Release, and does not push AUR/Homebrewgolift/unstablegets the nightly debs/rpmsv*tag publishes Hublatest+semver, AURunpackerr, andgolift/homebrew-mugsFormula/unpackerr.rbMade with Cursor