name: Build Slideshow App on: push: tags: - '*' env: APP_NAME: slideshowApp jobs: build: runs-on: ubuntu-latest strategy: matrix: include: - os: windows arch: amd64 ext: .exe - os: linux arch: amd64 ext: "" - os: linux arch: arm64 ext: "" - os: linux arch: arm arm_version: 7 ext: "" steps: - name: Checkout repo uses: actions/checkout@v3 - name: Ensure latest Go is installed in /data/go run: | export GOROOT=/data/go/go export PATH=$GOROOT/bin:$PATH export GOCACHE=/data/gocache export GOMODCACHE=/data/gomodcache mkdir -p $GOCACHE $GOMODCACHE if [ ! -x "$GOROOT/bin/go" ]; then echo "Go not found in $GOROOT, downloading latest stable..." GO_VERSION=$(curl -s https://go.dev/VERSION?m=text | head -n1) echo "Latest version is $GO_VERSION" mkdir -p /data/go curl -sSL "https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz" -o /tmp/go.tar.gz tar -C /data/go -xzf /tmp/go.tar.gz else echo "Using cached Go from $GOROOT" fi go version - name: Download Go dependencies run: | export GOROOT=/data/go/go export PATH=$GOROOT/bin:$PATH export GOCACHE=/data/gocache export GOMODCACHE=/data/gomodcache mkdir -p $GOCACHE $GOMODCACHE go mod download - name: Build binary run: | export GOROOT=/data/go/go export PATH=$GOROOT/bin:$PATH export GOCACHE=/data/gocache export GOMODCACHE=/data/gomodcache mkdir -p $GOCACHE $GOMODCACHE OUTPUT="${APP_NAME}" if [ -n "${{ matrix.arm_version }}" ]; then export GOARM=${{ matrix.arm_version }} fi OUTPUT="${OUTPUT}${{ matrix.ext }}" echo "Building $OUTPUT" GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} go build -ldflags="-s -w" -trimpath -o "$OUTPUT" shell: bash - name: Create Debian Package if: matrix.os == 'linux' run: | # 1. Setup Variables VERSION=${GITHUB_REF_NAME#v} # Extracts 1.0.0 from v1.0.0 ARCH=${{ matrix.arch }} if [ "$ARCH" == "arm" ]; then ARCH="armhf"; fi PKG_NAME="slideshowapp" BUILD_DIR="${PKG_NAME}_${VERSION}_${ARCH}" # 2. Create Directory Structure mkdir -p $BUILD_DIR/usr/bin mkdir -p $BUILD_DIR/usr/share/$PKG_NAME mkdir -p $BUILD_DIR/usr/share/$PKG_NAME/data mkdir -p $BUILD_DIR/etc/systemd/system mkdir -p $BUILD_DIR/DEBIAN # 3. Copy Files cp ${APP_NAME} $BUILD_DIR/usr/bin/$PKG_NAME cp -r ./web $BUILD_DIR/usr/share/$PKG_NAME/ chmod +x $BUILD_DIR/usr/bin/$PKG_NAME # 4. Handle .env (Copy as a .template so it doesn't overwrite existing ones) if [ -f ".env" ]; then cp .env $BUILD_DIR/usr/share/$PKG_NAME/.env.template else echo "PORT=8080" > $BUILD_DIR/usr/share/$PKG_NAME/.env.template fi # 5. Create a Template Autostart File (Instead of Systemd) mkdir -p $BUILD_DIR/usr/share/$PKG_NAME/setup cat <<'EOF' > $BUILD_DIR/usr/share/$PKG_NAME/setup/$PKG_NAME.desktop [Desktop Entry] Type=Application Name=Slideshow App Exec=sh -c 'i=0; while [ $i -lt 30 ]; do if [ "$(ls -A /media/$USER 2>/dev/null)" ] && ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1; then break; fi; i=$((i+1)); sleep 1; done; cd /usr/share/slideshowapp && /usr/bin/slideshowapp' Terminal=false EOF # 6. Create Control File cat < $BUILD_DIR/DEBIAN/control Package: $PKG_NAME Version: $VERSION Section: utils Priority: optional Architecture: $ARCH Maintainer: Adrian Zuercher Description: Slideshow Application EOF # 7. Add post-install script for Autostart and Permissions cat <<'EOF' > $BUILD_DIR/DEBIAN/postinst #!/bin/sh set -e # Exit on error # 1. Detect the real user # We use 'who' and 'awk' as a fallback because $SUDO_USER is sometimes empty in Gitea/CI environments REAL_USER=${SUDO_USER:-$(who | awk '{print $1}' | head -n1)} # If still empty, default to 'mst' or 'pi' (adjust to your primary user) if [ -z "$REAL_USER" ] || [ "$REAL_USER" = "root" ]; then REAL_USER="mst" fi USER_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) echo "Setting permissions for /usr/share/slideshowapp..." chown -R "$REAL_USER:$REAL_USER" /usr/share/slideshowapp chmod -R 755 /usr/share/slideshowapp echo "Post-install: Target user is $REAL_USER" echo "Post-install: Target home is $USER_HOME" # 2. Setup .env from template if [ ! -f "/usr/share/slideshowapp/.env" ]; then echo "Creating .env from template..." cp /usr/share/slideshowapp/env.template /usr/share/slideshowapp/.env || true fi # 3. Setup Autostart # We use -p to ensure parent directories exist and set ownership immediately AUTOSTART_DIR="$USER_HOME/.config/autostart" if [ -d "$USER_HOME" ]; then echo "Creating autostart directory at $AUTOSTART_DIR" mkdir -p "$AUTOSTART_DIR" cp /usr/share/slideshowapp/setup/slideshowapp.desktop "$AUTOSTART_DIR/" # Critical: Change ownership of the folder and the file chown -R "$REAL_USER:$REAL_USER" "$USER_HOME/.config" chmod 644 "$AUTOSTART_DIR/slideshowapp.desktop" else echo "ERROR: Home directory $USER_HOME not found. Autostart not configured." fi # 4. Fix Chromium Profile Permissions if [ -d "$USER_HOME/.config/chromium" ]; then echo "Cleaning up Chromium locks for $REAL_USER..." chown -R "$REAL_USER:$REAL_USER" "$USER_HOME/.config/chromium" rm -f "$USER_HOME/.config/chromium/SingletonLock" rm -f "$USER_HOME/.config/chromium/SingletonCookie" fi echo "Installation complete." EOF chmod 555 $BUILD_DIR/DEBIAN/postinst # 8. Build .deb dpkg-deb --build $BUILD_DIR shell: bash # Upload for Windows (Binary + Web folder) - name: Upload Windows Artifact if: matrix.os == 'windows' uses: actions/upload-artifact@v3 with: name: ${{ env.APP_NAME }}-windows path: | ${{ env.APP_NAME }}.exe ./web # Upload for Linux (Binary + .deb) - name: Upload Linux Artifact if: matrix.os == 'linux' uses: actions/upload-artifact@v3 with: name: ${{ env.APP_NAME }}-linux-${{ matrix.arch }} path: | ${{ env.APP_NAME }} *.deb