Skip to content

Add brew input to make Homebrew tap publishing skippable - #109

Merged
jugonzalez12 merged 1 commit into
mainfrom
jugonzalez/release-brew-input
Aug 21, 2026
Merged

Add brew input to make Homebrew tap publishing skippable#109
jugonzalez12 merged 1 commit into
mainfrom
jugonzalez/release-brew-input

Conversation

@jugonzalez12

Copy link
Copy Markdown
Contributor

Every caller of the reusable release workflow currently publishes a formula to the public conductorone/homebrew-baton tap on every tag push: the brews block in the binaries goreleaser config is unconditional, and the goreleaser-binaries job that renders it always runs. Unlike docker/lambda/msi, there is no input to opt out, so connectors whose repositories are private still get a public formula pointing at release assets anonymous users cannot download - leaking the repository name, version history, and release cadence with no working install to show for it.

Add a brew boolean input (default true) following the msi/docker convention. Because the brews block lives inside the always-running goreleaser-binaries job - which also produces the binaries, S3 uploads, and manifest the rest of the pipeline depends on - it cannot be gated at the job level like the other inputs. Instead the input is plumbed through the existing envsubst render: the "Generate configs for binaries" step exports BREW_SKIP_UPLOAD=(!brew), and the brews block gains skip_upload: "${BREW_SKIP_UPLOAD}". goreleaser skips the tap push only when skip_upload is exactly "true" ("false" publishes normally, verified against the pinned v2.13 source), so all existing callers - none of which pass the input - are behaviorally unchanged. When skipped, the formula is still written to the local dist dir and everything else in the release (binaries, signing, SBOM, provenance, S3, ECR, registry record) proceeds as before.

The expression uses inputs.brew != true rather than a &&/|| ternary deliberately: empty strings are falsy in Actions expressions, so a ternary with an empty true-branch would invert the logic.

Verified: workflow YAML parses; actionlint output is identical to main (same 13 pre-existing shellcheck notes, line-shifted); envsubst render with both values produces valid goreleaser config; templates are checked out at the same sha as the invoked workflow, so older version tags are unaffected.

Every caller of the reusable release workflow currently publishes a
formula to the public conductorone/homebrew-baton tap on every tag
push: the brews block in the binaries goreleaser config is
unconditional, and the goreleaser-binaries job that renders it always
runs. Unlike docker/lambda/msi, there is no input to opt out, so
connectors whose repositories are private still get a public formula
pointing at release assets anonymous users cannot download - leaking
the repository name, version history, and release cadence with no
working install to show for it.

Add a `brew` boolean input (default true) following the msi/docker
convention. Because the brews block lives inside the always-running
goreleaser-binaries job - which also produces the binaries, S3
uploads, and manifest the rest of the pipeline depends on - it cannot
be gated at the job level like the other inputs. Instead the input is
plumbed through the existing envsubst render: the "Generate configs
for binaries" step exports BREW_SKIP_UPLOAD=(!brew), and the brews
block gains `skip_upload: "${BREW_SKIP_UPLOAD}"`. goreleaser skips the
tap push only when skip_upload is exactly "true" ("false" publishes
normally, verified against the pinned v2.13 source), so all existing
callers - none of which pass the input - are behaviorally unchanged.
When skipped, the formula is still written to the local dist dir and
everything else in the release (binaries, signing, SBOM, provenance,
S3, ECR, registry record) proceeds as before.

The expression uses `inputs.brew != true` rather than a &&/|| ternary
deliberately: empty strings are falsy in Actions expressions, so a
ternary with an empty true-branch would invert the logic.

Verified: workflow YAML parses; actionlint output is identical to
main (same 13 pre-existing shellcheck notes, line-shifted); envsubst
render with both values produces valid goreleaser config; templates
are checked out at the same sha as the invoked workflow, so older
version tags are unaffected.
@jugonzalez12
jugonzalez12 requested a review from gontzess August 21, 2026 18:49
@jugonzalez12
jugonzalez12 merged commit 1d06622 into main Aug 21, 2026
2 checks passed
@jugonzalez12
jugonzalez12 deleted the jugonzalez/release-brew-input branch August 21, 2026 19:15
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.

2 participants