mirror of
https://github.com/Toastconcern/FrameStudio.git
synced 2026-10-29 04:02:56 +01:00
The release job depended on every build job, including the macOS Intel runner, which can sit in GitHub's hosted queue for hours. Because a new push cancels the in-progress run (concurrency: cancel-in-progress) and a cancelled run skips Publish (if: !cancelled()), no run ever lived long enough to create the "latest" release. Drop macOS from the release job's needs so it publishes once Linux, Windows and the installer are done; both Mac builds still run and are attached whenever they finish in time. Also add timeout-minutes to every job so nothing can hang on GitHub's 6-hour default again. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
135 lines
5.2 KiB
YAML
135 lines
5.2 KiB
YAML
# 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 }}
|
|
timeout-minutes: 45
|
|
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
|
|
timeout-minutes: 45
|
|
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 }}
|
|
timeout-minutes: 45
|
|
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
|
|
timeout-minutes: 30
|
|
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
|
|
# "latest" gets every build that finished (a failed or still-slow platform just isn't in it); a version release
|
|
# needs them all. We don't wait on macOS: its runners can sit in GitHub's queue for hours, and since a push
|
|
# cancels the previous run, waiting meant no run ever reached this job. Both Mac builds still upload and are
|
|
# attached whenever they finish in time.
|
|
if: ${{ !cancelled() && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') }}
|
|
needs: [linux, windows, frame-home]
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 20
|
|
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."
|