chore(release): automate container probes + document post-tag re-cut - #1198
Conversation
Retro improvements from the v1.14.0 release: - release-image-test.sh gains a `probe` scenario (part of `all`) that runs the two container-level checks done by hand during v1.14.0: OPEN_NOTEBOOK_WORKER_MAX_TASKS reaching the in-image worker (#1141's supervisord `sh -c` expansion), and the worker surviving startup with HTTP_PROXY set while the user's NO_PROXY value is preserved (#1160, internal SurrealDB websocket not tunneled). Self-contained standalone containers with their own cleanup, so a probe failure can't leak into the fresh/upgrade scenarios. - RELEASE_PROCESS.md documents two gotchas the release hit: never leave the version bump uncommitted on a branch (it leaked into an unrelated fix PR), and a post-tag fix requires a full re-cut (move tag + rebuild images), not just a tag nudge, or publication promotes the un-fixed artifact to v1-latest. Verified: `release-image-test.sh probe lfnovo/open_notebook:1.14.0` passes 4/4.
There was a problem hiding this comment.
2 issues found across 3 files
Confidence score: 4/5
- The riskiest gap is in
.github/RELEASE_PROCESS.md: it points maintainers to arunbook.mdsection for “Re-cut after a post-tag fix” that doesn’t exist, so a real post-tag incident could stall or lead to inconsistent manual recovery steps—add or link the exact re-cut procedure before merging. - In
scripts/release-test/release-image-test.sh, fixed Docker resource names can collide across parallel or interrupted runs, causing false probe failures and possible reuse/cleanup of another run’s resources—generate a per-invocation suffix and ensure cleanup targets only that run’s resources before merging.
You’re at about 95% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="scripts/release-test/release-image-test.sh">
<violation number="1" location="scripts/release-test/release-image-test.sh:187">
P2: Parallel or interrupted release-test runs can collide on these fixed Docker resource names, making the probe fail before testing the image and leaving/reusing another run's resources. Generate a per-invocation suffix for network and container names, and clean it via a trap.</violation>
</file>
<file name=".github/RELEASE_PROCESS.md">
<violation number="1" location=".github/RELEASE_PROCESS.md:164">
P2: The re-cut gotcha references `runbook.md` → "Re-cut after a post-tag fix", but that section does not exist. The file at `.agents/skills/release/runbook.md` has no re-cut or post-tag content — a maintainer facing a post-tag blocker will hunt for a non-existent section under pressure.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| # ws://). The app injects the internal hosts into NO_PROXY at startup. Boot | ||
| # with a dead proxy set plus a user NO_PROXY value, against a real DB, and | ||
| # assert the worker reaches RUNNING and the user's NO_PROXY value survives. | ||
| local NET=onrelprobe-net |
There was a problem hiding this comment.
P2: Parallel or interrupted release-test runs can collide on these fixed Docker resource names, making the probe fail before testing the image and leaving/reusing another run's resources. Generate a per-invocation suffix for network and container names, and clean it via a trap.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/release-test/release-image-test.sh, line 187:
<comment>Parallel or interrupted release-test runs can collide on these fixed Docker resource names, making the probe fail before testing the image and leaving/reusing another run's resources. Generate a per-invocation suffix for network and container names, and clean it via a trap.</comment>
<file context>
@@ -140,10 +147,85 @@ print('yes' if any(n.get('name')=='release-probe' for n in nbs) else 'no')" 2>/d
+ # ws://). The app injects the internal hosts into NO_PROXY at startup. Boot
+ # with a dead proxy set plus a user NO_PROXY value, against a real DB, and
+ # assert the worker reaches RUNNING and the user's NO_PROXY value survives.
+ local NET=onrelprobe-net
+ docker network create "$NET" >/dev/null 2>&1
+ docker run -d --rm --network "$NET" --name onrelprobe-surreal \
</file context>
| `v1-latest`) and a blocker is found in bucket C, the tag must move to the new | ||
| commit AND the version images must be rebuilt — a stale tag or stale registry | ||
| image will otherwise be what publication promotes to `v1-latest`. The exact | ||
| sequence is in `runbook.md` → "Re-cut after a post-tag fix" (v1.14.0 lesson). |
There was a problem hiding this comment.
P2: The re-cut gotcha references runbook.md → "Re-cut after a post-tag fix", but that section does not exist. The file at .agents/skills/release/runbook.md has no re-cut or post-tag content — a maintainer facing a post-tag blocker will hunt for a non-existent section under pressure.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/RELEASE_PROCESS.md, line 164:
<comment>The re-cut gotcha references `runbook.md` → "Re-cut after a post-tag fix", but that section does not exist. The file at `.agents/skills/release/runbook.md` has no re-cut or post-tag content — a maintainer facing a post-tag blocker will hunt for a non-existent section under pressure.</comment>
<file context>
@@ -148,6 +148,20 @@ accepted improvements immediately — update this document, the scripts under
+ `v1-latest`) and a blocker is found in bucket C, the tag must move to the new
+ commit AND the version images must be rebuilt — a stale tag or stale registry
+ image will otherwise be what publication promotes to `v1-latest`. The exact
+ sequence is in `runbook.md` → "Re-cut after a post-tag fix" (v1.14.0 lesson).
- **RC stack on non-default ports needs `API_URL`** or the browser talks to
`host:5055` — on a dev machine that is the development API (data crossover).
</file context>
Retro improvements captured immediately after the v1.14.0 release, while the context is fresh (Phase 9 of the release process).
What
1. Container probes are now automated (
scripts/release-test/release-image-test.sh)A new
probescenario, run as part ofmake release-test ... all, covers two release checks that a Python test suite structurally can't — they depend on the shipped image's process supervision (supervisord, entrypoint), not on app code:OPEN_NOTEBOOK_WORKER_MAX_TASKSreaches the in-image worker (feat(worker): expose OPEN_NOTEBOOK_WORKER_MAX_TASKS for worker concurrency #1141). supervisord'scommand=doesn't run through a shell, so the value is only honored via thesh -cwrapper — the probe boots with the var set and reads the concurrency back from the worker's startup log.HTTP_PROXYset ([Install]: HTTP proxy breaks worker startup — SurrealDB websocket tunneled through proxy (HTTP 403) #1160), the internal SurrealDB websocket isn't tunneled (no 403), and a user'sNO_PROXYvalue is preserved. Boots against a real SurrealDB with a dead proxy configured and asserts the worker reachesRUNNING.Both were run by hand during the v1.14.0 release. Each probe is a self-contained standalone container with its own cleanup, so a failure can't leak state into the fresh/upgrade scenarios.
2. Two gotchas documented (
.github/RELEASE_PROCESS.md)git add -A, shipping the version inside afix(...)commit.v1-latest.The exact re-cut command sequence was also added to the release runbook (maintainer-local, gitignored).
Verification
bash -nclean on the script.