From d0473349fef8ba6107da81cd29527160ffbbe15f Mon Sep 17 00:00:00 2001 From: "Al @h0lybyte" <5599058+h0lybyte@users.noreply.github.com> Date: Wed, 25 Feb 2026 08:56:46 -0500 Subject: [PATCH 1/2] fix(mc): layer Dockerfile into parallel build stages for pumpkin and plugin Split the monolithic builder stage into separate deps, builder, and plugin-builder stages so BuildKit can compile the server binary and plugin cdylib concurrently. The plugin stage reuses cooked third-party deps via CARGO_TARGET_DIR, eliminating redundant compilation. --- apps/mc/Dockerfile | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/mc/Dockerfile b/apps/mc/Dockerfile index a0ccef292b..8441cd596a 100644 --- a/apps/mc/Dockerfile +++ b/apps/mc/Dockerfile @@ -11,28 +11,31 @@ RUN rustup component add rustfmt FROM chef AS planner RUN cargo chef prepare --recipe-path recipe.json -# --- Pumpkin: cook dependencies (cached until Cargo.toml/lock changes) --- -FROM chef AS builder +# --- Cook: compile third-party deps (cached until Cargo.toml/lock changes) --- +FROM chef AS deps COPY --from=planner /pumpkin/recipe.json recipe.json RUN --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ cargo chef cook --release --recipe-path recipe.json -# Build Pumpkin server (only recompiles changed source, deps are cached) +# --- Pumpkin: build server (parallel with plugin, only workspace crates recompile) --- +FROM deps AS builder COPY ./pumpkin /pumpkin RUN --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ cargo build --release && cp target/release/pumpkin ./pumpkin.release -# Build plugins (path deps to pumpkin crates, use mount cache) +# --- Plugin: build (parallel with pumpkin, reuses cooked deps via shared target) --- +FROM deps AS plugin-builder +COPY ./pumpkin /pumpkin COPY ./plugins /plugins -RUN --mount=type=cache,sharing=private,target=/plugins/kbve-mc-plugin/target \ - --mount=type=cache,target=/usr/local/cargo/git/db \ +ENV CARGO_TARGET_DIR=/pumpkin/target +RUN --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ cargo build --release --manifest-path /plugins/kbve-mc-plugin/Cargo.toml \ && mkdir -p /built-plugins \ - && cp /plugins/kbve-mc-plugin/target/release/libkbve_mc_plugin.so /built-plugins/ 2>/dev/null \ - || cp /plugins/kbve-mc-plugin/target/release/libkbve_mc_plugin.dylib /built-plugins/ 2>/dev/null \ + && cp /pumpkin/target/release/libkbve_mc_plugin.so /built-plugins/ 2>/dev/null \ + || cp /pumpkin/target/release/libkbve_mc_plugin.dylib /built-plugins/ 2>/dev/null \ || true # --- Resource pack --- @@ -47,7 +50,7 @@ RUN SHA1=$(sha1sum /kbve-resource-pack.zip | awk '{print $1}') && \ FROM alpine:3.23 COPY --from=builder /pumpkin/pumpkin.release /bin/pumpkin -COPY --from=builder /built-plugins/ /pumpkin/plugins/ +COPY --from=plugin-builder /built-plugins/ /pumpkin/plugins/ WORKDIR /pumpkin From 94b1377e326ba529915e9efa696b5448c9fe2851 Mon Sep 17 00:00:00 2001 From: "Al @h0lybyte" <5599058+h0lybyte@users.noreply.github.com> Date: Wed, 25 Feb 2026 09:02:12 -0500 Subject: [PATCH 2/2] feat(mc): tier workspace crate builds into foundation and core layers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-build workspace crates in dependency order across isolated Docker layers so only the changed tier recompiles on rebuild: deps → foundation (nbt, api-macros, util, data, macros, config) → core (world, protocol, inventory) → builder | plugin-builder (parallel via BuildKit) When only the root pumpkin crate or plugin source changes, foundation and core layers are fully cached. --- apps/mc/Dockerfile | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/mc/Dockerfile b/apps/mc/Dockerfile index 8441cd596a..f32a5b018d 100644 --- a/apps/mc/Dockerfile +++ b/apps/mc/Dockerfile @@ -18,16 +18,46 @@ RUN --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ cargo chef cook --release --recipe-path recipe.json -# --- Pumpkin: build server (parallel with plugin, only workspace crates recompile) --- -FROM deps AS builder -COPY ./pumpkin /pumpkin +# --- Foundation: leaf + data crates (rarely change, cached aggressively) --- +FROM deps AS foundation +COPY ./pumpkin/pumpkin-nbt /pumpkin/pumpkin-nbt +COPY ./pumpkin/pumpkin-api-macros /pumpkin/pumpkin-api-macros +COPY ./pumpkin/pumpkin-util /pumpkin/pumpkin-util +COPY ./pumpkin/pumpkin-data /pumpkin/pumpkin-data +COPY ./pumpkin/pumpkin-macros /pumpkin/pumpkin-macros +COPY ./pumpkin/pumpkin-config /pumpkin/pumpkin-config +RUN --mount=type=cache,target=/usr/local/cargo/git/db \ + --mount=type=cache,target=/usr/local/cargo/registry/ \ + cargo build --release \ + -p pumpkin-nbt \ + -p pumpkin-api-macros \ + -p pumpkin-util \ + -p pumpkin-data \ + -p pumpkin-macros \ + -p pumpkin-config + +# --- Core: engine crates (protocol, world, inventory) --- +FROM foundation AS core +COPY ./pumpkin/pumpkin-world /pumpkin/pumpkin-world +COPY ./pumpkin/pumpkin-protocol /pumpkin/pumpkin-protocol +COPY ./pumpkin/pumpkin-inventory /pumpkin/pumpkin-inventory +RUN --mount=type=cache,target=/usr/local/cargo/git/db \ + --mount=type=cache,target=/usr/local/cargo/registry/ \ + cargo build --release \ + -p pumpkin-world \ + -p pumpkin-protocol \ + -p pumpkin-inventory + +# --- Pumpkin: build server (parallel with plugin) --- +FROM core AS builder +COPY ./pumpkin/pumpkin /pumpkin/pumpkin RUN --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ cargo build --release && cp target/release/pumpkin ./pumpkin.release -# --- Plugin: build (parallel with pumpkin, reuses cooked deps via shared target) --- -FROM deps AS plugin-builder -COPY ./pumpkin /pumpkin +# --- Plugin: build (parallel with pumpkin, reuses all pre-compiled crates) --- +FROM core AS plugin-builder +COPY ./pumpkin/pumpkin /pumpkin/pumpkin COPY ./plugins /plugins ENV CARGO_TARGET_DIR=/pumpkin/target RUN --mount=type=cache,target=/usr/local/cargo/git/db \