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/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 < $BUILD_DIR/usr/share/$PKG_NAME/setup/$PKG_NAME.desktop [Desktop Entry] Type=Application Name=Slideshow App Exec=/usr/bin/$PKG_NAME WorkingDirectory=/usr/share/$PKG_NAME 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 < $BUILD_DIR/DEBIAN/postinst #!/bin/sh # 1. Detect the real user (the one who ran sudo) REAL_USER=\$SUDO_USER if [ -z "\$REAL_USER" ]; then REAL_USER=\$(logname 2>/dev/null || echo "pi") fi USER_HOME=\$(getent passwd "\$REAL_USER" | cut -d: -f6) echo "Installing for user: \$REAL_USER in \$USER_HOME" # 2. Setup .env from template if [ ! -f "/usr/share/$PKG_NAME/.env" ]; then cp /usr/share/$PKG_NAME/.env.template /usr/share/$PKG_NAME/.env fi # 3. Setup Autostart for the graphical desktop AUTOSTART_DIR="\$USER_HOME/.config/autostart" mkdir -p "\$AUTOSTART_DIR" cp /usr/share/$PKG_NAME/setup/$PKG_NAME.desktop "\$AUTOSTART_DIR/" # 4. Fix Chromium Profile Permissions (Resolves the 'Profile Error') # This ensures the standard user can write to their own config if [ -d "\$USER_HOME/.config/chromium" ]; then chown -R \$REAL_USER:\$REAL_USER "\$USER_HOME/.config/chromium" rm -f "\$USER_HOME/.config/chromium/SingletonLock" fi # 5. Set correct ownership for the autostart file chown -R \$REAL_USER:\$REAL_USER "\$AUTOSTART_DIR/$PKG_NAME.desktop" echo "Installation complete. The app will start on the next Desktop login." 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