mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-06 10:59:59 +00:00
154 lines
4.3 KiB
Bash
Executable File
154 lines
4.3 KiB
Bash
Executable File
#!/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 "$@"
|