name: Build Archipelago ISO on: push: branches: [main] workflow_dispatch: jobs: build-iso: runs-on: ubuntu-latest timeout-minutes: 45 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 1 - name: Build backend run: | source $HOME/.cargo/env 2>/dev/null || true cargo build --release --manifest-path core/Cargo.toml - name: Build frontend run: cd neode-ui && npm ci && npm run build - name: Cache Debian Live ISO run: | WORK_DIR="image-recipe/build/auto-installer" mkdir -p "$WORK_DIR" CACHED="/home/archipelago/archy/image-recipe/build/auto-installer/debian-live-installer.iso" if [ -f "$CACHED" ] && [ ! -f "$WORK_DIR/debian-live-installer.iso" ]; then cp "$CACHED" "$WORK_DIR/debian-live-installer.iso" echo "Cached Debian Live ISO copied ($(du -h "$WORK_DIR/debian-live-installer.iso" | cut -f1))" fi - name: Build unbundled ISO run: | cd image-recipe export ARCHIPELAGO_BIN="$(pwd)/../core/target/release/archipelago" ls -la "$ARCHIPELAGO_BIN" || echo "WARNING: binary not found" sudo -E UNBUNDLED=1 DEV_SERVER=localhost BUILD_FROM_SOURCE=0 \ ARCHIPELAGO_BIN="$ARCHIPELAGO_BIN" \ ./build-auto-installer-iso.sh - name: Copy to Builds run: | ISO=$(ls image-recipe/results/archipelago-installer-unbundled-*.iso 2>/dev/null | head -1) if [ -n "$ISO" ]; then DATE=$(date +%Y%m%d-%H%M) DEST="/var/lib/archipelago/filebrowser/Builds/archipelago-unbundled-${DATE}.iso" sudo cp "$ISO" "$DEST" sudo chown 1000:1000 "$DEST" echo "ISO: archipelago-unbundled-${DATE}.iso" echo "Size: $(du -h "$DEST" | cut -f1)" echo "SHA256: $(sha256sum "$DEST" | cut -d' ' -f1)" fi - name: Build report if: always() run: | echo "══════════════════════════════════════════" echo "BUILD REPORT" echo "══════════════════════════════════════════" echo "Commit: $(git rev-parse --short HEAD) ($(git log -1 --format=%s))" echo "Branch: ${GITHUB_REF_NAME:-unknown}" echo "Date: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" echo "Runner: $(hostname)" echo "" echo "── Artifacts ──" ls -lh image-recipe/results/*.iso 2>/dev/null || echo " No ISO produced" ls -lh /var/lib/archipelago/filebrowser/Builds/archipelago-unbundled-*.iso 2>/dev/null | tail -3 echo "" echo "── Rootfs contents check ──" ROOTFS=$(ls image-recipe/build/auto-installer/rootfs.tar 2>/dev/null) if [ -n "$ROOTFS" ]; then echo " rootfs.tar: $(du -h "$ROOTFS" | cut -f1)" echo " nginx config: $(tar tf "$ROOTFS" ./etc/nginx/sites-available/archipelago 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " SSL cert: $(tar tf "$ROOTFS" ./etc/archipelago/ssl/archipelago.crt 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " keyboard config: $(tar tf "$ROOTFS" ./etc/default/keyboard 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " console-setup: $(tar tf "$ROOTFS" ./etc/default/console-setup 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " kiosk launcher: $(tar tf "$ROOTFS" ./usr/local/bin/archipelago-kiosk-launcher 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " logind lid: $(tar tf "$ROOTFS" ./etc/systemd/logind.conf.d/lid-ignore.conf 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " backend binary: $(tar tf "$ROOTFS" ./usr/local/bin/archipelago 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" echo " web-ui index: $(tar tf "$ROOTFS" ./opt/archipelago/web-ui/index.html 2>/dev/null && echo 'PRESENT' || echo 'MISSING')" else echo " rootfs.tar not found in workspace" fi echo "" echo "── ISO contents check ──" ISO=$(ls image-recipe/results/archipelago-installer-unbundled-*.iso 2>/dev/null | head -1) if [ -n "$ISO" ]; then echo " ISO size: $(du -h "$ISO" | cut -f1)" # Check installer script is present ISO_MOUNT=$(mktemp -d) if sudo mount -o loop,ro "$ISO" "$ISO_MOUNT" 2>/dev/null; then echo " auto-install.sh: $([ -f "$ISO_MOUNT/archipelago/auto-install.sh" ] && echo 'PRESENT' || echo 'MISSING')" echo " rootfs.tar: $([ -f "$ISO_MOUNT/archipelago/rootfs.tar" ] && echo "PRESENT ($(du -h "$ISO_MOUNT/archipelago/rootfs.tar" | cut -f1))" || echo 'MISSING')" echo " backend bin: $([ -f "$ISO_MOUNT/archipelago/bin/archipelago" ] && echo "PRESENT ($(du -h "$ISO_MOUNT/archipelago/bin/archipelago" | cut -f1))" || echo 'MISSING')" echo " frontend: $([ -f "$ISO_MOUNT/archipelago/web-ui/index.html" ] && echo 'PRESENT' || echo 'MISSING')" echo " image-versions: $([ -f "$ISO_MOUNT/archipelago/scripts/image-versions.sh" ] && echo 'PRESENT' || echo 'MISSING')" sudo umount "$ISO_MOUNT" 2>/dev/null else echo " Could not mount ISO for inspection" fi rmdir "$ISO_MOUNT" 2>/dev/null fi echo "══════════════════════════════════════════" - name: Fix workspace permissions if: always() run: sudo chown -R $(id -u):$(id -g) . 2>/dev/null || true