From 9172bf3a42b94397cfa29c3954e73ae63f3264de Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 19 Jul 2026 16:57:56 +0000 Subject: [PATCH] fix(infra-artifact): include pyproject.toml in rootfs version digest Dockerfile.gateway COPYs pyproject.toml into /src and runs pip install /src, so it is a real input to the baked rootfs. A dependency-only change previously reused stale artifact versions, potentially booting a rootfs whose installed packages differed from the current checkout. Also adds _fake_repo fixture support and a regression test so this input can't silently drop out of the hash again. Co-Authored-By: Claude Sonnet 4.6 --- bot_bottle/backend/firecracker/infra_artifact.py | 2 ++ tests/unit/test_infra_artifact.py | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/bot_bottle/backend/firecracker/infra_artifact.py b/bot_bottle/backend/firecracker/infra_artifact.py index 127288c..ba91cb8 100644 --- a/bot_bottle/backend/firecracker/infra_artifact.py +++ b/bot_bottle/backend/firecracker/infra_artifact.py @@ -85,6 +85,8 @@ def infra_artifact_version(init_script: str, *, repo_root: Path = _REPO_ROOT) -> h.update(name.encode()) h.update(b"\0") h.update((repo_root / name).read_bytes()) + h.update(b"pyproject.toml\0") + h.update((repo_root / "pyproject.toml").read_bytes()) h.update(b"init\0") h.update(init_script.encode()) return h.hexdigest()[:16] diff --git a/tests/unit/test_infra_artifact.py b/tests/unit/test_infra_artifact.py index 47ddcd1..805758a 100644 --- a/tests/unit/test_infra_artifact.py +++ b/tests/unit/test_infra_artifact.py @@ -93,6 +93,17 @@ class TestVersionInputs(unittest.TestCase): (pkg / "netpool.defaults.env").write_text("FOO=1\n") for name in ("Dockerfile.orchestrator", "Dockerfile.gateway", "Dockerfile.infra"): (root / name).write_text(f"FROM scratch # {name}\n") + (root / "pyproject.toml").write_text("[project]\nname = 'bot-bottle'\n") + + def test_pyproject_toml_change_bumps_version(self) -> None: + with tempfile.TemporaryDirectory() as d: + root = Path(d) + self._fake_repo(root) + before = ia.infra_artifact_version("init", repo_root=root) + (root / "pyproject.toml").write_text( + "[project]\nname = 'bot-bottle'\ndependencies = ['httpx']\n") + after = ia.infra_artifact_version("init", repo_root=root) + self.assertNotEqual(before, after) def test_non_python_file_change_bumps_version(self) -> None: with tempfile.TemporaryDirectory() as d: