fix(ci): deploy docs when the release cuts, not when the job succeeds - #454
Merged
Conversation
The v2.2.0 release failed on a single 403 pushing the cask to
flowexec/homebrew-tap. Because goreleaser does the cask push as part of
`goreleaser release`, that one credential problem aborted the whole
release job, which cost two things nobody would expect:
- the ghcr multi-arch publish never ran (failFast on the serial)
- release-docs was skipped via `needs: release-binary`, so the JSON
schemas the site serves stayed frozen at 2026-05-02 - exactly the
staleness #452 existed to prevent
Three changes:
- goreleaser generates the cask into dist/ but no longer uploads it
(skip_upload). The push is a continue-on-error workflow step, so a
tap credential failure costs the tap only.
- release-docs now gates on a `published` job output, set by checking
that the GitHub release exists, rather than on release-binary's
conclusion. Docs ship whenever the release actually cut.
- Create Tag is idempotent, so a release that failed partway can be
re-dispatched with the same tag instead of dying on an existing one.
A failed cask push writes a warning to the job summary so the
non-fatal step cannot fail silently.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012mnVfKRbSbYV43gdjcdxdX
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
The tap credential is fixed, so goreleaser can push the cask again. Restores .goreleaser.yaml and .execs/release.flow to their previous state and drops the separate cask-publish step. The docs gate and the idempotent tag creation stay: neither depends on the tap, and the docs gate is what stops a late-stage release failure from skipping the schema deploy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012mnVfKRbSbYV43gdjcdxdX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The v2.2.0 release failed on a single 403 pushing the Homebrew cask. That credential is now fixed, so this PR no longer touches the tap — but the release exposed two workflow problems that are worth fixing regardless of why that particular step failed.
The original failure, for context
The GitHub release and its 7 assets published fine. Then goreleaser failed on the cask, which failed the job, which cost two unrelated things:
publish releaseis aserialwithfailFast: true, and the ghcr step runs after goreleaser. The task summary shows 2 of 4 steps ran.release-docshasneeds: release-binary, so it was skipped. The last successful Docs run was 2026-05-02, meaning ci: deploy docs as part of a dispatched release #452 was blocked on its first real outing by an unrelated failure and the published schemas stayed exactly as stale as before it merged.Changes
1. Docs gate on the release existing, not on job success. A
Check release publishedstep runsgh release viewunderif: always()and exports apublishedjob output.release-docskeys off that instead ofrelease-binary's conclusion, so the schemas ship whenever the release actually cut — regardless of what fails after it.This is the change that would have prevented the v2.2.0 outcome, and it holds for any late-stage failure, not just a tap credential.
2.
Create Tagis idempotent — checks local, then origin, then creates. A release that fails partway can now be re-dispatched with the same tag instead of dying at step 7 ontag already exists. Re-running was impossible before, which is why v2.2.0 needed manual recovery.Not in this PR
An earlier revision moved the cask push out of goreleaser (
skip_upload+ acontinue-on-errorstep) so a tap failure couldn't abort the release. That's reverted now that the key is fixed —.goreleaser.yamland.execs/release.floware untouched relative tomain, and the diff is confined to.github/workflows/release.yaml.One residual coupling is worth naming: a future tap failure will still abort the release job and take the ghcr publish with it, because both live inside the same
failFast: trueserial. The docs deploy is now protected either way. Happy to decouple ghcr separately if you want it.Testing
goreleaser checkpasses against the restored config.flowexec.io/schemas/flowfile_schema.jsonnow matches the repo copy and carries the newinterpreterfield, clearing the staleness that dated to 2026-05-02.actionlintisn't installed locally, so there was no Actions-specific lint pass. The gate logic itself only runs on a real dispatched release.Note
Two commits — the second reverts the cask split from the first. Squash on merge.
🤖 Generated with Claude Code
https://claude.ai/code/session_012mnVfKRbSbYV43gdjcdxdX