stages: - build-web - build-desktop variables: npm_config_cache: "$CI_PROJECT_DIR/.npm" ELECTRON_CACHE: "$CI_PROJECT_DIR/.cache/electron" cache: key: ${CI_COMMIT_REF_SLUG} paths: - pwa/node_modules/ - pwa/.npm/ - pwa/.cache/ # Build the web application first build:web: stage: build-web image: node:20-alpine script: - cd pwa - npm ci - npm run build artifacts: paths: - pwa/dist/ expire_in: 1 hour rules: - if: '$CI_COMMIT_TAG' tags: - docker # Build Linux AppImage and .deb build:linux: stage: build-desktop image: electronuserland/builder:wine dependencies: - build:web script: - cd pwa - npm ci - npm run electron:build:linux - echo "=== AppImage size ===" - ls -lh dist-electron/*.AppImage - du -h dist-electron/*.AppImage artifacts: paths: - pwa/dist-electron/*.AppImage expire_in: 1 week name: "linux-appimage-$CI_COMMIT_TAG" rules: - if: '$CI_COMMIT_TAG' tags: - docker # Build Linux .deb (separate job to avoid size limits) build:linux-deb: stage: build-desktop image: electronuserland/builder:wine dependencies: - build:web script: - cd pwa - npm ci - npm run electron:build:linux artifacts: paths: - pwa/dist-electron/*.deb expire_in: 1 week name: "linux-deb-$CI_COMMIT_TAG" rules: - if: '$CI_COMMIT_TAG' tags: - docker # Build Windows executable build:windows: stage: build-desktop image: electronuserland/builder:wine dependencies: - build:web script: - cd pwa - npm ci - npm run electron:build:win # Show file sizes - echo "=== Build artifacts ===" - ls -lh dist-electron/*.exe || echo "No .exe files found" - echo "=== Total size ===" - du -sh dist-electron/ artifacts: paths: - pwa/dist-electron/*.exe expire_in: 1 week name: "windows-installer-$CI_COMMIT_TAG" rules: - if: '$CI_COMMIT_TAG' tags: - docker