#!/bin/bash # # Copyright (C) 2026 Danilo M. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # 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 PROJECT_VERSION="1.0.0" # bump via sed across all scripts; see CLAUDE.md Releases 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 -V) echo "build-sbo-testbuild.sh $PROJECT_VERSION"; exit 0 ;; --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 packages (*.t?z) are present before doing anything. require_pkgs() { [[ -d "${PKGDIR}" ]] || _err "PKGDIR missing: ${PKGDIR}" compgen -G "${PKGDIR}/sbopkg-*.t?z" >/dev/null \ || _err "no sbopkg-*.t?z in ${PKGDIR}" compgen -G "${PKGDIR}/sbo-maintainer-tools-*.t?z" >/dev/null \ || _err "no sbo-maintainer-tools-*.t?z 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}" 2>/dev/null || echo "") local WORKDIR; WORKDIR="$(mktemp -d /tmp/sbo-testbuild.XXXXXX)" # shellcheck disable=SC2064 trap "rm -rf '${WORKDIR}'" EXIT mkdir -p "${WORKDIR}/pkgs" cp "${PKGDIR}"/sbopkg-*.t?z "${PKGDIR}"/sbo-maintainer-tools-*.t?z "${WORKDIR}/pkgs/" cat > "${WORKDIR}/Dockerfile" <