Some checks failed
API and SemVer surface / api-surface (push) Failing after 1m28s
Native release artifact audit / audit (push) Failing after 1h6m34s
Native code generation / deterministic (push) Failing after 2m15s
Concurrency and resource soak audit / soak (push) Failing after 6m33s
Documentation / documentation (push) Failing after 2m0s
Imaging and meshing gate / native (push) Failing after 55s
JPEG 2000 feature / linux (push) Successful in 2m46s
performance evidence / audit (push) Failing after 13m45s
Release platform and feature matrix / audit (push) Successful in 1m3s
Native Rust workspace compile / compile (push) Failing after 55s
Skia feature / linux (push) Successful in 31m58s
Dependency and supply-chain audit / audit (push) Failing after 9m34s
Release platform and feature matrix / matrix (false, linux-stable-minimal, x86_64-unknown-linux-gnu, stable) (push) Failing after 10m2s
Release platform and feature matrix / matrix (false, macos-stable-portable, x86_64-apple-darwin, stable) (push) Failing after 2m0s
Release platform and feature matrix / matrix (false, windows-stable-portable, x86_64-pc-windows-gnu, stable) (push) Failing after 1m56s
Release platform and feature matrix / matrix (true, linux-msrv-portable, x86_64-unknown-linux-gnu, 1.96.0) (push) Failing after 6m19s
Release platform and feature matrix / matrix (true, linux-stable-default, x86_64-unknown-linux-gnu, stable) (push) Failing after 6m57s
Release platform and feature matrix / matrix (true, linux-stable-features, x86_64-unknown-linux-gnu, stable) (push) Failing after 7m6s
Release platform and feature matrix / matrix (true, linux-stable-release-surface, x86_64-unknown-linux-gnu, stable) (push) Failing after 8m8s
91 lines
4.6 KiB
Markdown
91 lines
4.6 KiB
Markdown
# Native release artifact audit
|
|
|
|
MetaCrate's release gate builds and inspects every release crate and every
|
|
shipped program. The gate proves that the deliverables are native Rust
|
|
artifacts: they neither contain nor load LibreMetaverse assemblies, a CLR or
|
|
Mono host, generated foreign bindings, RPC bridges, downloaded fallbacks, or
|
|
helper subprocesses.
|
|
|
|
The authoritative inventory and allowlists are
|
|
[`ci/artifact-policy.json`](../ci/artifact-policy.json). Adding a publishable
|
|
crate, binary target, native FFI boundary, copied package input, or offline
|
|
smoke requires an explicit policy update. The auditor rejects an incomplete or
|
|
duplicate inventory.
|
|
|
|
## Clean Ubuntu prerequisites
|
|
|
|
The automated gate runs only on `ubuntu-latest`, using Rust 1.97.1 for normal
|
|
release work. Rust 1.96.0 remains a separate minimum-supported-version check;
|
|
it is not used to build these release artifacts. The clean worker installs:
|
|
|
|
- a C/C++ build toolchain, Clang, CMake, Ninja, `pkg-config`, Python 3, and
|
|
`curl` for the pinned Skia build/download path;
|
|
- Fontconfig and FreeType development libraries for Skia;
|
|
- OpenJPEG 2.5.4 through `tools/install_openjpeg_2_5_4.sh`; and
|
|
- the distribution Opus development package.
|
|
|
|
No reference LibreMetaverse checkout, .NET SDK/runtime, Mono installation,
|
|
credentials, `.env` file, or live grid is present. The release runtime smoke is
|
|
deliberately offline. Live OpenSim validation is a separate credentialed gate
|
|
documented in [the live-grid guide](live-grid-smoke.md).
|
|
|
|
## What the gate verifies
|
|
|
|
The `artifact-audit` command performs all of these checks and fails closed:
|
|
|
|
1. Resolve the locked Cargo graph and require all 16 release/source packages to
|
|
use versioned internal dependencies. Reject known managed-host dependencies.
|
|
2. Scan production Rust and manifest sources for helper processes, runtime
|
|
loading, managed assemblies, and unreviewed `extern "C"` boundaries. The only
|
|
native FFI allowlist is the reviewed OpenJPEG and Opus adapters.
|
|
3. Inspect every `.crate` archive with byte and entry limits. Reject path
|
|
traversal, links, special files, managed-code extensions, forbidden runtime
|
|
markers, and retained workspace dependency paths.
|
|
4. Extract the packages into a new temporary workspace and build every library
|
|
and binary offline. All internal crates are resolved from the extracted
|
|
archives and `METACRATE_REFERENCE_ROOT` points to a path that cannot exist.
|
|
5. Parse each executable as ELF, PE, or Mach-O and record imported symbols and
|
|
linked libraries. Reject forbidden CLR/Mono/LibreMetaverse markers.
|
|
6. Remove all grid credentials, install traps for common managed/download
|
|
helpers, disable external networking with invalid proxy endpoints, run
|
|
`--help` for every binary, and execute the declared deeper fake/offline
|
|
smokes. A helper invocation, timeout, external-service dependency, or absent
|
|
required output fails the audit.
|
|
|
|
The resulting JSON records the source commit, exact Rust compiler, host,
|
|
package and executable hashes, binary formats, linked libraries, import counts,
|
|
runtime smoke results, and zero forbidden findings. It is created with
|
|
create-new semantics so prior evidence cannot be silently overwritten.
|
|
|
|
## Reproducing the gate
|
|
|
|
After installing the prerequisites above, package all release members in one
|
|
Cargo invocation. Atomic packaging lets Cargo resolve the versioned internal
|
|
crate set exactly as a registry publication batch would:
|
|
|
|
```sh
|
|
cargo package --locked --no-verify \
|
|
-p libremetaverse-types -p libremetaverse-structured-data \
|
|
-p libremetaverse-imaging -p libremetaverse-imaging-skia \
|
|
-p libremetaverse-openjpeg -p libremetaverse-opus \
|
|
-p libremetaverse-prim-mesher -p libremetaverse-lsl-tools \
|
|
-p libremetaverse -p libremetaverse-rendering-simple \
|
|
-p libremetaverse-rendering-mesh-foundry -p libremetaverse-rlv \
|
|
-p libremetaverse-utilities -p libremetaverse-voice-vivox \
|
|
-p libremetaverse-voice-webrtc -p libremetaverse-programs
|
|
|
|
METACRATE_RUST_COMMIT=$(git rev-parse --verify HEAD) \
|
|
cargo build --locked --release -j 1 -p libremetaverse-programs --bins
|
|
|
|
cargo run --locked -p metacrate-ci-matrix -- artifact-audit \
|
|
--artifact-dir target/release \
|
|
--package-dir target/package \
|
|
--evidence artifacts/release/artifact-audit.json
|
|
```
|
|
|
|
`--no-verify` prevents Cargo from building each archive redundantly. It does
|
|
not skip release verification: the following audit extracts all archives and
|
|
performs one stricter offline build of the complete package set. The generated
|
|
core is large, so the workspace release profile uses bounded optimization and
|
|
single-job CI to remain within an 8 GiB clean worker.
|