#!/usr/bin/env bash set -Eeuo pipefail source /opt/rust-package-builder/scripts/lib.sh SHA=${1:?commit SHA required} BUILD_REASON=${2:-new-commit} BUILD_LINUX=${3:-1} BUILD_OPNSENSE=${4:-1} BUILD_FREEBSD=${5:-0} [[ "$BUILD_LINUX" =~ ^[01]$ ]] || fatal "BUILD_LINUX must be 0 or 1" [[ "$BUILD_OPNSENSE" =~ ^[01]$ ]] || fatal "BUILD_OPNSENSE must be 0 or 1" [[ "$BUILD_FREEBSD" =~ ^[01]$ ]] || fatal "BUILD_FREEBSD must be 0 or 1" (( BUILD_LINUX == 1 || BUILD_OPNSENSE == 1 || BUILD_FREEBSD == 1 )) || { log "nothing to build for $SHA"; exit 0; } SHORT_SHA=${SHA:0:12} BUILD_ID="$(date -u '+%Y%m%dT%H%M%SZ')-${SHORT_SHA}" WORK="$DATA_DIR/work/$BUILD_ID" SRC="$WORK/source" PKG="$WORK/package" OUT="$WORK/out" cleanup() { if [[ "${KEEP_WORKSPACE:-0}" != "1" ]]; then rm -rf "$WORK" else log "workspace kept: $WORK" fi } trap cleanup EXIT mkdir -p "$SRC" "$PKG" "$OUT" log "cloning source" git clone --quiet --no-tags --single-branch --branch "$SOURCE_BRANCH" "$SOURCE_REPO" "$SRC" git -C "$SRC" checkout --quiet --detach "$SHA" ACTUAL_SHA=$(git -C "$SRC" rev-parse HEAD) [[ "$ACTUAL_SHA" == "$SHA" ]] || fatal "checkout SHA mismatch" SOURCE_REVISION=$(git -C "$SRC" rev-list --count "$SHA") cd "$SRC" META_JSON=$(cargo +stable metadata --format-version 1 --no-deps) export META_JSON SRC readarray -t META < <(python3 <<'PY' import json, os m=json.loads(os.environ['META_JSON']) src=os.path.realpath(os.environ['SRC']) packages=m.get('packages', []) chosen=None for p in packages: if os.path.realpath(os.path.dirname(p['manifest_path'])) == src: chosen=p; break if chosen is None: defaults=set(m.get('workspace_default_members') or []) for p in packages: if p['id'] in defaults: chosen=p; break if chosen is None and packages: chosen=packages[0] if chosen is None: raise SystemExit('no Cargo package found') bin_targets=[t for t in chosen.get('targets', []) if 'bin' in t.get('kind', [])] if not bin_targets: raise SystemExit('no binary target found') values=[ chosen.get('name') or '', chosen.get('version') or '', bin_targets[0].get('name') or '', chosen.get('description') or '', chosen.get('license') or '', chosen.get('homepage') or '', chosen.get('repository') or '', ] for v in values: print(str(v).replace('\n',' ')) PY ) CARGO_NAME=${META[0]} VERSION=${META[1]} BINARY_NAME=${META[2]} DESCRIPTION=${META[3]} LICENSE=${META[4]} CARGO_HOMEPAGE=${META[5]} CARGO_REPOSITORY=${META[6]} [[ -n "$VERSION" && -n "$BINARY_NAME" ]] || fatal "invalid Cargo metadata" PACKAGE_NAME=${PACKAGE_NAME:-} MAINTAINER=${PACKAGE_MAINTAINER:-} CONTROL_HOMEPAGE="" if [[ -r "$SRC/debian/control" ]]; then [[ -n "$PACKAGE_NAME" ]] || PACKAGE_NAME=$(read_first_field "$SRC/debian/control" Package || true) [[ -n "$MAINTAINER" ]] || MAINTAINER=$(read_first_field "$SRC/debian/control" Maintainer || true) CONTROL_HOMEPAGE=$(read_first_field "$SRC/debian/control" Homepage || true) fi PACKAGE_NAME=${PACKAGE_NAME:-${CARGO_NAME//-/}} MAINTAINER=${MAINTAINER:-Rust Package Builder } DESCRIPTION=${DESCRIPTION:-$PACKAGE_NAME} LICENSE=${LICENSE:-Proprietary} HOMEPAGE=${PACKAGE_HOMEPAGE:-${CARGO_HOMEPAGE:-${CARGO_REPOSITORY:-${CONTROL_HOMEPAGE:-$SOURCE_REPO}}}} export SHA SHORT_SHA BUILD_ID BUILD_REASON SOURCE_REVISION WORK SRC PKG OUT export PACKAGE_NAME VERSION BINARY_NAME DESCRIPTION LICENSE HOMEPAGE MAINTAINER log "build plan: commit=$SHA linux=$BUILD_LINUX opnsense=$BUILD_OPNSENSE freebsd=$BUILD_FREEBSD version=$VERSION" LINUX_OK=1 OPNSENSE_OK=1 FREEBSD_OK=1 if [[ "$BUILD_LINUX" == "1" ]]; then if /opt/rust-package-builder/scripts/build-linux-release.sh; then log "Linux branch completed for $SHA" cleanup_cargo_target else LINUX_OK=0 log "ERROR: Linux branch failed for $SHA; OPNsense branch will still run" fi fi if [[ "$BUILD_OPNSENSE" == "1" ]]; then if /opt/rust-package-builder/scripts/build-opnsense-release.sh; then log "OPNsense branch completed for $SHA" cleanup_cargo_target else OPNSENSE_OK=0 log "ERROR: OPNsense branch failed for $SHA" fi fi if [[ "$BUILD_FREEBSD" == "1" ]]; then if /opt/rust-package-builder/scripts/build-freebsd-release.sh; then log "FreeBSD native branch completed for $SHA" cleanup_cargo_target else FREEBSD_OK=0 log "ERROR: FreeBSD native branch failed for $SHA" fi fi LINUX_STATE="" OPNSENSE_STATE="" FREEBSD_STATE="" [[ -r "$DATA_DIR/state/last_linux_commit" ]] && LINUX_STATE=$(cat "$DATA_DIR/state/last_linux_commit") [[ -r "$DATA_DIR/state/last_opnsense_commit" ]] && OPNSENSE_STATE=$(cat "$DATA_DIR/state/last_opnsense_commit") [[ -r "$DATA_DIR/state/last_freebsd_commit" ]] && FREEBSD_STATE=$(cat "$DATA_DIR/state/last_freebsd_commit") if [[ "$LINUX_STATE" == "$SHA" && "$OPNSENSE_STATE" == "$SHA" && ( "${FREEBSD_NATIVE_ENABLED:-0}" != "1" || "$FREEBSD_STATE" == "$SHA" ) ]]; then printf '%s\n' "$SHA" | atomic_write "$DATA_DIR/state/last_commit" log "all branches complete for $SHA" fi if [[ "$LINUX_OK" != "1" || "$OPNSENSE_OK" != "1" || "$FREEBSD_OK" != "1" ]]; then exit 1 fi