dev: cache Docker dependencies with cargo-chef
Cook native and Wasm dependencies in reusable Docker layers. Let the frontend build script use the cooked Wasm target directory while preserving local build defaults. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
parent
2305660d5a
commit
ac5a40af37
|
|
@ -26,6 +26,7 @@ Notable changes to this project are documented here.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- Cache native and Wasm dependencies with cargo-chef in Docker builds to speed up source-only rebuilds.
|
||||||
- Terminate shard processes when their simulation thread fails, so Docker can restart them instead of leaving an unresponsive shard and a repeatedly restarting gateway.
|
- Terminate shard processes when their simulation thread fails, so Docker can restart them instead of leaving an unresponsive shard and a repeatedly restarting gateway.
|
||||||
- People, rabbits, wolves, and partnerships are Picard actors that own their state; the world only reaches them through messages. Actors are named `person-<id>`, `rabbit-<id>`, `wolf-<id>`, and `partnership-<id>` instead of `entity-<id>`.
|
- People, rabbits, wolves, and partnerships are Picard actors that own their state; the world only reaches them through messages. Actors are named `person-<id>`, `rabbit-<id>`, `wolf-<id>`, and `partnership-<id>` instead of `entity-<id>`.
|
||||||
- Rabbits killed by hunters no longer move or breed later in the same tick.
|
- Rabbits killed by hunters no longer move or breed later in the same tick.
|
||||||
|
|
|
||||||
20
Dockerfile
20
Dockerfile
|
|
@ -1,9 +1,23 @@
|
||||||
FROM rust:1-bookworm AS builder
|
FROM rust:1-bookworm AS chef
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
RUN rustup target add wasm32-unknown-unknown
|
RUN cargo install cargo-chef --version 0.1.78 --locked \
|
||||||
|
&& rustup target add wasm32-unknown-unknown
|
||||||
|
|
||||||
|
FROM chef AS planner
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN cargo build --release --bin sim
|
RUN cargo chef prepare --recipe-path recipe.json
|
||||||
|
|
||||||
|
FROM chef AS builder
|
||||||
|
|
||||||
|
ENV SIM_UI_TARGET_DIR=/src/target/ui
|
||||||
|
COPY --from=planner /src/recipe.json recipe.json
|
||||||
|
RUN cargo chef cook --release --locked --recipe-path recipe.json --bin sim
|
||||||
|
RUN cargo chef cook --release --locked --recipe-path recipe.json \
|
||||||
|
--package ui --target wasm32-unknown-unknown --target-dir /src/target/ui
|
||||||
|
COPY . .
|
||||||
|
RUN cargo build --release --locked --bin sim
|
||||||
|
|
||||||
FROM debian:bookworm-slim
|
FROM debian:bookworm-slim
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,8 @@ docker compose build
|
||||||
docker compose up -d --remove-orphans
|
docker compose up -d --remove-orphans
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The Docker build uses cargo-chef to cache native server and Wasm frontend dependencies separately. Source-only changes reuse these dependency layers; dependency or toolchain changes rebuild them. Inside the builder, `SIM_UI_TARGET_DIR` points the frontend build script at the cooked Wasm artifacts. Local builds retain their default frontend output directory unless this variable is set.
|
||||||
|
|
||||||
Open [http://localhost:7878](http://localhost:7878). The `shard_0_data`, `shard_1_data`, and `shard_2_data` volumes survive container restarts, `just stop`, and `docker compose down`.
|
Open [http://localhost:7878](http://localhost:7878). The `shard_0_data`, `shard_1_data`, and `shard_2_data` volumes survive container restarts, `just stop`, and `docker compose down`.
|
||||||
|
|
||||||
If a shard's simulation thread fails, the shard exits with an error so Compose's restart policy can restart it. The gateway also exits when it loses a shard and reconnects on restart. Recovery uses the saved snapshots; if the shards' saved ticks or seeds do not match, the gateway starts a fresh world.
|
If a shard's simulation thread fails, the shard exits with an error so Compose's restart policy can restart it. The gateway also exits when it loses a shard and reconnects on restart. Recovery uses the saved snapshots; if the shards' saved ticks or seeds do not match, the gateway starts a fresh world.
|
||||||
|
|
|
||||||
5
build.rs
5
build.rs
|
|
@ -8,6 +8,7 @@ fn main() {
|
||||||
for p in ["ui/src", "ui/js", "ui/style.css", "ui/Cargo.toml"] {
|
for p in ["ui/src", "ui/js", "ui/style.css", "ui/Cargo.toml"] {
|
||||||
println!("cargo:rerun-if-changed={p}");
|
println!("cargo:rerun-if-changed={p}");
|
||||||
}
|
}
|
||||||
|
println!("cargo:rerun-if-env-changed=SIM_UI_TARGET_DIR");
|
||||||
let out = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR"));
|
let out = PathBuf::from(env::var_os("OUT_DIR").expect("OUT_DIR"));
|
||||||
let pkg = out.join("ui-pkg");
|
let pkg = out.join("ui-pkg");
|
||||||
let release = env::var("PROFILE").is_ok_and(|p| p == "release");
|
let release = env::var("PROFILE").is_ok_and(|p| p == "release");
|
||||||
|
|
@ -15,7 +16,9 @@ fn main() {
|
||||||
ensure_wasm_target();
|
ensure_wasm_target();
|
||||||
|
|
||||||
// A separate target dir avoids deadlocking on the outer build's lock.
|
// A separate target dir avoids deadlocking on the outer build's lock.
|
||||||
let target_dir = out.join("ui-target");
|
let target_dir = env::var_os("SIM_UI_TARGET_DIR")
|
||||||
|
.map(PathBuf::from)
|
||||||
|
.unwrap_or_else(|| out.join("ui-target"));
|
||||||
let mut cargo = Command::new(env::var_os("CARGO").unwrap_or_else(|| "cargo".into()));
|
let mut cargo = Command::new(env::var_os("CARGO").unwrap_or_else(|| "cargo".into()));
|
||||||
cargo
|
cargo
|
||||||
.args([
|
.args([
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue