feat(runtime): install the toolchain missions are told to use
`templates/teams/rust_sdlc.toml` instructs the coder to run `cargo test`; the `done_when` evaluator runs a project's own suite to verify a claim rather than believe it; `security_scan.rs` shells out to cargo-audit, gitleaks, trivy and semgrep. The runtime image contained none of them. The security consequence was the worse one. With no scanners present, a scan emitted four `<tool>:tool_error` task rows and completed — a scan that scanned nothing and reported cleanly. Same class of false signal as a verifier that never ran a command. Adds gitleaks 8.30.1, trivy 0.72.0, semgrep (in its own venv so its pinned dependency tree cannot collide), and a minimal Rust stable toolchain with cargo-audit. Versions are pinned as build args and were taken from the releases API — the first attempt used plausible-looking numbers that 404'd. Layers are ordered cheapest-and-most-stable first so bumping a scanner does not invalidate the Rust layer, and the cargo registry is dropped after `cargo install`. Measured: 864 MB -> 3.13 GB (scanners +350 MB, Rust +1.23 GB, semgrep +680 MB). Note this image is NOT in `AGENT_IMAGES` — it never ships to fleet nodes, only gw-04 holds it, against 112 GB free. An earlier note claiming otherwise was wrong. The real cost is a slower `docker save | load` per rebuild. Verified in the built image: rustc 1.97.1, cargo-audit 0.22.2, gitleaks 8.30.1, trivy 0.72.0, semgrep 1.172.0, python 3.11.2, plus the existing git, claude and node. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c812b714f4
commit
9f874bc06a
@@ -56,6 +56,62 @@ RUN set -eux; \
|
|||||||
/usr/local/bin/tea --version | head -1; \
|
/usr/local/bin/tea --version | head -1; \
|
||||||
/usr/local/bin/gitea-mcp --version 2>&1 | head -1 || true
|
/usr/local/bin/gitea-mcp --version 2>&1 | head -1 || true
|
||||||
|
|
||||||
|
# ── Mission toolchain ────────────────────────────────────────────────
|
||||||
|
# Agents and the phase evaluator both run project checks inside this image:
|
||||||
|
# `templates/teams/rust_sdlc.toml` tells the coder to run `cargo test`, the
|
||||||
|
# `done_when` evaluator runs the project's own suite to verify a claim rather
|
||||||
|
# than believe it, and `security_scan.rs` shells out to four scanners.
|
||||||
|
#
|
||||||
|
# None of it was here. A Rust mission's `cargo build` failed, and every
|
||||||
|
# security scan produced four `<tool>:tool_error` task rows instead of
|
||||||
|
# findings — a scan that scanned nothing and reported cleanly.
|
||||||
|
#
|
||||||
|
# Measured cost on top of the 864 MB base: scanners +350 MB, Rust +1.23 GB,
|
||||||
|
# semgrep +680 MB. This image is NOT in `AGENT_IMAGES`, so it never ships to
|
||||||
|
# fleet nodes — only gw-04 holds it, against 112 GB free. The real cost is a
|
||||||
|
# slower `docker save | load` on each runtime rebuild, which is worth paying
|
||||||
|
# for missions that can actually compile and test what they write.
|
||||||
|
#
|
||||||
|
# Ordered cheapest-and-most-stable first so a version bump lower down doesn't
|
||||||
|
# invalidate the expensive layers above it.
|
||||||
|
ARG GITLEAKS_VERSION=8.30.1
|
||||||
|
ARG TRIVY_VERSION=0.72.0
|
||||||
|
RUN set -eux; \
|
||||||
|
arch="$(dpkg --print-architecture)"; \
|
||||||
|
case "$arch" in \
|
||||||
|
amd64) gl_arch=x64; tv_arch=64bit ;; \
|
||||||
|
arm64) gl_arch=arm64; tv_arch=ARM64 ;; \
|
||||||
|
*) echo "unsupported arch: $arch"; exit 1 ;; \
|
||||||
|
esac; \
|
||||||
|
curl -fsSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_${gl_arch}.tar.gz" \
|
||||||
|
| tar -xz -C /usr/local/bin gitleaks; \
|
||||||
|
curl -fsSL "https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-${tv_arch}.tar.gz" \
|
||||||
|
| tar -xz -C /usr/local/bin trivy; \
|
||||||
|
gitleaks version; trivy --version | head -1
|
||||||
|
|
||||||
|
# semgrep in its own venv so its pinned dependency tree can never collide with
|
||||||
|
# anything else installed here.
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
python3 python3-pip python3-venv \
|
||||||
|
&& python3 -m venv /opt/semgrep \
|
||||||
|
&& /opt/semgrep/bin/pip install --no-cache-dir semgrep \
|
||||||
|
&& ln -s /opt/semgrep/bin/semgrep /usr/local/bin/semgrep \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& semgrep --version
|
||||||
|
|
||||||
|
# Rust last: the largest layer and the one most likely to be bumped, so it
|
||||||
|
# sits where a rebuild costs the least cache.
|
||||||
|
ENV RUSTUP_HOME=/usr/local/rustup \
|
||||||
|
CARGO_HOME=/usr/local/cargo \
|
||||||
|
PATH=/usr/local/cargo/bin:$PATH
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc libc6-dev pkg-config libssl-dev make \
|
||||||
|
&& curl -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable \
|
||||||
|
&& cargo install cargo-audit --locked --no-default-features \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* "$CARGO_HOME/registry" "$CARGO_HOME/git" \
|
||||||
|
&& chmod -R a+rX "$RUSTUP_HOME" "$CARGO_HOME" \
|
||||||
|
&& rustc --version && cargo audit --version
|
||||||
|
|
||||||
COPY --from=build /usr/local/bin/zeroclaw /usr/local/bin/zeroclaw
|
COPY --from=build /usr/local/bin/zeroclaw /usr/local/bin/zeroclaw
|
||||||
ENV HOME=/zeroclaw-data \
|
ENV HOME=/zeroclaw-data \
|
||||||
ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace \
|
ZEROCLAW_WORKSPACE=/zeroclaw-data/workspace \
|
||||||
|
|||||||
Reference in New Issue
Block a user