Files
rust-package-builder/scripts/build-release.sh
T
2026-10-22 13:03:12 +02:00

157 lines
5.1 KiB
Bash
Executable File

#!/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 <packages@localhost>}
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:-1}" != "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