157 lines
5.1 KiB
Bash
Executable File
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
|