name: release # Pushing a v* tag builds Frame Control for macOS, Windows and Linux and attaches # the installers to that tag's GitHub release (created as a draft if missing). # Pull requests that touch the app build the same installers as artifacts. on: push: tags: ["v*"] pull_request: paths: ["app/**", "ui/**", "scripts/**", "frame/**", "apk-catalog/**", ".github/workflows/release.yml"] workflow_dispatch: permissions: contents: write jobs: build: strategy: fail-fast: false matrix: include: - os: macos-latest script: dist files: app/dist/*.dmg app/dist/*.zip - os: windows-latest script: dist:win files: app/dist/*.exe app/dist/*.zip - os: ubuntu-latest script: dist:linux files: app/dist/*.AppImage app/dist/*.deb runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "24" - name: Build working-directory: app shell: bash run: npm ci && npm run ${{ matrix.script }} env: CSC_IDENTITY_AUTO_DISCOVERY: "false" - name: Upload to the release if: startsWith(github.ref, 'refs/tags/') shell: bash env: GH_TOKEN: ${{ github.token }} run: | tag="${GITHUB_REF_NAME}" gh release view "$tag" >/dev/null 2>&1 || gh release create "$tag" --draft --title "Frame Control ${tag#v}" --notes "" gh release upload "$tag" ${{ matrix.files }} --clobber - uses: actions/upload-artifact@v4 with: name: frame-control-${{ matrix.os }} path: | app/dist/*.dmg app/dist/*.exe app/dist/*.zip app/dist/*.AppImage app/dist/*.deb if-no-files-found: ignore