feat(ci): add release-time bench workflow on self-hosted runner#94
Merged
Conversation
Manually-triggered workflow (workflow_dispatch) that runs the full 8-profile bench matrix against a release tag, branch, or SHA on a self-hosted runner labelled bench-runner. Persists results to a self-bootstrapping bench-history orphan branch under bench-history/<label>.json and renders a markdown summary table of source-update / self-heal / ns-flip p99 latencies into the workflow step summary. pull_request triggers are deliberately omitted because self-hosted runners on public repos are exposed to fork-PR malicious code. The existing per-PR shape-break smoke check on ubuntu-22.04 (bench-smoke.yml) covers regression catching on inbound changes.
4 tasks
be0x74a
added a commit
that referenced
this pull request
May 10, 2026
* release: v0.3.1 prep (CHANGELOG, chart bump) Promote Unreleased entries (#90 SourceNotFound distinction, #94 release-time bench workflow, #97 source.version optional + Destination column rename) to the [0.3.1] - 2026-05-10 heading. Bump chart version and appVersion to 0.3.1. Refresh artifacthub.io/crdsExamples to use bare-Kind for the core ConfigMap sources, matching the new lead form shipped in #97. * docs: bump install/cosign examples to v0.3.1; fix v0.3.0 misattribution Pre-tag documentation sweep found two classes of issue: - Install examples in README, getting-started, security (cosign), and the chart README still referenced v0.3.0. Bumped to v0.3.1 to match the release being cut. - docs/troubleshooting.md attributed the source.version relaxation to v0.3.0 in two places — incorrect, since v0.3.0 still carried the CEL rule (rescinded only in v0.3.1, per CHANGELOG and api-stability.md). Fixed by retiming one mention to pre-v0.3.1/v0.3.1 and rephrasing the other to a present-tense, version-neutral statement.
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.
Why
PR 4 of the bench multi-PR sequence:
bench-historyorphan branch keyed by release tagEarlier in the design conversation we considered GHA larger (8-core, paid) vs. self-hosted. Picked self-hosted because release-time bench is rare (~6/year), reproducibility year-over-year matters more than always-on availability, and the dedicated VM eliminates noisy-neighbor variance from year-over-year comparisons.
What
.github/workflows/bench.yml:workflow_dispatchonly (NOTpull_request— self-hosted runners on public repos are exposed to fork-PR malicious code; manual-only avoids that class entirely)ref(release tag, branch, or SHA — required) and optional `label\ override for the bench-history filename[self-hosted, bench-runner]— runner provisioning is handled separately on your side (see checklist below)go.mod→ create Kind cluster (bench-release, kindest/node v1.32.0) → build & load operator image → kustomize-deploy → wait for ready →go run ./test/bench --profile=full --output=json→jq -s '.'slurp into a JSON array → derive label → render markdown step summary → push tobench-historyorphan branch (self-bootstraps on first run with a README) → upload artifact → cleanup Kind clustercontents: read; job addscontents: writefor the orphan-branch push (least privilege).github/scripts/bench-history-summary.sh(bash + jq):LC_ALL=Cfor locale-stable ms formattingSelf-hosted runner provisioning checklist
You'll need to provision and register the runner separately. The workflow's \runs-on: [self-hosted, bench-runner]` will only pick it up when both labels match.
VM specs (Proxmox or equivalent):
Required tools on the VM:
ghCLI specifically is required on the runner (the workflow usesgh auth setup-gitto configure git credentials for the bench-history push).Runner registration:
bench-runner(in addition to the defaultself-hosted, Linux, X64)Power profile: the VM doesn't need to be always-on. Self-hosted runners deregister gracefully on shutdown and re-register on startup. Boot before triggering bench, shut down after — keeps power cost negligible.
Why
pull_requestis omittedGitHub explicitly recommends self-hosted runners only for private repos, because fork PRs can run arbitrary workflow code on the runner. Our repo is public, so the bench workflow is
workflow_dispatch-only. The PR-time shape-break check (bench-smoke.yml, added in #92) stays on the free-tier hosted runner — that's where regression catching happens; this workflow is just for the release-time anchored numbers.If we ever add a
pull_requesttrigger to this workflow, the runner becomes a supply-chain target. Don't.Out of scope (future work)
bench-history(gh-pages or similar) — defer until enough data points accumulateTest plan
.yamllint.yml(added in feat(ci): add bench smoke check on PRs touching api/controller/bench #92).github/scripts/bench-history-summary.shand on every extractedrun:blockv0.4.0,v1.0.0-rc1,v0.3.0+local, \feat/foo,abc1234567`, plus the override case