name: Build and Make Electron App on: push: branches: - master tags: - 'v*.*.*' pull_request: branches: - master workflow_dispatch: jobs: build: name: Build on ${{ matrix.os }} ${{ matrix.arch }} runs-on: ${{ matrix.runner }} timeout-minutes: 60 strategy: matrix: include: # macOS builds - separate runners to avoid native module conflicts - os: macos runner: macos-15-intel arch: x64 - os: macos runner: macos-latest arch: arm64 # Linux and Windows - os: linux runner: ubuntu-latest - os: windows runner: windows-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 10 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'pnpm' - name: Install Linux system dependencies if: matrix.os == 'linux' run: | sudo apt-get update sudo apt-get install --no-install-recommends -y rpm libarchive-tools flatpak flatpak-builder # Configure Flatpak # 1. Add the Flathub repository (source of runtimes) flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo # 2. Install the standard Freedesktop Platform and SDK (required by electron-builder) # We install version 24.08 as a safe default, electron-builder might pick what it needs flatpak install --user -y flathub org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08 - name: Install dependencies run: pnpm install --no-frozen-lockfile - name: Build frontend run: npx nx build web --skip-nx-cache - name: Build backend run: npm run build:backend - name: Override macOS arch in electron-builder.json if: matrix.os == 'macos' run: | # Replace the mac arch array with just the target architecture node -e " const fs = require('fs'); const pkg = JSON.parse(fs.readFileSync('electron-builder.json', 'utf8')); pkg.mac.target.arch = ['${{ matrix.arch }}']; fs.writeFileSync('electron-builder.json', JSON.stringify(pkg, null, 4)); " - name: Make Electron app run: npm run make:app - name: Upload artifacts (macOS) if: matrix.os == 'macos' uses: actions/upload-artifact@v4 with: name: macos-${{ matrix.arch }}-artifacts path: | dist/executables/**/*.dmg dist/executables/**/*.zip retention-days: 7 - name: Upload artifacts (Linux) if: matrix.os == 'linux' uses: actions/upload-artifact@v4 with: name: linux-artifacts path: | dist/executables/**/*.deb dist/executables/**/*.rpm dist/executables/**/*.snap dist/executables/**/*.AppImage dist/executables/**/*.tar.gz dist/executables/**/*.pacman dist/executables/**/*.flatpak retention-days: 7 - name: Upload artifacts (Windows) if: matrix.os == 'windows' uses: actions/upload-artifact@v4 with: name: windows-artifacts path: | dist/executables/**/*.exe dist/executables/**/*.msi dist/executables/**/*.zip retention-days: 7 create-release: name: Create Draft Release needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Display structure of downloaded files run: ls -R artifacts - name: Get version from package.json id: package-version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - name: Create Draft Release uses: softprops/action-gh-release@v2 with: draft: true prerelease: ${{ github.event_name == 'pull_request' }} name: Release v${{ steps.package-version.outputs.version }} tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || format('test-{0}', github.sha) }} generate_release_notes: true files: | artifacts/macos-x64-artifacts/*-x64.dmg artifacts/macos-x64-artifacts/*-x64.zip artifacts/macos-arm64-artifacts/*-arm64.dmg artifacts/macos-arm64-artifacts/*-arm64.zip artifacts/linux-artifacts/*.AppImage artifacts/linux-artifacts/*.deb artifacts/linux-artifacts/*.rpm artifacts/linux-artifacts/*.snap artifacts/linux-artifacts/*.tar.gz artifacts/linux-artifacts/*.pacman artifacts/linux-artifacts/*.flatpak artifacts/windows-artifacts/*-setup.exe artifacts/windows-artifacts/*.msi artifacts/windows-artifacts/*.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} publish-snap: name: Publish to Snapcraft Store needs: build runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.snapcraft_token }} steps: - name: Download snap artifact uses: actions/download-artifact@v4 with: name: linux-artifacts path: artifacts - name: Setup Snapcraft uses: samuelmeuli/action-snapcraft@v3 - name: Publish all snaps to edge channel run: | # Find and publish all snap files for SNAP_FILE in artifacts/*.snap; do if [ -f "$SNAP_FILE" ]; then echo "Publishing: $SNAP_FILE" snapcraft upload --release=edge "$SNAP_FILE" fi done