91 lines
3.4 KiB
Bash
91 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
|
# Baut grotti_<version>_<arch>.deb (auf dem Zielsystem oder arm64-Container).
|
|
# Aufruf aus dem Repo-Root: bash packaging/build-deb.sh
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$ROOT"
|
|
|
|
if ! command -v dpkg-deb >/dev/null 2>&1; then
|
|
echo "dpkg-deb fehlt — bitte auf Debian/Raspberry Pi OS bauen." >&2
|
|
exit 1
|
|
fi
|
|
|
|
VERSION="$(python3 -c "from grotti.version import __version__; print(__version__)")"
|
|
ARCH="$(dpkg --print-architecture)"
|
|
PKG="grotti_${VERSION}_${ARCH}"
|
|
DIST="$ROOT/packaging/dist"
|
|
STAGE="$DIST/$PKG"
|
|
|
|
rm -rf "$STAGE"
|
|
mkdir -p "$STAGE/DEBIAN" \
|
|
"$STAGE/usr/lib/grotti" \
|
|
"$STAGE/usr/bin" \
|
|
"$STAGE/etc/grotti" \
|
|
"$STAGE/lib/systemd/system" \
|
|
"$STAGE/usr/share/grotti" \
|
|
"$STAGE/usr/share/doc/grotti" \
|
|
"$STAGE/var/lib/grotti/data/eingang" \
|
|
"$STAGE/var/lib/grotti/slice"
|
|
|
|
rsync -a --delete \
|
|
--exclude '__pycache__' --exclude '*.pyc' --exclude '.pytest_cache' \
|
|
"$ROOT/grotti/" "$STAGE/usr/lib/grotti/grotti/"
|
|
rsync -a --delete \
|
|
--exclude '__pycache__' --exclude '*.pyc' \
|
|
"$ROOT/web/" "$STAGE/usr/lib/grotti/web/"
|
|
cp "$ROOT/server.py" "$STAGE/usr/lib/grotti/server.py"
|
|
cp "$ROOT/requirements.txt" "$STAGE/usr/lib/grotti/requirements.txt"
|
|
cp "$ROOT/config.example.json" "$STAGE/usr/lib/grotti/config.example.json"
|
|
mkdir -p "$STAGE/usr/lib/grotti/scripts"
|
|
cp "$ROOT/scripts/pfade_umziehen.py" "$STAGE/usr/lib/grotti/scripts/pfade_umziehen.py"
|
|
# Symlink-Pfad für die Anleitung
|
|
mkdir -p "$STAGE/opt/grotti"
|
|
ln -sfn /usr/lib/grotti/scripts "$STAGE/opt/grotti/scripts"
|
|
ln -sfn /usr/lib/grotti/venv "$STAGE/opt/grotti/venv"
|
|
echo '[]' > "$STAGE/usr/lib/grotti/drucker.json"
|
|
cp "$ROOT/packaging/config.pi.json" "$STAGE/usr/share/grotti/config.pi.json"
|
|
cp "$ROOT/packaging/config.pi.json" "$STAGE/etc/grotti/config.json"
|
|
cp "$ROOT/packaging/grotti.service" "$STAGE/lib/systemd/system/grotti.service"
|
|
cp "$ROOT/docs/Anleitung-Installation-Pi.md" "$STAGE/usr/share/doc/grotti/"
|
|
cp "$ROOT/CHANGELOG.md" "$STAGE/usr/share/doc/grotti/changelog"
|
|
gzip -9 -f "$STAGE/usr/share/doc/grotti/changelog"
|
|
|
|
cat > "$STAGE/usr/bin/grotti" <<'EOF'
|
|
#!/bin/sh
|
|
export GROTTI_CONFIG="${GROTTI_CONFIG:-/etc/grotti/config.json}"
|
|
exec /usr/lib/grotti/venv/bin/python /usr/lib/grotti/server.py "$@"
|
|
EOF
|
|
chmod 755 "$STAGE/usr/bin/grotti"
|
|
|
|
python3 -m venv "$STAGE/usr/lib/grotti/venv"
|
|
"$STAGE/usr/lib/grotti/venv/bin/pip" install --upgrade pip wheel
|
|
"$STAGE/usr/lib/grotti/venv/bin/pip" install -r "$ROOT/requirements.txt"
|
|
|
|
SIZE_KB="$(du -sk "$STAGE" | awk '{print $1}')"
|
|
cat > "$STAGE/DEBIAN/control" <<EOF
|
|
Package: grotti
|
|
Version: ${VERSION}
|
|
Section: web
|
|
Priority: optional
|
|
Architecture: ${ARCH}
|
|
Maintainer: Dominic Gundel <[email protected]>
|
|
Depends: python3 (>= 3.11), python3-venv, postgresql, adduser
|
|
Installed-Size: ${SIZE_KB}
|
|
Homepage: https://git.gundel.dev/dg/grotti
|
|
Description: Farm-Manager für Moonraker-Drucker (Kobra 3 / S1)
|
|
Grotti steuert eine 3D-Drucker-Farm über Moonraker: Wand, Warteschlange,
|
|
Material, Abläufe und Protokoll. PostgreSQL wird lokal mit eingerichtet.
|
|
EOF
|
|
|
|
cp "$ROOT/packaging/debian/conffiles" "$STAGE/DEBIAN/conffiles"
|
|
for script in postinst prerm postrm; do
|
|
cp "$ROOT/packaging/debian/$script" "$STAGE/DEBIAN/$script"
|
|
chmod 755 "$STAGE/DEBIAN/$script"
|
|
done
|
|
|
|
dpkg-deb --root-owner-group --build "$STAGE" "$DIST/${PKG}.deb"
|
|
echo "Gebaut: $DIST/${PKG}.deb"
|
|
echo "Install: sudo apt install ./packaging/dist/${PKG}.deb"
|
|
echo "Logs: journalctl -u grotti -f"
|