#!/bin/sh # setup-builder.sh — prepare Alpine VM as bee ISO builder # # Run once on a fresh Alpine 3.21 VM as root. # After this script completes, the VM can build ISO images. # # Usage (on Alpine VM): # wget -O- https://git.mchus.pro/mchus/bee/raw/branch/main/iso/builder/setup-builder.sh | sh # or: sh setup-builder.sh set -e . "$(dirname "$0")/VERSIONS" 2>/dev/null || true GO_VERSION="${GO_VERSION:-1.23.6}" echo "=== bee builder setup ===" echo "Alpine: $(cat /etc/alpine-release)" echo "Go target: ${GO_VERSION}" echo "" # --- system packages --- apk update # enable community repo if not already enabled sed -i 's|^#\(.*community\)|\1|' /etc/apk/repositories apk update apk add \ alpine-sdk \ abuild \ squashfs-tools \ xorriso \ mtools \ grub \ grub-efi \ grub-bios \ git \ wget \ curl \ tar \ xz # --- audit runtime packages (verify they exist in Alpine repos) --- echo "" echo "=== verifying audit runtime packages ===" RUNTIME_PKGS=" dmidecode smartmontools nvme-cli pciutils ipmitool util-linux e2fsprogs qrencode dropbear udhcpc pciutils-libs lshw " MISSING="" for pkg in $RUNTIME_PKGS; do if apk info --quiet "$pkg" 2>/dev/null || apk search --quiet "$pkg" 2>/dev/null | grep -q "^${pkg}-"; then echo " OK: $pkg" else echo " MISSING: $pkg" MISSING="$MISSING $pkg" fi done if [ -n "$MISSING" ]; then echo "" echo "WARNING: missing packages:$MISSING" echo "These will not be available in the ISO." fi # --- Go toolchain --- echo "" echo "=== installing Go ${GO_VERSION} ===" if [ -d /usr/local/go ] && /usr/local/go/bin/go version 2>/dev/null | grep -q "${GO_VERSION}"; then echo "Go ${GO_VERSION} already installed" else ARCH=$(uname -m) case "$ARCH" in x86_64) GOARCH=amd64 ;; aarch64) GOARCH=arm64 ;; *) echo "unsupported arch: $ARCH"; exit 1 ;; esac wget -O /tmp/go.tar.gz \ "https://go.dev/dl/go${GO_VERSION}.linux-${GOARCH}.tar.gz" rm -rf /usr/local/go tar -C /usr/local -xzf /tmp/go.tar.gz rm /tmp/go.tar.gz fi export PATH="$PATH:/usr/local/go/bin" echo "Go: $(go version)" # --- alpine-conf for mkimage --- apk add alpine-conf # --- aports for mkimage.sh --- if [ ! -d /usr/share/aports ]; then echo "" echo "=== cloning aports ===" git clone --depth=1 --branch "v${ALPINE_VERSION:-3.21}.0" \ https://gitlab.alpinelinux.org/alpine/aports.git \ /usr/share/aports fi # --- abuild signing key (required by mkimage.sh) --- if [ ! -f "${HOME}/.abuild/abuild.conf" ]; then echo "" echo "=== generating abuild signing key ===" mkdir -p "${HOME}/.abuild" abuild-keygen -a -n 2>/dev/null || true # abuild-keygen requires doas to install the key system-wide; do it manually PUB=$(ls "${HOME}/.abuild/"*.pub 2>/dev/null | head -1) if [ -n "$PUB" ]; then cp "$PUB" /etc/apk/keys/ PRIV="${PUB%.pub}" echo "PACKAGER_PRIVKEY=\"${PRIV}\"" > "${HOME}/.abuild/abuild.conf" echo "abuild key: $PRIV" else echo "WARNING: abuild key generation failed" fi fi echo "" echo "=== builder setup complete ===" echo "Next: sh iso/builder/build-debug.sh"