hermes-hub/installer/build_installer_linux.sh
Hermes Team 290e23070e feat(installer): самодостаточный установщик для Linux, без копирования репозитория
install-linux.sh читал исходники из $REPO_ROOT, поэтому на каждую машину
приходилось приносить весь клон git. Добавлен build_installer_linux.sh: он
собирает один файл dist/hermes-hub-setup.sh — пролог на shell, строка-маркер
и tar.gz побайтово следом. Пролог обрезает себя по маркеру, распаковывает
хвост во временный каталог и запускает оттуда install-linux.sh. Состав
поставки тот же, что у виндового payload, плюс installer/; виндовые .exe и
__pycache__ из линуксовой поставки вычищаются.

Убран запасной коммит-литерал 'fb23bff' в манифесте: при сборке без git он
подставлял чужой номер сборки, из-за чего установленная версия выглядела
определённой, не будучи ею. Теперь коммит берётся из BUILD_COMMIT, который
кладёт сборщик, иначе — 'не определён'.

Проверено: распаковка проходит, в поставке лежат свежие server.py и app.js,
секретов, ключей и почт в ней нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 09:10:32 +07:00

81 lines
3.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Собирает ОДИН самодостаточный файл dist/hermes-hub-setup.sh.
#
# Зачем: install-linux.sh читает исходники из каталога репозитория, поэтому на
# каждую машину приходилось копировать весь клон git. Здесь исходники
# упакованы внутрь самого установщика — файл переносится один и работает там,
# где git не установлен вовсе.
#
# Устройство: текстовый пролог, затем строка-маркер, затем tar.gz побайтово.
# Пролог обрезает себя по маркеру и распаковывает хвост во временный каталог.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
DIST_DIR="$REPO_ROOT/dist"
OUT="$DIST_DIR/hermes-hub-setup.sh"
COMMIT="$(cd "$REPO_ROOT" && git rev-parse --short HEAD 2>/dev/null || echo 'не определён')"
echo "Сборка установщика Linux, коммит: $COMMIT"
STAGE="$(mktemp -d)"
trap 'rm -rf "$STAGE"' EXIT
# Тот же состав, что в виндовом payload, плюс installer/ — внутри него лежит
# install-linux.sh, который и выполняет установку.
for item in src launcher assets config scripts installer; do
[ -e "$REPO_ROOT/$item" ] || continue
cp -r "$REPO_ROOT/$item" "$STAGE/$item"
done
printf '%s' "$COMMIT" > "$STAGE/BUILD_COMMIT"
find "$STAGE" -name '__pycache__' -type d -prune -exec rm -rf {} + 2>/dev/null || true
find "$STAGE" -name '*.pyc' -delete 2>/dev/null || true
# Виндовые бинарники в линуксовой поставке бесполезны и весят больше мегабайта.
find "$STAGE/launcher" -name '*.exe' -delete 2>/dev/null || true
PAYLOAD="$(mktemp)"
tar -czf "$PAYLOAD" -C "$STAGE" .
mkdir -p "$DIST_DIR"
cat > "$OUT" <<'STUB'
#!/usr/bin/env bash
# Hermes Hub — самодостаточный установщик. Репозиторий и git не нужны.
# bash hermes-hub-setup.sh
set -euo pipefail
if ! command -v tar >/dev/null 2>&1; then
echo "Нужен tar. Установите его: apt install tar" >&2
exit 1
fi
MARKER='__HERMES_HUB_PAYLOAD_BELOW__'
SELF="$0"
LINE="$(grep -a -n "^$MARKER\$" "$SELF" | head -1 | cut -d: -f1)"
if [ -z "${LINE:-}" ]; then
echo "Файл повреждён: не найдена граница вложенных данных." >&2
exit 1
fi
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
echo "Распаковка..."
tail -n +$((LINE + 1)) "$SELF" | tar -xzf - -C "$TMP"
if [ ! -f "$TMP/installer/install-linux.sh" ]; then
echo "Файл повреждён: во вложенных данных нет installer/install-linux.sh." >&2
exit 1
fi
chmod +x "$TMP/installer/install-linux.sh" 2>/dev/null || true
exec bash "$TMP/installer/install-linux.sh" "$@"
STUB
echo '__HERMES_HUB_PAYLOAD_BELOW__' >> "$OUT"
cat "$PAYLOAD" >> "$OUT"
rm -f "$PAYLOAD"
chmod +x "$OUT"
SIZE_KB=$(( $(wc -c < "$OUT") / 1024 ))
echo "Готово: $OUT (${SIZE_KB} КБ)"