Files
Remote-Terminal-for-MeshCore/scripts/quality/test_aur_package.sh
2026-04-10 10:49:49 -07:00

113 lines
3.6 KiB
Bash
Executable File

#!/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-meshcore.sysusers \
/pkg/remoteterm-meshcore.tmpfiles /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 (sysusers.d creates the remoteterm user, tmpfiles.d creates the data dir)
pacman -Syu --noconfirm >/dev/null 2>&1
pacman -U --noconfirm /pkg/*.pkg.tar.zst
# In a container there is no systemd to trigger sysusers/tmpfiles automatically,
# so run them manually.
systemd-sysusers
systemd-tmpfiles --create
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"