CI-1: automatic cold-start validation — shared gate script + coldstart workflow + vxrail runner (#21) #71
No reviewers
Labels
No labels
bug
discussion
duplicate
enhancement
goal
help wanted
horizon:backlog
horizon:governance
horizon:mvp
invalid
operator-decision
question
roadmap
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
open-platform/mitosis!71
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/ci-1-coldstart-gate"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Delivers CI-1 (#21): every change to plat/mitosis can now prove, in CI, that a FRESH platform germinates and passes the acceptance assertions. This session's two release-blockers (germinate tag-regex abort, caddy file-caps EPERM) were invisible to static checks and running platforms — only fresh germinations caught them. This makes that loop push-button and automatic.
What's in the PR
scripts/coldstart-assert.sh— THE acceptance gate, one source of truth for humans and CI (encodes the #67 assertions):/api/v1/admin/hooks/{1..8}(the list endpoint returns[]while hooks exist — #67); admin creds read from the in-clusterforgejo-adminsecret, not logsrollout restart deploy/agents, wait Available, STILL exactly one hook;system webhook verifiedlog check is version-aware (SKIPs on agents < 0.7.6 so old seeds can't false-fail)does not existmiddleware errors) — SKIPs wholesale on pre-#64 platforms withoutredirect-to-https127.0.0.1:31100listener, realcrictl pull git.<domain>/plat/ci-builder:0.2.0(mechanism-agnostic: covers hostPort AND hostNetwork variants).forgejo/workflows/coldstart.yml— triggers:pull_request(paths:bin/**, genesis/**, recipe/**, flake.*+ the gate + itself), nightly cron,workflow_dispatchwith optionalgitops_ref(builds an RC seed vianix run .#seedusing the newPLAT_PATrepo Actions secret; the default path needs zero secrets). Germinatesci<run_number>withPORTS=none FORK_KEY_ACK=1under a 40-min hard timeout, runs the gate, then anif: always()teardown that force-removes and FAILS on any leakedk3d-ci*container. Concurrency groupcoldstart,cancel-in-progress: false, runner capacity 1 → one cold-start at a time.docs/ops/coldstart-ci.md— runbook: runner provisioning/re-registration, manual gate usage, RC-seed dispatch recipe, future work (nightly app-E2E with a sealed Claude credential, parallel clusters, #14 seed-build automation on this same runner).Isolation invariants (shared prod host)
KUBECONFIGfile —bin/up'skubectl config use-contextnever touches the host default context (which is prod)FORK_KEY+ kubeconfig live OUTSIDE the clone so nix flake tree copies can never sweep secrets into the world-readable storePORTS=nonealways — host 80/443 never boundInfra stood up (live, not repo state)
vxrail-coldstart(labelvxrail-coldstart:host, capacity 1) on the vxrail host:forgejo-runnerv12.5.2 via nix profile, user systemd unitforgejo-runner.servicewith linger — survives restarts, no root daemon. Host has no node, so the workflow uses a manualgit cloneinstead of actions/checkout.PLAT_PATfor thegitops_refRC-seed path.Proof
workflow_dispatchon this branch against the committedgenesis/seed.tar.gz: run https://git.open-platform.sh/plat/mitosis/actions/runs/1 (timings in the run;docker psverified clean ofk3d-ci*afterwards). The committed seed's pre-train state exercises the version-aware SKIP paths legitimately.No push/PR protection blocked this delivery — no bypass was needed. Not merging: leaving the merge to a human per team-ci scope.
🤖 Generated with Claude Code
1282db7a5799f8303d52