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 change how the installers are built (the Electron app, the # macOS helper it compiles, or this workflow) build the same installers as # artifacts. ui/, scripts/, frame/ and apk-catalog/ are copied in as they are and # are tested by the checks workflow; run this one by hand to package them early. on: push: tags: ["v*"] pull_request: paths: ["app/**", "mac/frame-mac-view/**", ".github/workflows/release.yml"] workflow_dispatch: # A newer push to the same pull request supersedes a build still in progress. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} 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 # Tagged builds are attached to the release above; only other builds need artifacts. - uses: actions/upload-artifact@v4 if: ${{ !startsWith(github.ref, 'refs/tags/') }} 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