Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/Skidbladnir

.nornir/pack-guide.md

pack — guide

Class: guide · audience: a product author assembling a bundle. The what is in pack-design.md.

Build a staging tree

use skidbladnir::pack::{self, Staging};

let staging = Staging::new(&staging_root, "20260704")?;   // pack.rs:38
staging.add_artifact(&local_binary, "linux-x86_64/holger")?;   // copy in under a relative path
staging.add_component_spec(&spec)?;                            // → manifests/holger.json
let files = staging.artifacts()?;                              // sorted list of what you staged

Then seal it with an Archive engine and write the VERSION beside the bundle:

use skidbladnir::archive::{Archive, TarZstd};
let manifest = TarZstd::new().pack(&staging_root, "20260704", &bundle_path)?;
pack::write_version_file(&bundle_path, "20260704")?;   // VERSION sits NEXT TO the bundle

Record provenance

let pm = pack::pack(&staging, "holger", /* built_in_container */ false)?;   // PackManifest
// pm.artifacts lists everything staged; pm.built_in_container records how it was built

Capture target-identical dependencies (build host only)

To make a component byte-alike with the destination OS, build it in a container:

use skidbladnir::pack::{ContainerBuild, PodmanBuild};

let builder = PodmanBuild::new("registry/nordisk/build:ubuntu-24.04")
    .step("cargo build --release -p holger");
if builder.runtime_available() {
    let produced = builder.build_into("holger", "x86_64-unknown-linux-gnu", &staging_root)?;
    // `produced` = the relative paths copied out of the container's /out
}

If podman is not installed, build_into returns a clear error naming the missing runtime — it never fabricates a capture. Run this on the build host, never on the airgapped target.

Gotchas