Pre-publish smoke matrix for every tagged release. All items must pass before pushing a version tag.
These run on every push and PR:
-
cargo fmt --check -
cargo clippy --workspace --all-targets -- -D warnings -
cargo test --workspace -
cargo doc --workspace --no-depswithRUSTDOCFLAGS="-D warnings"
Run these from a clean build (cargo build --workspace --release) before
tagging. The --workspace flag is required to build both rustbgpd and
rustbgpctl.
# Build both binaries
cargo build --workspace --release
# Start daemon with minimal config
./target/release/rustbgpd examples/minimal/config.toml &
DAEMON_PID=$!
sleep 2
# Verify CLI commands parse and connect
export RUSTBGPD_ADDR=unix:///tmp/rustbgpd/grpc.sock
./target/release/rustbgpctl health
./target/release/rustbgpctl global
./target/release/rustbgpctl neighbor
./target/release/rustbgpctl rib
./target/release/rustbgpctl metrics
kill $DAEMON_PIDWalk the exact README quickstart from a clean tree and confirm:
- the minimal config validates with
--check - the daemon creates the UDS socket under
/tmp/rustbgpd rustbgpctl health,global, andneighborsucceed withRUSTBGPD_ADDR- no undocumented prerequisite or manual workaround is needed
Verify the daemon creates the gRPC socket at the configured
runtime_state_dir:
ls -la /tmp/rustbgpd/grpc.sock # should exist after daemon startecho "test-token-value" > /tmp/rustbgpd-token
cat > /tmp/rustbgpd-auth-test.toml <<'EOF'
[global]
asn = 65001
router_id = "10.0.0.1"
listen_port = 1179
runtime_state_dir = "/tmp/rustbgpd-auth"
[global.telemetry]
prometheus_addr = "127.0.0.1:19179"
log_format = "json"
[global.telemetry.grpc_uds]
path = "/tmp/rustbgpd-auth/grpc.sock"
token_file = "/tmp/rustbgpd-token"
EOF
./target/release/rustbgpd /tmp/rustbgpd-auth-test.toml &
DAEMON_PID=$!
sleep 2
# Without token — should fail
./target/release/rustbgpctl -s unix:///tmp/rustbgpd-auth/grpc.sock health 2>&1 | grep -i "error\|unauthenticated"
# With token — should succeed
./target/release/rustbgpctl -s unix:///tmp/rustbgpd-auth/grpc.sock --token-file /tmp/rustbgpd-token health
kill $DAEMON_PID
rm -rf /tmp/rustbgpd-auth /tmp/rustbgpd-token /tmp/rustbgpd-auth-test.tomlRun at least one from each category:
docker build -t rustbgpd:dev .
# Basic eBGP + RIB
containerlab deploy -t tests/interop/m4-frr.clab.yml
bash tests/interop/scripts/test-m4-frr.sh
containerlab destroy -t tests/interop/m4-frr.clab.yml
# Route server + policy
containerlab deploy -t tests/interop/m13-policy-frr.clab.yml
bash tests/interop/scripts/test-m13-policy-frr.sh
containerlab destroy -t tests/interop/m13-policy-frr.clab.yml
# Graceful Restart
containerlab deploy -t tests/interop/m11-gr-frr.clab.yml
bash tests/interop/scripts/test-m11-gr-frr.sh
containerlab destroy -t tests/interop/m11-gr-frr.clab.yml
# Extended next-hop / IPv6 export path
containerlab deploy -t tests/interop/m18-extnexthop-frr.clab.yml
bash tests/interop/scripts/test-m18-extnexthop-frr.sh
containerlab destroy -t tests/interop/m18-extnexthop-frr.clab.ymlIf the release includes recent LLGR changes, also run:
containerlab deploy -t tests/interop/m16-llgr-frr.clab.yml
bash tests/interop/scripts/test-m16-llgr-frr.sh
containerlab destroy -t tests/interop/m16-llgr-frr.clab.ymlIf the release includes RPKI/RTR, FlowSpec, or best-path explain changes:
# RPKI/RTR cache interop (requires rpki/stayrtr:latest)
containerlab deploy -t tests/interop/m21-rpki-frr.clab.yml
bash tests/interop/scripts/test-m21-rpki-frr.sh
containerlab destroy -t tests/interop/m21-rpki-frr.clab.yml
# FlowSpec injection + distribution
containerlab deploy -t tests/interop/m22-flowspec-frr.clab.yml
bash tests/interop/scripts/test-m22-flowspec-frr.sh
containerlab destroy -t tests/interop/m22-flowspec-frr.clab.yml
# GoBGP peer (requires gobgp:interop image)
docker build -t gobgp:interop -f tests/interop/Dockerfile.gobgp tests/interop/
containerlab deploy -t tests/interop/m23-gobgp.clab.yml
bash tests/interop/scripts/test-m23-gobgp.sh
containerlab destroy -t tests/interop/m23-gobgp.clab.ymldocker build -t rustbgpd:dev .
# Verify both binaries are present
docker run --rm --entrypoint sh rustbgpd:dev -c \
"ls /usr/local/bin/rustbgpd /usr/local/bin/rustbgpctl"
# Verify rustbgpctl parses subcommands
docker run --rm --entrypoint rustbgpctl rustbgpd:dev --help- Update
CHANGELOG.mdwith the new version section - Verify changelog completeness: run
git log <prev-tag>..HEAD --onelineand confirm every user-visible change (features, fixes, interop suites) is listed under the new version — not misattributed to a prior release. Check that stale counts (test totals, interop suite counts, script counts) are updated in CHANGELOG.md, README.md, and ROADMAP.md. - Bump version in root
Cargo.toml([workspace.package] version) - Run the full checklist above
- Commit:
Bump version to vX.Y.Z - Tag:
git tag vX.Y.Z - Push:
git push origin main && git push origin vX.Y.Z - Verify CI passes on the tag
- Verify container image published to GHCR (tagged builds)
- Verify GitHub release notes: check that the release created by CI has accurate notes. If the workflow only generates a changelog link, edit the release to include a human-written summary matching CHANGELOG.md.
The wire crate has its own version in crates/wire/Cargo.toml, decoupled
from the daemon workspace version. Only publish when the wire crate itself
changed.
- Did
crates/wire/change since the last wire publish?- If no: skip. Do not publish a no-op release.
- If yes: continue.
- Decide semver bump (see below)
- Update
versionincrates/wire/Cargo.toml - Add a
rustbgpd-wireentry inCHANGELOG.md cargo publish -p rustbgpd-wire --dry-runcargo publish -p rustbgpd-wire
Wire crate semver:
- Patch: bug fixes, stricter validation, docs/test improvements
- Minor: new message types, attributes, helper methods, additive API changes
- Major: breaking API changes, changed method signatures, enum shape changes