#!/usr/bin/env bash # Full release pipeline: lint, tests, optimised binary, Debian package, source archive, checksums. set -euo pipefail ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" cd "$ROOT" fail() { printf 'error: %s\n' "$*" >&2; exit 1; } need() { command -v "$1" >/dev/null 2>&1 || fail "$1 is required"; } need cargo; need rustc; need python3; need sha256sum; need tar VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1)" HOST="$(rustc -vV | sed -n 's/^host: //p')" [[ -f Cargo.lock ]] || fail "Cargo.lock is required for a reproducible release" printf 'ActivePush %s release build for %s\n' "$VERSION" "$HOST" cargo fmt --all -- --check cargo clippy --locked --all-targets -- -D warnings python3 scripts/check-wbxml-names.py if command -v node >/dev/null; then node --check web/app.js; fi cargo test --locked --lib --bins if command -v cargo-zigbuild >/dev/null 2>&1 && [[ "${GLIBC_TARGET:-2.31}" != "0" ]]; then # portable binary (old glibc baseline) cargo zigbuild --locked --release --target "$(uname -m)-unknown-linux-gnu.${GLIBC_TARGET:-2.31}" BIN="target/$(uname -m)-unknown-linux-gnu/release/active-push" else cargo build --locked --release BIN="target/release/active-push" fi [[ -x "$BIN" ]] || fail "release binary missing" "$BIN" --version rm -rf dist && mkdir -p dist ART="active-push-${VERSION}-${HOST}" cp "$BIN" "dist/$ART" chmod 0755 "dist/$ART" (cd dist && sha256sum "$ART" > "$ART.sha256") if command -v dpkg-deb >/dev/null; then BIN="$BIN" scripts/build-deb.sh --no-build else printf 'dpkg-deb not found: skipping .deb\n' fi SRC="dist/active-push-${VERSION}-source.tar.gz" tar --exclude=./target --exclude=./data --exclude=./dist --exclude=./.git --exclude=./.env \ -czf "$SRC" --transform "s,^\.,active-push-${VERSION}," . (cd dist && sha256sum "$(basename "$SRC")" > "$(basename "$SRC").sha256") printf '\nRelease artifacts:\n' ls -1 dist