dbb8f6e006713f43b7dbd6100d3b5c024dc72766
braney
  Fri Sep 18 11:11:15 2026 -0700
weeklybld: let the docker instance scripts run a past release, refs #38377

We could not reproduce a bug against the release a user is actually on.
hgwdev runs tip and the current release, and nothing older. Docker Hub
already has a per-release image, so the missing piece was a way to run one.

The lifecycle scripts now take a release name as well as tip, beta and rel.
run-instance.sh v503 starts the published v503 image as container kent-v503
on port 8503; the port is 8000 plus the release number, so the mapping needs
no table and no allocator. A release instance gets no CGI overlay, for the
same reason rel gets none: it has to be the code that shipped.
refresh-instance.sh, remove-instance.sh and smoke-instance.sh take the same
name. smoke-instance.sh checks a release instance against the version in its
own name, so no --version flag is needed. start-all.sh and stop-all.sh now
read the release containers that exist rather than a fixed list, so the set
of releases we keep can change without editing them.

tunnel-release.sh is one script for every release rather than one per
release, since that set changes.

v499 through v503 are running on hgwdev on ports 8499 through 8503 and pass
smoke-instance.sh. Five instances cost about 1.5 GB of memory, 10 GB of
docker disk, and no measurable CPU. They read tables from
genome-mysql.soe.ucsc.edu and files from hgdownload.soe.ucsc.edu, so they
put no load on the hgwdev MySQL or /gbdb.

diff --git src/utils/qa/weeklybld/refresh-instance.sh src/utils/qa/weeklybld/refresh-instance.sh
index c16632f68a6..e40baecb8ec 100755
--- src/utils/qa/weeklybld/refresh-instance.sh
+++ src/utils/qa/weeklybld/refresh-instance.sh
@@ -1,33 +1,36 @@
 #!/bin/bash
 #
-# refresh-instance.sh <tip|beta|rel>
+# refresh-instance.sh <tip|beta|rel|vNNN>
 #
 # Stop and remove the named container, then start a fresh one from the current
-# image. For rel, pull genomebrowser/server:latest from Docker Hub first; tip
-# and beta are built locally on hgwdev so there is nothing to pull. Persistent
-# state under ~build/dockerStuff/state/<name> survives because it is on host
-# volumes.
+# image. For rel and for a release instance (v499, v503, ...), pull the image
+# from Docker Hub first; tip and beta are built locally on hgwdev so there is
+# nothing to pull. A release tag never moves, so its pull is a no-op unless the
+# image is missing locally. Persistent state under
+# ~build/dockerStuff/state/<name> survives because it is on host volumes.
+# refs #38377
 # refs #37655
 #
 set -eEu -o pipefail
 
 selfDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 
 usage() {
-    echo "usage: $(basename "$0") tip|beta|rel" >&2
+    echo "usage: $(basename "$0") tip|beta|rel|vNNN" >&2
     exit 1
 }
 
 [[ $# -eq 1 ]] || usage
 name="$1"
 case "$name" in
     tip|beta|beta-arm64) ;;
     rel)                 docker pull genomebrowser/server:latest ;;
+    v[0-9][0-9][0-9])    docker pull "genomebrowser/server:$name" ;;
     *)                   usage ;;
 esac
 container="kent-$name"
 
 docker stop "$container" >/dev/null 2>&1 || true
 docker rm   "$container" >/dev/null 2>&1 || true
 
 exec "$selfDir/run-instance.sh" "$name"