Skip to content

ci(release): build execution images on main, not on every release - #2435

Merged
rdimitrov merged 1 commit into
mainfrom
ci/release-light-path
Oct 21, 2026
Merged

rdimitrov merged 1 commit into
mainfrom
ci/release-light-path

Conversation

@rdimitrov

@rdimitrov rdimitrov commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Why

Every release dispatch spent about 3.5 minutes in create-release-pr.yml's preflight before it could open the release PR. The preflight built both execution images (provider and workload) for amd64 and arm64 without publishing them: four cold Go builds. Opening the PR itself takes about 20 seconds. ToolHive and the registry server have no such step; they build their images on every push to main.

The build does guard against something real. release.yml publishes these images only after the tag exists, and a published tag can't be moved. It's also the only pre-release build of the provider Dockerfile, because the Kind suites build the provider with ko, and the only arm64 build of either image.

What

  • create-release-pr.yml: the preflight drops the image build. It keeps the base-image pin check (about 2 seconds), which also runs again at tag time and in release.yml. Opening a release PR goes from about 5 minutes to under a minute.
  • New execution-images.yml: the same no-publish amd64 + arm64 build of both images, on every push to main (docs-only pushes excluded) and on manual dispatch. A broken provider Dockerfile or arm64 build shows up within minutes of the merge that causes it, before a release is cut from it.
  • release-workflow-graph_test.py: now asserts that the build is gone from the release-PR workflow and present, after the pin check, in execution-images.yml.
  • The cut-release skill says where the build runs now.

Trade-off: the break surfaces on main after merge, not on the PR. That matches ToolHive and the registry server. It costs about 4 runner-minutes per merge, off the critical path.

Testing

  • release-workflow-graph_test.py passes. Restoring main's release-PR workflow, which still has the build, makes it fail.
  • actionlint, the expression-placeholder check, release-tag-guard_test.sh and task docs pass.
  • The new workflow runs on main only, so its first run is the first push to main after this merges. It can also be dispatched by hand.

🤖 Generated with Claude Code

@rdimitrov
rdimitrov force-pushed the ci/release-light-path branch 5 times, most recently from 98dade1 to c86f576 Compare October 20, 2026 12:26
@rdimitrov rdimitrov changed the title ci: skip redundant release CI behind a main-checks gate ci: skip redundant release CI; gate the tag on the released code Oct 20, 2026
@rdimitrov
rdimitrov force-pushed the ci/release-light-path branch 3 times, most recently from 50372e3 to 329c72d Compare October 20, 2026 15:31
@rdimitrov rdimitrov changed the title ci: skip redundant release CI; gate the tag on the released code ci(release): require the released code's checks before tagging Oct 20, 2026
@rdimitrov
rdimitrov marked this pull request as ready for review October 20, 2026 15:32
@rdimitrov
rdimitrov force-pushed the ci/release-light-path branch from 329c72d to 049fed9 Compare October 20, 2026 15:55
@rdimitrov rdimitrov changed the title ci(release): require the released code's checks before tagging ci(release): skip release-PR CI; require the released code's checks before tagging Oct 20, 2026
@rdimitrov
rdimitrov force-pushed the ci/release-light-path branch from 049fed9 to 1a4e208 Compare October 21, 2026 19:59
@rdimitrov rdimitrov changed the title ci(release): skip release-PR CI; require the released code's checks before tagging ci(release): move the multi-arch image build off the release path Oct 21, 2026
Every release dispatch spent about 3.5 minutes building both execution
images for amd64 and arm64 without publishing, four cold Go builds, before
it could open the release PR. The base-image pin check, which takes
seconds, stays in the preflight and again at tag and publish time.

execution-images.yml now runs that same no-publish build on every push to
main, as ToolHive and the registry server build their images, so a broken
provider Dockerfile or arm64 build surfaces within minutes of the merge
that causes it, before a release is cut from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rdimitrov
rdimitrov force-pushed the ci/release-light-path branch from 1a4e208 to 5a73b6b Compare October 21, 2026 20:15
@rdimitrov rdimitrov changed the title ci(release): move the multi-arch image build off the release path ci(release): build execution images on main, not on every release Oct 21, 2026
@rdimitrov
rdimitrov merged commit d50481a into main Oct 21, 2026
35 of 40 checks passed
@rdimitrov
rdimitrov deleted the ci/release-light-path branch October 21, 2026 20:23
@toolhive-release-app toolhive-release-app Bot mentioned this pull request Oct 23, 2026
2 tasks
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.

1 participant