Add runner update channels for canary field testing on Bencher Cloud#927
Add runner update channels for canary field testing on Bencher Cloud#927epompeii wants to merge 1 commit into
Conversation
🤖 Claude Code ReviewPR: #927 I've now reviewed the full diff. I was unable to run PR Review: Runner update channels (canary) for field testingOverall this is a high-quality, well-tested change. It adds a Strengths
Minor observations (non-blocking)
One thing to double-check before merge
No correctness bugs found. Nice work on the test coverage and the legacy-compat wire format. Model: claude-opus-4-8 |
|
| Branch | claude/runner-canary-channel |
| Testbed | intel-v1 |
Click to view all benchmark results
| Benchmark | Latency | Benchmark Result microseconds (µs) (Result Δ%) | Upper Boundary microseconds (µs) (Limit %) |
|---|---|---|---|
| Adapter::Json | 📈 view plot 🚷 view threshold | 4.63 µs(+0.05%)Baseline: 4.62 µs | 4.90 µs (94.34%) |
| Adapter::Magic (JSON) | 📈 view plot 🚷 view threshold | 4.49 µs(-0.21%)Baseline: 4.50 µs | 4.72 µs (95.07%) |
| Adapter::Magic (Rust) | 📈 view plot 🚷 view threshold | 26.44 µs(+3.52%)Baseline: 25.54 µs | 26.64 µs (99.25%) |
| Adapter::Rust | 📈 view plot 🚷 view threshold | 3.52 µs(+0.93%)Baseline: 3.49 µs | 3.60 µs (97.72%) |
| Adapter::RustBench | 📈 view plot 🚷 view threshold | 3.52 µs(+0.97%)Baseline: 3.48 µs | 3.59 µs (97.89%) |
c950ca2 to
8007428
Compare
8007428 to
ac0615a
Compare
ac0615a to
5eb0526
Compare
Runners can now opt into a canary update channel that tracks a rolling prerelease rebuilt whenever the runner changes on a cloud branch deploy, so runner changes are field-tested on Bencher Cloud before a versioned release. Canary runners report the SHA-256 of their own binary and the server converges them on the published build by content, not version. Checksum fetch failures now skip the update offer instead of dropping the WebSocket channel into a reconnect loop.
5eb0526 to
db4f747
Compare
What
Adds runner update channels so
runnerchanges can be field-tested on Bencher Cloud before a versioned release, mirroring how the API server is dogfooded viacloudbranch deploys.runner up --update-channel <stable|canary>flag (envBENCHER_UPDATE_CHANNEL, defaultstable, conflicts with--no-auto-update)stablechannel keeps today's behavior: exact version match against the server, updates from versioned GitHub Releasescanarychannel converges by content: the runner reports the SHA-256 of its own binary inReadymetadata, and the server compares it against the published checksum of a rollingcanaryprerelease (TTL-cached per architecture), sending the existingUpdatedirective on mismatchHow
JsonRunnerMetadatagains optionalchannelandchecksumfields; absent meansstable, so old runners and old servers interoperate unchanged and the stable wire format is byte-identicalRunnerUpdatecontext (URL construction + canary checksum cache with injectableClock), channel-awarehandle_readywith an injectable checksum fetcher for unit testing, and a newrunners.update_base_urlconfig knob. Checksum fetch failures now log, count (runner.self_update.check.failed; updates count asrunner.self_update.sent), and skip the update offer instead of erroring the channel into a reconnect loop (this also fixes the stable path when GitHub is unreachable)cloudpushes (path-filtered,build-onlyskips the KVM scenario tests already run on devel) and is versionedcanary; a newpublish_runner_canaryjob clobbers the assets on a rollingcanaryprerelease, binaries before checksums so a partial upload never advertises a missing binary. The tag iscanaryrather thancloudbecause a tag named like the branch is ambiguous in git ref resolution and would breakgit checkout cloudinrebase_cloud.ymlcargo ops deploy|start --update-channeland an optionalupdate_channelfield inrunners.jsonwriteBENCHER_UPDATE_CHANNELinto the systemd drop-inrunner upreference, Runner Protocol reference, and the Self-Hosted Runners explanation updated in all 9 languages; changelog entries added underPending v0.6.9Self-update remains idle-only on both sides (server sends
Updateonly fromwait_for_ready; the runner handles it only inAwaitingJob), so a canary rollout never interrupts a running benchmark.Field testing flow
devel, resetcloudtodevel, and push--clobberor pushing a revert tocloud