#!/usr/bin/env bash # Собирает Lark DE в Docker на удалённой машине и приносит готовый композитор # обратно: локальная машина может быть слабой, а сборка Rust со smithay долгой. # # Использование: # scripts/build-remote.sh <пользователь@хост> [порт] [--check] # # Пример: # scripts/build-remote.sh niko@n1ko.dev 2241 --check # # Переменные окружения: # LARK_REMOTE_DIR каталог сборки на удалённой машине (/tmp/lark-build) # LARK_LOCAL_BIN куда положить бинарник (target/release/lark) # LARK_CHECK непустое значение равносильно --check # # На удалённой машине нужны ssh, rsync и Docker. Бинарник собирается по # Dockerfile (этапы builder/binary), проверка --check поднимает Xvfb внутри # контейнера, запускает композитор с weston-terminal и забирает снимок # экрана и журнал в target/lark-headless/. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" REMOTE="" PORT="22" CHECK="${LARK_CHECK:-}" REMOTE_DIR="${LARK_REMOTE_DIR:-/tmp/lark-build}" LOCAL_BIN="${LARK_LOCAL_BIN:-$ROOT/target/release/lark}" for arg in "$@"; do case "$arg" in --check) CHECK=1 ;; --help|-h) sed -n '2,18p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 ;; *) if [[ -z "$REMOTE" ]]; then REMOTE="$arg" elif [[ "$PORT" == "22" ]]; then PORT="$arg" else echo "Лишний аргумент: $arg" >&2 exit 1 fi ;; esac done if [[ -z "$REMOTE" ]]; then echo "Использование: $0 <пользователь@хост> [порт] [--check]" >&2 exit 1 fi SSH=(ssh -p "$PORT") RSYNC=(rsync -az -e "ssh -p $PORT") echo "==> Копирую исходники: $ROOT -> $REMOTE:$REMOTE_DIR" "${SSH[@]}" "$REMOTE" "mkdir -p '$REMOTE_DIR'" "${RSYNC[@]}" --delete --exclude target --exclude .git "$ROOT/" "$REMOTE:$REMOTE_DIR/" echo "==> Собираю бинарник в Docker" "${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && rm -rf out && docker build --target binary -o out ." echo "==> Забираю бинарник: $LOCAL_BIN" mkdir -p "$(dirname "$LOCAL_BIN")" "${RSYNC[@]}" "$REMOTE:$REMOTE_DIR/out/lark" "$LOCAL_BIN" chmod +x "$LOCAL_BIN" ls -lh "$LOCAL_BIN" if [[ -n "$CHECK" ]]; then SHOTS="$ROOT/target/lark-headless" echo "==> Проверка без дисплея в контейнере (Xvfb)" "${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && docker build --target headless -t lark:headless ." "${SSH[@]}" "$REMOTE" "cd '$REMOTE_DIR' && mkdir -p headless && docker run --rm \ -v '$REMOTE_DIR/headless:/shots' \ -e LARK_TEST_SHOT=/shots/lark-shot.png \ -e LARK_TEST_LOG=/shots/lark.log \ lark:headless" mkdir -p "$SHOTS" "${RSYNC[@]}" "$REMOTE:$REMOTE_DIR/headless/" "$SHOTS/" echo "==> Снимок и журнал: $SHOTS" ls -l "$SHOTS" fi echo "==> Готово. Локальный запуск: $LOCAL_BIN"