Uh oh!
There was an error while loading. Please reload this page.
fix(chart): pin mysql-client by digest — keep fleets on the 5.7-lineage prod image - #454
Conversation
…ge prod image (backend#723) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LukasWodka
commented
Jul 28, 2026
bugbot run |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 8408cd3. Configure here.
LukasWodka
commented
Jul 28, 2026
The "Fleet auto-upgrade E2E (k3d)" failure is unrelated to this diff — it's a baseline shift, and it will hit every chart-touching PR until fixed:
Fix (separate small PR): make the expectation era-aware — derive it from whether the baseline release's computed values contain |
LukasWodka
commented
Jul 28, 2026
The E2E baseline fix is up as #455 — once it merges, I'll re-run this PR's failed check (the merge ref will then include the era-aware assertion). |
…ase now carries the prod pin The path-1 assertion hardcoded the pre-#398 era: it expected NO ingestor pin after a --reuse-values upgrade because the published release's computed values predated images.ingestor.prodDigest. The #383 promotion (2026-07-27) published a release that includes the pin, so replayed computed values now carry it and the assertion fails on every chart-touching PR (first hit: #454). The expectation is now read from the baseline release itself (helm get values --all): pin absent => must not arrive (old behavior); pin present => the SAME digest must be replayed verbatim. Both eras keep asserting the actual limitation: --reuse-values never injects new chart defaults. Path-2's era-stale comment corrected, with a note on the replay-contamination signal a future pin bump will surface. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LukasWodka
commented
Jul 28, 2026
Cherry-picked the era-aware E2E assertion fix (#455, commit 8879713 → b77d95d here) onto this branch so this PR's CI is self-contained — the failing "Fleet auto-upgrade E2E (k3d)" check re-runs now with the corrected assertion in the merge ref. The fix is already proven: #455's own E2E leg went green against the real post-#383 baseline (the pin-carrying release). Same commit content in both PRs, so either merge order is clean:
bugbot run |
…CI runners) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LukasWodka
commented
Jul 28, 2026
bugbot run |
saqlainsyed007
commented
Jul 28, 2026
Code ReviewOverviewTwo defensive changes:
Correctness — verified ✅
Issues / risks
Test coverageNo automated assertion that the chart renders the mysqlClient digest path — relies on the manual SecurityPinning by digest is a supply-chain improvement (immutability/reproducibility over a mutable tag). Net positive. VerdictApprove with minor comments. Well-scoped, the pin is verified correct against the live registry, and the e2e update genuinely hardens the gate. Only the 🤖 Reviewed with Claude Code |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit d76af0a. Configure here.
…the path-2 tripwire in #459 (review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…est path (review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LukasWodka
commented
Jul 28, 2026
All four points addressed — thanks for the precise review:
bugbot run |
Uh oh!
There was an error while loading. Please reload this page.
…ow carries the prod pin (#455) * fix(e2e): era-aware --reuse-values pin assertion — the published release now carries the prod pin The path-1 assertion hardcoded the pre-#398 era: it expected NO ingestor pin after a --reuse-values upgrade because the published release's computed values predated images.ingestor.prodDigest. The #383 promotion (2026-07-27) published a release that includes the pin, so replayed computed values now carry it and the assertion fails on every chart-touching PR (first hit: #454). The expectation is now read from the baseline release itself (helm get values --all): pin absent => must not arrive (old behavior); pin present => the SAME digest must be replayed verbatim. Both eras keep asserting the actual limitation: --reuse-values never injects new chart defaults. Path-2's era-stale comment corrected, with a note on the replay-contamination signal a future pin bump will surface. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(e2e): fail fast when jq is missing (review: local runs, not just CI runners) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(e2e): one era boundary, stated once (the #383 promotion); track the path-2 tripwire in #459 (review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
images.mysqlClientnow defaults to a digest pin on the currenttracebloc/mysql-client:prodimage (5.7-lineage, pushed 2026-04-24) instead of following the floating:prodtag.Why: the repo's
Dockerfile.mysql_clienthas moved ahead to MySQL 8.4 (backend#723), but every existing workspace datadir is 5.7-format, and MySQL supports only staged upgrades (5.7 → 8.0 → 8.4) — an 8.4 server refuses to start on a 5.7 datadir. With a floating tag, any republish of:prodwould reach fleets implicitly: fresh installs immediately, running workspaces on their next fresh pull (cache eviction / node replacement). Pinning by digest makes the MySQL engine upgrade an explicit, reviewed chart change — exactly what the surrounding comment already recommends ("pin via digest instead").Decided 2026-07-28 (Lukas + Saqlain) as part of the mysql-client migration sequencing on backend#723. The companion guard on the manual build path is in tracebloc/client-runtime#213.
Type
Test plan
helm template(with required install values set) renders the mysql container asdocker.io/tracebloc/mysql-client@sha256:f546e47f…— the digest path of thetracebloc.imagehelper. Verified locally.:prodmanifest digest (tag_last_pushed 2026-04-24).values.schema.jsondigest pattern (^(sha256:[a-f0-9]{64})?$) satisfied — chart schema validation passes.Rollout
No image change is triggered by this PR — it pins what fleets already run. Takes effect per fleet at its next
helm upgrade. Remove/replace the pin only as an explicit step of the staged migration in backend#723.🤖 Generated with Claude Code
Note
Medium Risk
Pins the data-plane MySQL image digest (correctness-sensitive for 5.7 datadirs); rollout is no-op until helm upgrade, with low blast radius because the pin matches the current tag.
Overview
Pins
images.mysqlClient.digestin chart defaults to the current MySQL 5.7-lineagetracebloc/mysql-client:prodimage so fleets no longer follow the floating:prodtag. A republish of:prod(e.g. toward 8.4 per backend#723) would otherwise reach installs implicitly while existing workspace datadirs still require staged upgrades; behavior is unchanged because the digest matches what the tag already resolved to.Adds a Helm unittest on
mysql-deployment.yamlthat the mysql container image renders asdocker.io/tracebloc/mysql-client@sha256:….The e2e auto-upgrade script now reads the baseline release’s
images.ingestor.prodDigestviahelm get values+jq(with ajqpreflight) and asserts thathelm upgrade --reuse-valueseither leaves the ingestor pin absent (pre-pin baselines) or replays the baseline digest verbatim—not the new chart default—with notes on path-1/path-2 interaction when pins diverge (client#459).Reviewed by Cursor Bugbot for commit c118c61. Bugbot is set up for automated code reviews on this repo. Configure here.