#!/bin/bash # build-sbo-testbuild.sh — sbo-testbuild:{ver} FROM sbo-full:{ver}. # Adds sbopkg + sbo-maintainer-tools from prebuilt .txz in PKGDIR. # Rebuilds when the full image OR the .txz set changes. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" source "${HERE}/config" LOG_TAG=testbuild source "${HERE}/lib.sh" FULL_IMAGE="${REGISTRY}/sbo-full" TB_IMAGE="${REGISTRY}/sbo-testbuild" DIGEST_LABEL="sbo.testbuild.full-digest" PKGS_LABEL="sbo.testbuild.pkgs-hash" FORCE=false OPT_VERSION="" while [[ $# -gt 0 ]]; do case "$1" in --version) OPT_VERSION="$2"; shift 2 ;; --force) FORCE=true; shift ;; *) _err "unknown argument: $1" ;; esac done if [[ -n "${OPT_VERSION}" ]]; then BUILD_VARIANTS=("${OPT_VERSION}") else BUILD_VARIANTS=("${VARIANTS[@]}") fi # Verify the required .txz are present before doing anything. require_pkgs() { [[ -d "${PKGDIR}" ]] || _err "PKGDIR missing: ${PKGDIR}" compgen -G "${PKGDIR}/sbopkg-*.txz" >/dev/null \ || _err "no sbopkg-*.txz in ${PKGDIR}" compgen -G "${PKGDIR}/sbo-maintainer-tools-*.txz" >/dev/null \ || _err "no sbo-maintainer-tools-*.txz in ${PKGDIR}" } # needs_rebuild FULL_TAG TB_TAG PKGS_HASH -> 0 if rebuild needed needs_rebuild() { local full_tag="$1" tb_tag="$2" pkgs_hash="$3" [[ "${FORCE}" == "true" ]] && { _log " --force."; return 0; } local full_digest full_digest=$(docker inspect --format '{{index .RepoDigests 0}}' \ "${full_tag}" 2>/dev/null || echo "") [[ -n "${full_digest}" ]] || { _warn " no full digest; rebuilding."; return 0; } local rec_digest rec_pkgs rec_digest=$(docker inspect \ --format "{{index .Config.Labels \"${DIGEST_LABEL}\"}}" \ "${tb_tag}" 2>/dev/null || echo "") rec_pkgs=$(docker inspect \ --format "{{index .Config.Labels \"${PKGS_LABEL}\"}}" \ "${tb_tag}" 2>/dev/null || echo "") if [[ "${full_digest}" == "${rec_digest}" && "${pkgs_hash}" == "${rec_pkgs}" ]]; then _log " full image and .txz set unchanged; skipping." return 1 fi _log " full image or .txz set changed; rebuilding." return 0 } build_variant() { local VERSION="$1" local FULL_TAG="${FULL_IMAGE}:${VERSION}" local TB_TAG="${TB_IMAGE}:${VERSION}" _log "=== ${TB_TAG} ===" _log " Pulling ${FULL_TAG}..." docker pull "${FULL_TAG}" local PKGS_HASH; PKGS_HASH="$(txz_hash "${PKGDIR}")" if ! needs_rebuild "${FULL_TAG}" "${TB_TAG}" "${PKGS_HASH}"; then return 0 fi local FULL_DIGEST FULL_DIGEST=$(docker inspect --format '{{index .RepoDigests 0}}' "${FULL_TAG}") local WORKDIR; WORKDIR="$(mktemp -d /tmp/sbo-testbuild.XXXXXX)" # shellcheck disable=SC2064 trap "rm -rf '${WORKDIR}'" EXIT mkdir -p "${WORKDIR}/pkgs" cp "${PKGDIR}"/sbopkg-*.txz "${PKGDIR}"/sbo-maintainer-tools-*.txz "${WORKDIR}/pkgs/" cat > "${WORKDIR}/Dockerfile" <