fix: smoke-test agent images after build, add start --no-cache
lint / lint (push) Successful in 2m8s
test / unit (pull_request) Successful in 1m6s
test / integration (pull_request) Successful in 20s
test / coverage (pull_request) Failing after 1m7s

npm treats optionalDependencies failures as non-fatal, so a transient
network blip fetching claude-code's platform-native binary during
`npm install -g` left a stub CLI in an image that still "built"
successfully — then got baked into the Docker/Container layer cache
until forced to rebuild. Post-build smoke test (provider-declared
argv, run in a throwaway container of the freshly built image) fails
the launch loudly instead of shipping a broken image; --no-cache
gives an escape hatch to force a from-scratch rebuild.

Closes #353.
This commit is contained in:
2026-07-13 04:04:08 -04:00
parent eb804f8674
commit bfdbae804b
13 changed files with 113 additions and 4 deletions
+6 -1
View File
@@ -22,6 +22,7 @@ from contextlib import ExitStack, contextmanager
from pathlib import Path
from typing import Callable, Generator
from ...agent_provider import runtime_for
from ...egress import (
EGRESS_ROUTES_IN_CONTAINER,
egress_agent_env_entries,
@@ -462,10 +463,13 @@ def _agent_from_path(plan: SmolmachinesBottlePlan) -> Path:
return _ensure_smolmachine(
plan.agent_image,
dockerfile=plan.agent_dockerfile_path,
smoke_test=runtime_for(plan.agent_provider_template).smoke_test,
)
def _ensure_smolmachine(image_ref: str, *, dockerfile: str = "") -> Path:
def _ensure_smolmachine(
image_ref: str, *, dockerfile: str = "", smoke_test: tuple[str, ...] = (),
) -> Path:
"""Build the agent docker image and convert it into a
`.smolmachine` artifact, caching the result under
`~/.cache/bot-bottle/smolmachines/` keyed by the docker image
@@ -491,6 +495,7 @@ def _ensure_smolmachine(image_ref: str, *, dockerfile: str = "") -> Path:
already on disk for this image ID."""
_SMOLMACHINE_CACHE_DIR.mkdir(parents=True, exist_ok=True)
docker_mod.build_image(image_ref, _REPO_DIR, dockerfile=dockerfile)
docker_mod.verify_agent_image(image_ref, smoke_test)
# `sha256:abcd...` -> `abcd...` first 16 chars: short enough to
# keep filenames manageable, long enough to make collisions
# astronomically unlikely.