feat(builder-images): build natively, off Argo Workflows #128

Merged
binjovi-bot merged 1 commit from feat/builder-images-native into trunk 2026-09-08 12:00:58 +00:00
Owner

Argo Workflows is being removed from this cluster. builder-images was one of
only three projects that still named the argo_workflow executor, and it is by
far the busiest: 28 of the 37 Workflow objects created in the last 12 hours are
its builds.

Why this is one string

The native path was already complete and unused. Everything needed is in place
on trunk today:

  • recipes/builder-images/ holds recipe.json, Dockerfile, build.sh,
    check.sh, discover.sh and finalize.sh
  • ProjectRegistry.parse/1 has an explicit version-8 clause that accepts
    "native" for this taxonomy and re-parses it through the v8 validator
  • ProjectRegistry.plan/3 routes dockerfile_set + native to
    ExecutionPlan.dockerfile_set_native/6
  • that emits a version-22 plan, which is exactly what Executor.Native
    pattern-matches, and it runs the fanout graph recipe.json declares
    (check, discover, build, finalize)

The project version stays 8; the plan version is 22. The two are
independent, which is why no version bump is needed.

Why the guard pins the whole build object

No recipe block is added, and none may be. The v8 validator calls
exact_keys(build, ~w(executor timeout_ms)), so an extra key is rejected
outright. scripts/check therefore pins the entire build object rather than
just the executor, so a later well-meant recipe addition fails loudly in the
guard instead of at plan time.

Verification

Red before green: the new assertion fails on the unchanged bundle
(node image project has no worker deployment target is the next check in the
chain; the builder-images any(...) is what goes false). make check passes
after the change.

Remaining on Argo after this: hetzner-node-image (arm64 node image) and
zot-src (shadow). Both are blocked on ReleaseItemPublisher having no native
form — project_runtime_routes.ex:137-147 routes dockerfile_set and
node_image to the Argo publisher unconditionally. That is a separate change.

https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76

Argo Workflows is being removed from this cluster. `builder-images` was one of only three projects that still named the `argo_workflow` executor, and it is by far the busiest: 28 of the 37 Workflow objects created in the last 12 hours are its builds. ## Why this is one string The native path was already complete and unused. Everything needed is in place on trunk today: * `recipes/builder-images/` holds `recipe.json`, `Dockerfile`, `build.sh`, `check.sh`, `discover.sh` and `finalize.sh` * `ProjectRegistry.parse/1` has an explicit **version-8 clause** that accepts `"native"` for this taxonomy and re-parses it through the v8 validator * `ProjectRegistry.plan/3` routes `dockerfile_set + native` to `ExecutionPlan.dockerfile_set_native/6` * that emits a **version-22** plan, which is exactly what `Executor.Native` pattern-matches, and it runs the fanout graph `recipe.json` declares (`check`, `discover`, `build`, `finalize`) The project version stays `8`; the **plan** version is `22`. The two are independent, which is why no version bump is needed. ## Why the guard pins the whole build object No recipe block is added, and none may be. The v8 validator calls `exact_keys(build, ~w(executor timeout_ms))`, so an extra key is rejected outright. `scripts/check` therefore pins the entire `build` object rather than just the executor, so a later well-meant recipe addition fails loudly in the guard instead of at plan time. ## Verification Red before green: the new assertion fails on the unchanged bundle (`node image project has no worker deployment target` is the next check in the chain; the builder-images `any(...)` is what goes false). `make check` passes after the change. Remaining on Argo after this: `hetzner-node-image` (arm64 node image) and `zot-src` (shadow). Both are blocked on `ReleaseItemPublisher` having no native form — `project_runtime_routes.ex:137-147` routes `dockerfile_set` and `node_image` to the Argo publisher unconditionally. That is a separate change. https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
feat(builder-images): build natively, off Argo Workflows
All checks were successful
binjovi/ci Binjovi completed the frozen plan
6a40e15ed8
Argo Workflows is being removed from this cluster. builder-images was one
of only three projects that still named the argo_workflow executor, and it
is by far the busiest: 28 of the 37 Workflow objects created in the last
12 hours are its builds.

The native path was already complete and unused. Everything needed is in
place today:

  * recipes/builder-images/ holds recipe.json, Dockerfile, build.sh,
    check.sh, discover.sh and finalize.sh
  * ProjectRegistry.parse/1 has an explicit version-8 clause that accepts
    "native" for this taxonomy
  * ProjectRegistry.plan/3 routes dockerfile_set + native to
    ExecutionPlan.dockerfile_set_native/6
  * that emits a version-22 plan, which Executor.Native runs as the
    fanout graph the recipe declares

So this is one string. The project version stays 8; the PLAN version is
22. The two are independent, which is why no version bump is needed.

No recipe block is added, and none may be: the v8 validator calls
exact_keys(build, ~w(executor timeout_ms)), so an extra key is rejected
outright. scripts/check therefore pins the whole build object rather than
just the executor, so a later "helpful" recipe addition fails loudly here
instead of at plan time.

Verified red before green: the new assertion fails on the unchanged
bundle.

Claude-Session: https://claude.ai/code/session_01KZoQin34jeyt6nDGqvJA76
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
sean/binjovi-plans!128
No description provided.