# Builds Frame Studio for every computer it runs on, and the Frame Home installer, on every push (any branch or tag), # every pull request, and by hand (Actions > build > Run workflow). Each build is a downloadable artifact of the run. # A push to main also replaces the "latest" pre-release with them (one place to download the newest of everything); # a tag "v*" publishes them as that version's release. name: build on: push: pull_request: workflow_dispatch: # A newer push to the same branch replaces a run still going (its builds would be out of date anyway). concurrency: group: build-${{ github.ref }} cancel-in-progress: true jobs: linux: name: Linux ${{ matrix.arch }} strategy: fail-fast: false matrix: include: - { arch: x64, runner: ubuntu-24.04, extra: "" } - { arch: x86, runner: ubuntu-24.04, extra: "gcc-multilib g++-multilib" } - { arch: arm64, runner: ubuntu-24.04-arm, extra: "" } runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v4 - name: Tools and X11 headers run: | sudo apt-get update sudo apt-get install -y ninja-build cmake libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxkbcommon-dev ${{ matrix.extra }} - name: Build run: sh scripts/build-studio.sh linux-${{ matrix.arch }} - uses: actions/upload-artifact@v4 with: name: FrameStudio-linux-${{ matrix.arch }} path: dist/FrameStudio-linux-${{ matrix.arch }}.tar.gz windows: name: Windows ${{ matrix.arch }} strategy: fail-fast: false matrix: arch: [x64, x86, arm64] runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: Build (MSVC) shell: cmd run: studio\build_windows.bat ${{ matrix.arch }} "%GITHUB_WORKSPACE%\build\windows-${{ matrix.arch }}" - name: Package shell: pwsh run: | $name = "FrameStudio-windows-${{ matrix.arch }}" $stage = "build/stage/$name" New-Item -ItemType Directory -Force $stage | Out-Null Copy-Item "build/windows-${{ matrix.arch }}/Frame Studio.exe" $stage Copy-Item -Recurse "build/windows-${{ matrix.arch }}/frame" "$stage/frame" Copy-Item LICENSE "$stage/LICENSE.txt" New-Item -ItemType Directory -Force dist | Out-Null Compress-Archive -Path $stage -DestinationPath "dist/$name.zip" -Force - uses: actions/upload-artifact@v4 with: name: FrameStudio-windows-${{ matrix.arch }} path: dist/FrameStudio-windows-${{ matrix.arch }}.zip macos: name: macOS ${{ matrix.arch }} strategy: fail-fast: false matrix: include: - { arch: arm64, runner: macos-14 } - { arch: x64, runner: macos-13 } runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v4 - name: Tools and MoltenVK (Vulkan on Metal, bundled into the app) run: brew install ninja molten-vk - name: Build run: sh scripts/build-studio.sh macos-${{ matrix.arch }} - uses: actions/upload-artifact@v4 with: name: FrameStudio-macos-${{ matrix.arch }} path: dist/FrameStudio-macos-${{ matrix.arch }}.zip frame-home: name: Frame Home installer runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Package run: sh scripts/build-studio.sh frame-home - uses: actions/upload-artifact@v4 with: name: FrameHome-installer path: dist/FrameHome-installer.zip release: name: Publish # (also when a platform failed: "latest" gets every build that worked; a version release needs them all) if: ${{ !cancelled() && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') }} needs: [linux, windows, macos, frame-home] runs-on: ubuntu-24.04 permissions: contents: write env: GH_TOKEN: ${{ github.token }} REPO: ${{ github.repository }} steps: - uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Version release (tag v*) if: ${{ startsWith(github.ref, 'refs/tags/v') && !contains(needs.*.result, 'failure') }} run: gh release create "${{ github.ref_name }}" dist/* --repo "$REPO" --title "Frame Studio ${{ github.ref_name }}" --generate-notes - name: Latest build (push to main) if: github.ref == 'refs/heads/main' run: | gh release delete latest --repo "$REPO" --yes --cleanup-tag 2>/dev/null || true gh release create latest dist/* --repo "$REPO" --prerelease --target "${{ github.sha }}" \ --title "Latest build (${GITHUB_SHA::7})" \ --notes "Built automatically from ${{ github.sha }} on $(date -u '+%Y-%m-%d %H:%M UTC'). Replaced by every push to main."