107 lines
4.7 KiB
Bash
Executable File
107 lines
4.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
source /opt/rust-package-builder/scripts/lib.sh
|
|
|
|
REPOSITORY="$DATA_DIR/repository"
|
|
CURRENT="$REPOSITORY/current"
|
|
|
|
linux_release_complete_for_commit() {
|
|
local sha=$1
|
|
[[ -d "$CURRENT" ]] || return 1
|
|
[[ -f "$CURRENT/apt/dists/$REPO_DISTRIBUTION/InRelease" ]] || return 1
|
|
[[ -f "$CURRENT/rpm/x86_64/repodata/repomd.xml" ]] || return 1
|
|
# Both standalone packages must exist in the current Linux snapshot.
|
|
find "$CURRENT/rpm/x86_64" -maxdepth 1 -type f -name 'rustproxy-docker-agent-*.rpm' -print -quit | grep -q . || return 1
|
|
find "$CURRENT/apt/pool" -type f -name 'rustproxy-docker-agent_*.deb' -print -quit | grep -q . || return 1
|
|
# A new builder revision must repackage even when RustProxy's SHA is unchanged.
|
|
[[ -f "$CURRENT/LINUX-BUILD-INFO.txt" ]] || return 1
|
|
grep -Fqx "packaging_revision=$PACKAGING_REVISION" "$CURRENT/LINUX-BUILD-INFO.txt" || return 1
|
|
grep -Fq ',rustproxy-docker-agent' "$CURRENT/LINUX-BUILD-INFO.txt" || return 1
|
|
|
|
if grep -Fqx "source_commit=$sha" "$CURRENT/LINUX-BUILD-INFO.txt"; then
|
|
return 0
|
|
fi
|
|
|
|
local state_sha=""
|
|
[[ -r "$DATA_DIR/state/last_linux_commit" ]] && state_sha=$(cat "$DATA_DIR/state/last_linux_commit")
|
|
[[ "$state_sha" == "$sha" ]] && return 0
|
|
|
|
# Migration from the older unified/Linux-only builder. Its last_commit
|
|
# represented the Linux publication before per-branch state existed.
|
|
local legacy_sha=""
|
|
[[ -r "$DATA_DIR/state/last_commit" ]] && legacy_sha=$(cat "$DATA_DIR/state/last_commit")
|
|
[[ "$legacy_sha" == "$sha" ]] || return 1
|
|
return 0
|
|
}
|
|
|
|
opnsense_release_complete_for_commit() {
|
|
local sha=$1
|
|
local opnsense="$CURRENT/opnsense"
|
|
local package_dir="$opnsense/$OPNSENSE_ABI/amd64"
|
|
|
|
[[ -d "$CURRENT" ]] || return 1
|
|
[[ -f "$opnsense/meta.conf" ]] || return 1
|
|
[[ -f "$opnsense/packagesite.pkg" ]] || return 1
|
|
[[ -f "$opnsense/data.pkg" ]] || return 1
|
|
[[ -f "$opnsense/RustProxy.conf" ]] || return 1
|
|
[[ -f "$opnsense/BUILD-INFO.txt" ]] || return 1
|
|
[[ -f "$opnsense/os-rustproxy-latest.pkg" ]] || return 1
|
|
grep -Fqx "source_commit=$sha" "$opnsense/BUILD-INFO.txt" || return 1
|
|
grep -Fqx "opnsense_series=$OPNSENSE_ABI" "$opnsense/BUILD-INFO.txt" || return 1
|
|
grep -Fqx "packaging_revision=$OPNSENSE_PACKAGING_REVISION" "$opnsense/BUILD-INFO.txt" || return 1
|
|
[[ -d "$package_dir" ]] || return 1
|
|
find "$package_dir" -maxdepth 1 -type f -name 'os-rustproxy-*.pkg' -print -quit | grep -q . || return 1
|
|
return 0
|
|
}
|
|
|
|
freebsd_release_complete_for_commit() {
|
|
local sha=$1
|
|
local repo="$CURRENT/freebsd"
|
|
[[ -d "$CURRENT" ]] || return 1
|
|
for file in meta.conf packagesite.pkg data.pkg RustProxy-FreeBSD.conf BUILD-INFO.txt rustproxy-latest.pkg; do
|
|
[[ -s "$repo/$file" ]] || return 1
|
|
done
|
|
grep -Fqx "source_commit=$sha" "$repo/BUILD-INFO.txt" || return 1
|
|
grep -Fqx "packaging_revision=$FREEBSD_NATIVE_PACKAGING_REVISION" "$repo/BUILD-INFO.txt" || return 1
|
|
grep -Fqx "freebsd_abi=$FREEBSD_ABI" "$repo/BUILD-INFO.txt" || return 1
|
|
[[ -d "$repo/$FREEBSD_ABI" ]] || return 1
|
|
find "$repo/$FREEBSD_ABI" -maxdepth 1 -type f -name 'rustproxy-*.pkg' -print -quit | grep -q . || return 1
|
|
return 0
|
|
}
|
|
|
|
log "checking repository"
|
|
REMOTE_SHA=$(git ls-remote "$SOURCE_REPO" "refs/heads/$SOURCE_BRANCH" | awk 'NR == 1 {print $1}')
|
|
[[ "$REMOTE_SHA" =~ ^[0-9a-fA-F]{40}$ ]] || fatal "cannot resolve branch $SOURCE_BRANCH from $SOURCE_REPO"
|
|
|
|
BUILD_LINUX=1
|
|
BUILD_OPNSENSE=1
|
|
BUILD_FREEBSD=0
|
|
if linux_release_complete_for_commit "$REMOTE_SHA"; then
|
|
BUILD_LINUX=0
|
|
# Persist migrated per-branch state when an older installation already has
|
|
# a valid Linux repository for this exact commit.
|
|
printf '%s\n' "$REMOTE_SHA" | atomic_write "$DATA_DIR/state/last_linux_commit"
|
|
fi
|
|
if opnsense_release_complete_for_commit "$REMOTE_SHA"; then
|
|
BUILD_OPNSENSE=0
|
|
printf '%s\n' "$REMOTE_SHA" | atomic_write "$DATA_DIR/state/last_opnsense_commit"
|
|
fi
|
|
|
|
if [[ "${FREEBSD_NATIVE_ENABLED:-1}" == "1" ]]; then
|
|
BUILD_FREEBSD=1
|
|
if freebsd_release_complete_for_commit "$REMOTE_SHA"; then
|
|
BUILD_FREEBSD=0
|
|
printf '%s\n' "$REMOTE_SHA" | atomic_write "$DATA_DIR/state/last_freebsd_commit"
|
|
fi
|
|
fi
|
|
|
|
if [[ "$BUILD_LINUX" == "0" && "$BUILD_OPNSENSE" == "0" && "$BUILD_FREEBSD" == "0" ]]; then
|
|
printf '%s\n' "$REMOTE_SHA" | atomic_write "$DATA_DIR/state/last_commit"
|
|
log "no changes: all enabled repositories are complete for $REMOTE_SHA"
|
|
exit 0
|
|
fi
|
|
|
|
REASON="missing-or-outdated-channel"
|
|
log "build required: commit=$REMOTE_SHA linux=$BUILD_LINUX opnsense=$BUILD_OPNSENSE freebsd=$BUILD_FREEBSD reason=$REASON"
|
|
/opt/rust-package-builder/scripts/build-release.sh "$REMOTE_SHA" "$REASON" "$BUILD_LINUX" "$BUILD_OPNSENSE" "$BUILD_FREEBSD"
|