#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" DOCKER_CLI_INSTALLER="${REPO_ROOT}/roles/sys-svc-container/files/install-cli.sh" bootstrap_docker_repo() { if [[ ! -f "${DOCKER_CLI_INSTALLER}" ]]; then echo "[pkg] ERROR: missing docker CLI installer helper at ${DOCKER_CLI_INSTALLER}" >&2 exit 1 fi echo "[pkg] Bootstrapping Docker package repository metadata..." bash "${DOCKER_CLI_INSTALLER}" --repo-only } build_and_install_arch() { local build_root="/tmp/infinito-nexus-arch-build" local pkg_dir="${build_root}/packaging/arch" local builder="pkgbuild" local pkg_path="" echo "[arch] Installing build toolchain..." pacman -Syu --noconfirm --needed base-devel sudo rsync if ! pacman-key --list-sigs >/dev/null 2>&1; then echo "[arch] Initializing pacman keyring..." pacman-key --init pacman-key --populate archlinux fi if ! id "${builder}" >/dev/null 2>&1; then echo "[arch] Creating build user '${builder}'..." useradd -m -s /bin/bash "${builder}" fi install -d -m 0755 /etc/sudoers.d printf '%s ALL=(ALL) NOPASSWD: /usr/bin/pacman\n' "${builder}" >/etc/sudoers.d/99-"${builder}"-pacman chmod 0440 /etc/sudoers.d/99-"${builder}"-pacman echo "[arch] Preparing build workspace ${build_root}..." rm -rf "${build_root}" mkdir -p "${build_root}" rsync -a --delete \ --exclude '.git' \ --exclude '.venv' \ --exclude '__pycache__' \ "${REPO_ROOT}/" "${build_root}/" chown -R "${builder}:${builder}" "${build_root}" echo "[arch] Building package via makepkg..." su "${builder}" -c "cd '${pkg_dir}' && makepkg --syncdeps --noconfirm --cleanbuild" pkg_path="$(find "${pkg_dir}" -maxdepth 1 -type f -name 'infinito-nexus-*.pkg.tar.*' | head -n1)" if [[ -z "${pkg_path}" ]]; then echo "[arch] ERROR: built package not found" >&2 exit 1 fi echo "[arch] Installing ${pkg_path}..." pacman -U --noconfirm "${pkg_path}" } build_and_install_debian_like() { local build_root="/tmp/infinito-nexus-debian-build" local deb_path="" echo "[debian] Installing build toolchain..." export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y --no-install-recommends \ build-essential \ debhelper \ dpkg-dev \ rsync echo "[debian] Preparing build workspace ${build_root}..." rm -rf "${build_root}" mkdir -p "${build_root}" rsync -a \ --exclude 'packaging/debian' \ --exclude '.git' \ "${REPO_ROOT}/" "${build_root}/" mkdir -p "${build_root}/debian" cp -a "${REPO_ROOT}/packaging/debian/." "${build_root}/debian/" echo "[debian] Building package via dpkg-buildpackage..." ( cd "${build_root}" dpkg-buildpackage -us -uc -b ) deb_path="$(find /tmp -maxdepth 1 -type f -name 'infinito-nexus_*.deb' | head -n1)" if [[ -z "${deb_path}" ]]; then echo "[debian] ERROR: built package not found" >&2 exit 1 fi echo "[debian] Installing ${deb_path}..." bootstrap_docker_repo apt-get install -y "${deb_path}" rm -rf /var/lib/apt/lists/* } build_and_install_rpm_like() { local pm="$1" local build_root="/tmp/infinito-nexus-fedora-build" local topdir="${build_root}/rpmbuild" local rpm_path="" echo "[rpm] Installing build toolchain via ${pm}..." "${pm}" -y install rpm-build rsync echo "[rpm] Preparing rpmbuild tree in ${topdir}..." rm -rf "${build_root}" mkdir -p "${topdir}"/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cp "${REPO_ROOT}/packaging/fedora/infinito-nexus.spec" "${topdir}/SPECS/" echo "[rpm] Building package via rpmbuild..." rpmbuild \ --define "_topdir ${topdir}" \ -bb "${topdir}/SPECS/infinito-nexus.spec" rpm_path="$(find "${topdir}/RPMS" -type f -name 'infinito-nexus-*.rpm' | head -n1)" if [[ -z "${rpm_path}" ]]; then echo "[rpm] ERROR: built package not found" >&2 exit 1 fi echo "[rpm] Installing ${rpm_path} via ${pm}..." bootstrap_docker_repo "${pm}" -y install "${rpm_path}" "${pm}" -y clean all || true } main() { if command -v pacman >/dev/null 2>&1; then build_and_install_arch elif command -v apt-get >/dev/null 2>&1; then build_and_install_debian_like elif command -v dnf >/dev/null 2>&1; then build_and_install_rpm_like dnf elif command -v yum >/dev/null 2>&1; then build_and_install_rpm_like yum else echo "Unsupported package manager for package build/install" >&2 exit 1 fi } main "$@"