Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Development

Commands below assume sibling bobr and bobr-recipes checkouts and are run from their parent directory. Recipe builds require the environment described in Installation.

Build and check Bobr

Source builds require Rust/Cargo, a native C toolchain, and rustfmt/clippy. The complete release gate also requires the x86_64-unknown-linux-musl Rust target, musl-gcc, and packaging tools including readelf, strip, tar, xz, and sha256sum. It runs on x86-64 Linux and requires the exact Rust version selected by RUST_TOOLCHAIN in both CI and release workflows.

For an edit-compile-test cycle:

(cd bobr && cargo build --workspace --locked)
(cd bobr && cargo test --workspace --locked)

Additional tests gated by integration-tests require a working Linux sandbox environment (user namespaces and mounts):

(cd bobr && cargo test --workspace --all-features --locked)

CI and the release gate do not currently enable these feature-gated tests.

These commands do not install binaries. Before acceptance testing, run the complete release gate and install its verified archive:

bobr/tools/release-check-and-install.sh

The gate checks formatting, clippy, tests, rustdoc, the installer, and static musl release packaging and smoke tests. It installs bobr, bobr-repo, bobr-fsobj-hash, and bobr-sandbox-launcher only after all checks pass. The bundle launcher is checked but not installed.

A clean checkout is required by default. Use --allow-dirty while developing; the installed bobr --build-info records the commit and dirty state. The destination is $CARGO_INSTALL_ROOT/bin, then $CARGO_HOME/bin, then ~/.cargo/bin; --bin-dir DIR overrides it. Put that directory before other Bobr installations on PATH.

Check recipes

Run the standalone recipe check suite with git, jq, Nickel, patch, Python 3, rg, shellcheck, tar, and bobr-fsobj-hash on PATH:

bobr-recipes/tools/check.sh

After editing local sources in the recipes checkout, refresh their adjacent *.fsobj-hash locks:

bobr-recipes/bin/bobr-update-fsobj-hashes.sh

bobr-build.sh checks existing locks in that checkout; it does not rewrite them or check external user sources automatically. Validate a profile and lower its request without building:

bobr-recipes/bin/bobr-build.sh --dry-run /path/to/profile.ncl

For profile and target selection, see Getting Started.

Acceptance builds

For a cold world build, create an empty store and set the profile’s store to that path. Disable mappings on every secondary provider, or use secondaries.providers = []; an empty working store alone does not prevent prebuilt mapping hits. Content-only local or remote providers are allowed. Leave output_repository unset unless publication is intended.

mkdir /path/to/new-store
bobr-recipes/bin/bobr-build.sh --target world /path/to/profile.ncl
bobr-recipes/bin/bobr-build.sh --target test_all /path/to/profile.ncl

world builds the shipped images and host bundles; test_all runs the separate acceptance recipes and can reuse results from the preceding build. A cold world build takes hours. See Build logging for diagnostics.

Documentation

Build or preview the user documentation with mdBook:

(cd bobr && mdbook build)
(cd bobr && mdbook serve)