From a12f84019f89bda26385d68709747c84e961e31f Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sun, 8 Mar 2026 12:35:28 -0700 Subject: [PATCH] Avoid redundant Docker test image rebuilds --- scripts/test-rig/ensure-image.sh | 46 ++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/scripts/test-rig/ensure-image.sh b/scripts/test-rig/ensure-image.sh index 2aa7c02..56e7f69 100755 --- a/scripts/test-rig/ensure-image.sh +++ b/scripts/test-rig/ensure-image.sh @@ -4,6 +4,17 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" IMAGE_TAG="${SANDBOX_AGENT_TEST_IMAGE:-sandbox-agent-test:dev}" LOCK_DIR="$ROOT_DIR/.context/docker-test-image.lock" +STAMP_FILE="$ROOT_DIR/.context/docker-test-image.stamp" + +INPUTS=( + "$ROOT_DIR/Cargo.toml" + "$ROOT_DIR/Cargo.lock" + "$ROOT_DIR/server" + "$ROOT_DIR/gigacode" + "$ROOT_DIR/resources/agent-schemas/artifacts" + "$ROOT_DIR/scripts/agent-configs" + "$ROOT_DIR/docker/test-agent/Dockerfile" +) release_lock() { if [[ -d "$LOCK_DIR" ]]; then @@ -11,16 +22,51 @@ release_lock() { fi } +latest_input_mtime() { + find "${INPUTS[@]}" -type f -exec stat -f '%m' {} + | sort -nr | head -n1 +} + +image_is_ready() { + if ! docker image inspect "$IMAGE_TAG" >/dev/null 2>&1; then + return 1 + fi + + if [[ ! -f "$STAMP_FILE" ]]; then + return 1 + fi + + local stamp_mtime + stamp_mtime="$(stat -f '%m' "$STAMP_FILE")" + local latest_mtime + latest_mtime="$(latest_input_mtime)" + + [[ -n "$latest_mtime" && "$stamp_mtime" -ge "$latest_mtime" ]] +} + +mkdir -p "$ROOT_DIR/.context" + +if image_is_ready; then + printf '%s\n' "$IMAGE_TAG" + exit 0 +fi + while ! mkdir "$LOCK_DIR" 2>/dev/null; do sleep 1 done trap release_lock EXIT +if image_is_ready; then + printf '%s\n' "$IMAGE_TAG" + exit 0 +fi + docker build \ --tag "$IMAGE_TAG" \ --file "$ROOT_DIR/docker/test-agent/Dockerfile" \ "$ROOT_DIR" \ >/dev/null +touch "$STAMP_FILE" + printf '%s\n' "$IMAGE_TAG"