diff --git a/scripts/quality/test_aur_package.sh b/scripts/quality/test_aur_package.sh new file mode 100644 index 0000000..8ae6da6 --- /dev/null +++ b/scripts/quality/test_aur_package.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -euo pipefail + +# test_aur_package.sh — Build the AUR package in one Arch container, then +# install and run it in a clean Arch container with port 8000 exposed. +# +# Usage: +# ./scripts/quality/test_aur_package.sh [--port PORT] +# +# The script streams application logs until you Ctrl-C. + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +PORT=8000 +if [ "${1:-}" = "--port" ]; then PORT="${2:-8000}"; fi + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +BOLD='\033[1m' +NC='\033[0m' + +ARTIFACT_DIR="$(mktemp -d)" +INSTALL_CONTAINER="remoteterm-aur-test-$$" + +cleanup() { + echo + echo -e "${YELLOW}Cleaning up...${NC}" + docker rm -f "$INSTALL_CONTAINER" 2>/dev/null || true + rm -rf "$ARTIFACT_DIR" + echo -e "${GREEN}Done.${NC}" +} +trap cleanup EXIT + +# ── Phase 1: Build ──────────────────────────────────────────────────────────── + +echo -e "${BOLD}=== Phase 1: Build AUR package ===${NC}" + +docker run --rm \ + -v "$REPO_ROOT/pkg/aur:/pkg:ro" \ + -v "$ARTIFACT_DIR:/out" \ + archlinux:latest bash -c ' +set -euo pipefail + +pacman -Syu --noconfirm base-devel git curl >/dev/null 2>&1 +curl -LsSf https://astral.sh/uv/install.sh | sh >/dev/null 2>&1 +export PATH="$HOME/.local/bin:$PATH" +pacman -S --noconfirm nodejs npm >/dev/null 2>&1 + +useradd -m builder +echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + +BUILD_DIR=/home/builder/build +mkdir -p "$BUILD_DIR" +cp /pkg/PKGBUILD /pkg/remoteterm-meshcore.install \ + /pkg/remoteterm-meshcore.service /pkg/remoteterm.env "$BUILD_DIR/" +chown -R builder:builder "$BUILD_DIR" + +echo "Building package..." +su builder -c "export PATH=\"$HOME/.local/bin:\$PATH\" && cd $BUILD_DIR && makepkg -sf --noconfirm" 2>&1 + +cp "$BUILD_DIR"/remoteterm-meshcore-*.pkg.tar.zst /out/ +echo "Package artifact copied to /out/" +ls -lh /out/*.pkg.tar.zst +' + +PKG_FILE="$(ls "$ARTIFACT_DIR"/*.pkg.tar.zst 2>/dev/null | head -1)" +if [ -z "$PKG_FILE" ]; then + echo -e "${RED}Build failed — no .pkg.tar.zst produced${NC}" + exit 1 +fi + +echo -e "${GREEN}Built: $(basename "$PKG_FILE") ($(du -h "$PKG_FILE" | cut -f1))${NC}" +echo + +# ── Phase 2: Install and run ───────────────────────────────────────────────── + +echo -e "${BOLD}=== Phase 2: Install and run ===${NC}" + +docker run -d \ + --name "$INSTALL_CONTAINER" \ + -p "$PORT:8000" \ + -v "$ARTIFACT_DIR:/pkg:ro" \ + archlinux:latest bash -c ' +set -euo pipefail + +# Install the package (triggers pre_install which creates the remoteterm user) +pacman -Syu --noconfirm >/dev/null 2>&1 +pacman -U --noconfirm /pkg/*.pkg.tar.zst + +# Create the state directory (systemd StateDirectory= would do this on a real host) +mkdir -p /var/lib/remoteterm-meshcore +chown remoteterm:remoteterm /var/lib/remoteterm-meshcore + +echo "============================================" +echo " RemoteTerm installed — starting server" +echo "============================================" + +# Run as the remoteterm service user, matching the systemd unit +exec su -s /bin/bash remoteterm -c "cd /opt/remoteterm-meshcore && exec .venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000" +' >/dev/null + +echo -e "${CYAN}Container:${NC} $INSTALL_CONTAINER" +echo -e "${CYAN}Listening:${NC} http://localhost:$PORT" +echo -e "${CYAN}Health: ${NC} http://localhost:$PORT/api/health" +echo +echo -e "${YELLOW}Streaming logs (Ctrl-C to stop and clean up)...${NC}" +echo + +docker logs -f "$INSTALL_CONTAINER"