Repository navigation
Move HAPTIC to GitHub and add the Pod readiness gate - #44
Conversation
Review started. Results will appear in the dashboard comment. |
Renovate skips SHA-pinned actions without a version comment as unversioned references, so none of the 73 workflow pins would update. Each pin now carries its release tag, the scheduler keeps the comments when it regenerates the matrix, and a test rejects a pin without one.
…uites Moving these suites to nightly.yml left release tagging and publication without them: both accept the CI receipt for the tagged commit, and that receipt no longer covered them. They return to the matrix behind the full profile. Pull requests and merge groups select a pre-merge profile that skips exactly the jobs in pre_merge_skipped_jobs, so PR lead time is unchanged. Pushes to main and maint, manual dispatches, and the weekly run use full, and publication rejects any receipt that isn't full or an allowed prose receipt. Nightly keeps only the upstream canary and the weekly full run. The PR-head fallback in the scale gate is gone, since scale no longer runs on pull requests.
|
Gitar review |
✅ All code review findings resolved.
A GitHub release download returned HTTP 500 while helm-3.2 built the CI image in-job, which every job does until main publishes an image for changed inputs. The checksum-verified downloads now retry like the kubectl download already did.
…htly.yml A direct dispatch left verification_profile empty, so the full-only suites were skipped and the gate rejected the run.
|
Gitar review |
Compatibility, churn, scale, and the upstream canary run in the PR, merge-queue, and push matrix again, at about a minute of lead time, instead of through separate profiles and a nightly schedule. This restores the bd27203 verification design: one full profile, the canary as the only allowed failure, and merge-queue reuse able to cover post-merge pushes. nightly.yml and its planner are removed.
|
Gitar review |
Starting the review now. Results will appear in the dashboard comment when it finishes. |
The goreleaser hook downloaded the complete module graph, including every tool's test dependencies, on each snapshot and release build: four minutes, and a proxy.golang.org 502 failed the snapshot job. Lint's go mod tidy -diff already rejects an untidy tree in the same CI run, so the hook could only mutate a verified tree or repeat that check over the network.
|
Gitar review |
Starting a review of this PR now. Results will appear in the dashboard comment. |
GitHub release assets returned HTTP 500 for about a minute in run 38571838388, failing the CI image build (10 s of retries) and the e2e Gateway API CRD install (12 s) in two jobs. Both now back off exponentially for about two minutes; the CRD install stops waiting when the suite is cancelled.
|
Gitar review |
Starting a review of this PR now. Results will appear in the dashboard comment. |
Code Review ✅ Approved 2 closed / 2 findings🔴 High risk · The opt-in readiness gate expands controller RBAC to cluster-wide pod reads and status patches; a scope error could alter workload readiness and disrupt rollouts. Moves HAPTIC's CI, publication, and docs from GitLab to GitHub Actions and adds the opt-in Pod readiness gate for zero-downtime single-replica rollouts. Direct dispatch of ✅ 2 closed✅ Edge Case: Direct dispatch of ci-speed-proof.yml skips post-merge suites, then fails
Closed: Bug: Releases no longer require Gateway compatibility, churn or scale results
VerificationRules No rules evaluated Functional validation Not enabledAuto-approval Not enabledWas this helpful? React with 👍 / 👎 | Gitar |
Moves HAPTIC's development, CI, and publication from GitLab to GitHub, and adds the opt-in Pod readiness gate that lets single-replica rollouts drop no requests. After this merges, no build, test, publication, or documentation path depends on GitLab's CI or container registry.
Size
+32k / −7.5k lines. About half of the additions are generated data: the offline Pod schema for the readiness gate's tests (7.6k), the generated 98-job CI matrix (
ci-speed-proof.yml), and per-test duration weights the scheduler balances shards with (4.5k). The deletions are mostly.gitlab-ci.ymland the migration's one-time tooling.CI on GitHub Actions
CIruns the complete matrix on every pull request, merge-queue group, and push: unit shards, chart and docs builds, the e2e matrix (HAProxy 3.0–3.4), minimum Kubernetes, upgrade baselines, Ingress and Gateway API conformance, and the former nightly suites (Gateway API release matrix, churn, scale, upstream canary). Only the canary may fail. No workflow runs on a schedule.release.yml,snapshot.yml,pages.yml) verifies the producing CI run, its job inventory, and its artifact digests before it publishes. The website publishes after every successfulmainCI run. The publication containers setBUILDX_NO_DEFAULT_OCI_ARTIFACT=true, as the GitLab release jobs did (build: add OCI artifact default opt-out docker/buildx#3991).ci-images.ymlpublishes CI images for changed build inputs frommain(ghcr.io/haproxy-haptic/haptic-ci:<input-hash>-hp<series>); jobs pull that tag before building in-job, so a toolchain bump slows down only the PR that makes it.e2e-rate-limitran out of time at 98% with no failure. The reinit grace stays 45 s above the budget.Registry, docs, and GitLab retirement
ghcr.io/haproxy-haptic/haptic. Releases up to 0.5.0 are already there with their original digests and signatures (run 38498045175)..goreleaser.ymlpublishes to GitHub directly. Upgrade tests discover chart baselines from GHCR; the Ingress conformance echo image comes fromregistry.k8s.ioat its pinned digest..gitlab-ci.ymland its train, budget, nightly-dispatch, and failure-reporting tooling, the one-time registry mirrors, the GitLab comparison baseline, and 23 migration-only proof and diagnosis workflows..gitlab-ci.ymlare replaced by checks on the GitHub workflows: job inventory and prose profile (.github/ci-verification.json), nightly selections and failure policy, feature e2e profiles, the bounded benchmark smoke, chart-publication ordering, per-repository image attestation,maint/tagging, thelatestordering check, and upgrade baseline coverage.CLAUDE.md, agent docs, contributor docs, the Gateway API upgrade playbook, the issue tracker guide, the chart'shome/sources, the PR skill,SECURITY.md(private vulnerability reporting), and Renovate (GitLab preset inlined) describe GitHub only. The Go module path staysgitlab.com/haproxy-haptic/hapticfor now.Pod readiness gate
controller.templateLibraries.kubernetesBackends.podReadinessGate.enabledadds the conditionhaproxy-haptic.org/load-balancer-ready. A pod listing it underreadinessGatesbecomes Ready only after every HAProxy pod runs a configuration that routes to it, so a Deployment keeps the old pod until then. It's chart-only:kubernetes-backendswatches pods, routes a gated pod as soon as its containers are ready, and sets the condition in thedeployedstatus phase. See ADR-0034 anddocs/site/docs/operations/pod-readiness-gate.md.The GitHub runs exposed the problem it fixes: an ungated single-replica rollout stopped the old backend 9 ms after HAPTIC saw the new endpoint, and the deploy landed 482 ms later, so two probes failed (run 38483303507).
TestIngressRollingRestartZeroDowntimegates its backend and allows no failed request.TestIngressRollingRestartUngatedRecoverskeeps the ungated case: only fast 503s, within one window no longer than the scale suite's 3 s convergence budget. This replaces the old "at most one 503" bound for ungated pods, which asserted runner speed rather than a guarantee HAPTIC can give.podsread andpods/statuspatch; the RBAC golden test pins that this happens only with the gate on.Local verification of the final commit
make lint audit,make test(11,804 tests),make lint-chart, and./scripts/test-templates.sh(1,144/1,144).TestObservedGenerationIsTruthful|TestHaptic|TestGateway|TestIngress|TestHTTPRoute, 126 passed, 0 failed, including both rolling-restart tests with zero failed requests.