From e1a10d9f6f876b7aa6f113c17fa97cbbe5d49553 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Tue, 24 Feb 2026 10:59:23 -0600 Subject: [PATCH] Improve smoke log capture and add CI image cache Make Ollama bootstrap logging explicit, persist smoke check output into artifacts, and include netclaw home snapshots for troubleshooting. Add Buildx/GHA layer caching and prebuild the smoke image in CI to reduce repeated compose build costs. --- .github/workflows/smoke_sandbox.yml | 19 ++++++++++++++++++- README.md | 10 +++++++--- docker-compose.smoke.yml | 17 +++-------------- scripts/smoke/collect-logs.sh | 4 ++++ scripts/smoke/ollama-init.sh | 23 +++++++++++++++++++++++ scripts/smoke/up.sh | 7 ++++++- 6 files changed, 61 insertions(+), 19 deletions(-) create mode 100755 scripts/smoke/ollama-init.sh diff --git a/.github/workflows/smoke_sandbox.yml b/.github/workflows/smoke_sandbox.yml index 0150375c8..a328ffb99 100644 --- a/.github/workflows/smoke_sandbox.yml +++ b/.github/workflows/smoke_sandbox.yml @@ -26,6 +26,7 @@ jobs: env: PROJECT_NAME: netclaw-smoke-${{ github.run_id }}-${{ github.run_attempt }} SMOKE_OLLAMA_MODEL: qwen2:0.5b + SMOKE_BUILD: 0 INIT_TIMEOUT_SECONDS: 1200 START_TIMEOUT_SECONDS: 180 STEP_TIMEOUT_SECONDS: 120 @@ -40,11 +41,27 @@ jobs: with: global-json-file: ./global.json + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build smoke sandbox image (cached) + uses: docker/build-push-action@v6 + with: + context: . + file: docker/smoke/Dockerfile + tags: netclaw-smoke:local + load: true + cache-from: type=gha,scope=netclaw-smoke + cache-to: type=gha,mode=max,scope=netclaw-smoke + - name: Start smoke sandbox run: bash scripts/smoke/up.sh - name: Run smoke checks - run: bash scripts/smoke/check.sh + run: | + mkdir -p smoke-logs + set -o pipefail + bash scripts/smoke/check.sh 2>&1 | tee smoke-logs/check.log - name: Collect smoke logs if: always() diff --git a/README.md b/README.md index 702ca1273..95dc09d7a 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,9 @@ command yet). # Start sandbox (build local image + start Ollama + pull tiny model) scripts/smoke/up.sh +# Start without rebuilding image (useful after pre-building or in CI) +SMOKE_BUILD=0 scripts/smoke/up.sh + # Run smoke checks (daemon start/status/health/stop) scripts/smoke/check.sh @@ -74,9 +77,10 @@ STEP_TIMEOUT_SECONDS=120 scripts/smoke/check.sh `smoke_sandbox` is available in GitHub Actions: - Runs manually via `workflow_dispatch`. -- Runs on PRs labeled `smoke`. -- Always uploads `smoke-logs-*` artifact (container logs, compose status, - daemon log, PID snapshot) for debugging. +- Runs on every pull request update. +- Uses Docker Buildx + GitHub Actions cache for smoke image layers. +- Always uploads `smoke-logs-*` artifact (including `check.log`, container + logs, compose status, daemon log, PID snapshot) for debugging. ## CLI Reference diff --git a/docker-compose.smoke.yml b/docker-compose.smoke.yml index 398e11550..8955cbb01 100644 --- a/docker-compose.smoke.yml +++ b/docker-compose.smoke.yml @@ -7,24 +7,13 @@ services: ollama-init: image: curlimages/curl:8.13.0 - entrypoint: ["/bin/sh", "-c"] + entrypoint: ["/bin/sh", "/usr/local/bin/ollama-init.sh"] environment: SMOKE_OLLAMA_MODEL: ${SMOKE_OLLAMA_MODEL:-qwen2:0.5b} depends_on: - ollama - command: > - set -eu; - echo "Waiting for Ollama API to become available..."; - for i in 1 2 3 4 5 6 7 8 9 10 11 12; do - if curl -fsS http://ollama:11434/api/tags >/dev/null; then - break; - fi; - echo "Ollama not ready yet (attempt $$i/12)."; - sleep 5; - done; - echo "Pulling smoke model: $${SMOKE_OLLAMA_MODEL}"; - curl -fsS -X POST http://ollama:11434/api/pull -d "{\"name\":\"$${SMOKE_OLLAMA_MODEL}\"}" >/dev/null; - echo "Model pull request completed."; + volumes: + - ./scripts/smoke/ollama-init.sh:/usr/local/bin/ollama-init.sh:ro netclaw-sandbox: image: netclaw-smoke:local diff --git a/scripts/smoke/collect-logs.sh b/scripts/smoke/collect-logs.sh index 0fb9e5bf4..db306a1b7 100755 --- a/scripts/smoke/collect-logs.sh +++ b/scripts/smoke/collect-logs.sh @@ -36,4 +36,8 @@ run_timed "$STEP_TIMEOUT_SECONDS" docker compose -p "$PROJECT_NAME" -f "$COMPOSE 'if [ -f /root/.netclaw/netclaw.pid ]; then cat /root/.netclaw/netclaw.pid; fi' \ >"$LOG_DIR/netclaw.pid" || true +run_timed "$STEP_TIMEOUT_SECONDS" docker compose -p "$PROJECT_NAME" -f "$COMPOSE_FILE" exec -T netclaw-sandbox sh -lc \ + 'ls -la /root/.netclaw || true' \ + >"$LOG_DIR/netclaw-home-ls.txt" || true + echo "Smoke logs collected at: $LOG_DIR" diff --git a/scripts/smoke/ollama-init.sh b/scripts/smoke/ollama-init.sh new file mode 100755 index 000000000..7d51d08ea --- /dev/null +++ b/scripts/smoke/ollama-init.sh @@ -0,0 +1,23 @@ +#!/bin/sh +set -eu + +MODEL="${SMOKE_OLLAMA_MODEL:-qwen2:0.5b}" + +echo "Waiting for Ollama API to become available..." +for i in $(seq 1 24); do + if curl -fsS http://ollama:11434/api/tags >/dev/null; then + echo "Ollama is ready." + break + fi + + echo "Ollama not ready yet (attempt $i/24)." + sleep 5 +done + +echo "Pulling smoke model: $MODEL" +curl -fsS -X POST http://ollama:11434/api/pull -d "{\"name\":\"$MODEL\"}" + +echo "Verifying model is available: $MODEL" +curl -fsS http://ollama:11434/api/tags + +echo "Model init completed." diff --git a/scripts/smoke/up.sh b/scripts/smoke/up.sh index 4a279952e..a39f7eff2 100755 --- a/scripts/smoke/up.sh +++ b/scripts/smoke/up.sh @@ -4,8 +4,13 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" COMPOSE_FILE="${COMPOSE_FILE:-$ROOT_DIR/docker-compose.smoke.yml}" PROJECT_NAME="${PROJECT_NAME:-netclaw-smoke}" +SMOKE_BUILD="${SMOKE_BUILD:-1}" -docker compose -p "$PROJECT_NAME" -f "$COMPOSE_FILE" up -d --build +if [[ "$SMOKE_BUILD" == "1" ]]; then + docker compose -p "$PROJECT_NAME" -f "$COMPOSE_FILE" up -d --build +else + docker compose -p "$PROJECT_NAME" -f "$COMPOSE_FILE" up -d +fi cat <