diff --git a/Dockerfile b/Dockerfile index e79f2d9..37032f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1 +# syntax=docker/dockerfile:1.7 # ── Stage 1: Build ──────────────────────────────────────────── FROM rust:1.93-slim-trixie@sha256:9663b80a1621253d30b146454f903de48f0af925c967be48c84745537cd35d8b AS builder @@ -6,27 +6,30 @@ FROM rust:1.93-slim-trixie@sha256:9663b80a1621253d30b146454f903de48f0af925c967be WORKDIR /app # Install build dependencies -RUN apt-get update && apt-get install -y \ - pkg-config \ +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt-get update && apt-get install -y \ + pkg-config \ && rm -rf /var/lib/apt/lists/* # 1. Copy manifests to cache dependencies COPY Cargo.toml Cargo.lock ./ # Create dummy main.rs to build dependencies RUN mkdir src && echo "fn main() {}" > src/main.rs -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/usr/local/cargo/git \ +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ cargo build --release --locked RUN rm -rf src # 2. Copy source code COPY . . -# Touch main.rs to force rebuild -RUN touch src/main.rs -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/usr/local/cargo/git \ +RUN --mount=type=cache,id=zeroclaw-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ + --mount=type=cache,id=zeroclaw-cargo-git,target=/usr/local/cargo/git,sharing=locked \ + --mount=type=cache,id=zeroclaw-target,target=/app/target,sharing=locked \ cargo build --release --locked && \ - strip target/release/zeroclaw + cp target/release/zeroclaw /app/zeroclaw && \ + strip /app/zeroclaw # ── Stage 2: Permissions & Config Prep ─────────────────────── FROM busybox:1.37@sha256:b3255e7dfbcd10cb367af0d409747d511aeb66dfac98cf30e97e87e4207dd76f AS permissions @@ -35,7 +38,7 @@ RUN mkdir -p /zeroclaw-data/.zeroclaw /zeroclaw-data/workspace # Create minimal config for PRODUCTION (allows binding to public interfaces) # NOTE: Provider configuration must be done via environment variables at runtime -RUN cat > /zeroclaw-data/.zeroclaw/config.toml << 'EOF' +RUN cat > /zeroclaw-data/.zeroclaw/config.toml </dev/null 2>&1; then + mkdir -p "$SMOKE_CACHE_DIR" + local build_args=( + --load + --target dev + --cache-to "type=local,dest=$SMOKE_CACHE_DIR,mode=max" + -t zeroclaw-local-smoke:latest + . + ) + if [ -f "$SMOKE_CACHE_DIR/index.json" ]; then + build_args=(--cache-from "type=local,src=$SMOKE_CACHE_DIR" "${build_args[@]}") + fi + docker buildx build "${build_args[@]}" + else + DOCKER_BUILDKIT=1 docker build --target dev -t zeroclaw-local-smoke:latest . + fi +} + print_help() { cat <<'EOF' ZeroClaw Local CI in Docker @@ -88,7 +108,7 @@ case "$1" in ;; docker-smoke) - docker build --target dev -t zeroclaw-local-smoke:latest . + build_smoke_image docker run --rm zeroclaw-local-smoke:latest --version ;; @@ -98,7 +118,7 @@ case "$1" in run_in_ci "cargo build --release --locked --verbose" run_in_ci "cargo deny check licenses sources" run_in_ci "cargo audit" - docker build --target dev -t zeroclaw-local-smoke:latest . + build_smoke_image docker run --rm zeroclaw-local-smoke:latest --version ;; diff --git a/src/channels/mod.rs b/src/channels/mod.rs index fc9a7d2..d63f63d 100644 --- a/src/channels/mod.rs +++ b/src/channels/mod.rs @@ -227,7 +227,7 @@ async fn process_channel_message(ctx: Arc, msg: traits::C truncate_with_ellipsis(&response, 80) ); if let Some(channel) = target_channel.as_ref() { - if let Err(e) = channel.send(&response, &msg.channel).await { + if let Err(e) = channel.send(&response, &msg.reply_target).await { eprintln!(" ❌ Failed to reply on {}: {e}", channel.name()); } }