fluxa-desktop/.github/workflows/build.yml

272 lines
10 KiB
YAML

name: Build
on:
push:
tags: ["v*"]
workflow_dispatch:
env:
NODE_VERSION: "22"
RUST_VERSION: "stable"
permissions:
contents: write
jobs:
# libmpv + its MSYS2 runtime deps come prebuilt from KhooLy/mpv.
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: FluxaMedia/fluxa-core
path: fluxa-core
- name: Link sibling repos
shell: bash
run: |
PARENT="$(dirname "$GITHUB_WORKSPACE")"
cmd //c mklink //J "$PARENT\\fluxa-core" "$GITHUB_WORKSPACE\\fluxa-core"
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- name: Set up Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
- name: Cache Rust build
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Fetch libmpv (KhooLy/mpv gpu-next fork)
shell: bash
run: ./src-tauri/fetch-libmpv.sh
# ANGLE (libEGL.dll/libGLESv2.dll) backs mpv's OpenGL render API with a
# real D3D11 device on Windows. Without it, D3D11VA hwdec has nothing to
# attach to and decode silently falls back to software on every vendor.
- name: Cache vcpkg ANGLE build
uses: actions/cache@v4
with:
path: |
${{ env.VCPKG_INSTALLATION_ROOT }}\installed
${{ env.VCPKG_INSTALLATION_ROOT }}\packages
key: vcpkg-angle-x64-windows-v1
- name: Build ANGLE via vcpkg
shell: bash
run: |
"$VCPKG_INSTALLATION_ROOT/vcpkg" install angle:x64-windows
mkdir -p src-tauri/lib
cp "$VCPKG_INSTALLATION_ROOT/installed/x64-windows/bin/libEGL.dll" src-tauri/lib/
cp "$VCPKG_INSTALLATION_ROOT/installed/x64-windows/bin/libGLESv2.dll" src-tauri/lib/
- name: npm install
run: npm ci
- name: Build Tauri (Windows installer)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
FLUXA_TRAKT_CLIENT_ID: ${{ secrets.FLUXA_TRAKT_CLIENT_ID }}
FLUXA_TRAKT_CLIENT_SECRET: ${{ secrets.FLUXA_TRAKT_CLIENT_SECRET }}
FLUXA_MAL_CLIENT_ID: ${{ secrets.FLUXA_MAL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_ID: ${{ secrets.FLUXA_SIMKL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_SECRET: ${{ secrets.FLUXA_SIMKL_CLIENT_SECRET }}
FLUXA_NUVIO_SUPABASE_URL: ${{ secrets.FLUXA_NUVIO_SUPABASE_URL }}
FLUXA_NUVIO_SUPABASE_KEY: ${{ secrets.FLUXA_NUVIO_SUPABASE_KEY }}
with:
tagName: ${{ github.ref_name }}
releaseName: "Fluxa Desktop ${{ github.ref_name }}"
releaseDraft: true
args: --target x86_64-pc-windows-msvc
# libmpv comes prebuilt from KhooLy/mpv, already dylibbundler'd.
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: FluxaMedia/fluxa-core
path: fluxa-core
- name: Link sibling repos
run: ln -sfn "$GITHUB_WORKSPACE/fluxa-core" "$(dirname "$GITHUB_WORKSPACE")/fluxa-core"
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- name: Set up Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
targets: aarch64-apple-darwin,x86_64-apple-darwin
- name: Cache Rust build
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Fetch libmpv (KhooLy/mpv gpu-next fork)
run: ./src-tauri/fetch-libmpv.sh
- name: npm install
run: npm ci
- name: Build Tauri (macOS DMG — universal binary)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
FLUXA_TRAKT_CLIENT_ID: ${{ secrets.FLUXA_TRAKT_CLIENT_ID }}
FLUXA_TRAKT_CLIENT_SECRET: ${{ secrets.FLUXA_TRAKT_CLIENT_SECRET }}
FLUXA_MAL_CLIENT_ID: ${{ secrets.FLUXA_MAL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_ID: ${{ secrets.FLUXA_SIMKL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_SECRET: ${{ secrets.FLUXA_SIMKL_CLIENT_SECRET }}
FLUXA_NUVIO_SUPABASE_URL: ${{ secrets.FLUXA_NUVIO_SUPABASE_URL }}
FLUXA_NUVIO_SUPABASE_KEY: ${{ secrets.FLUXA_NUVIO_SUPABASE_KEY }}
with:
tagName: ${{ github.ref_name }}
releaseName: "Fluxa Desktop ${{ github.ref_name }}"
releaseDraft: true
args: --target universal-apple-darwin
# libmpv comes prebuilt from KhooLy/mpv (built on ubuntu-24.04, must match).
build-linux:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: FluxaMedia/fluxa-core
path: fluxa-core
- name: Link sibling repos
run: ln -sfn "$GITHUB_WORKSPACE/fluxa-core" "$(dirname "$GITHUB_WORKSPACE")/fluxa-core"
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: npm
- name: Set up Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_VERSION }}
- name: Cache Rust build
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
# cached under $HOME, not /var/cache/apt/archives, to avoid root-owned dir
- name: Cache apt packages
uses: actions/cache@v4
with:
path: ~/.apt-cache
key: apt-noble-v2-${{ hashFiles('.github/workflows/build.yml') }}
restore-keys: apt-noble-v2-
- name: Install system dependencies
run: |
sudo sed -i 's|mirror://mirrors.ubuntu.com/mirrors.txt|http://archive.ubuntu.com/ubuntu/|; s|mirror+file:/etc/apt/apt-mirrors.txt|http://archive.ubuntu.com/ubuntu/|' /etc/apt/sources.list.d/ubuntu.sources
mkdir -p ~/.apt-cache
sudo apt-get update
sudo apt-get -o Dir::Cache::Archives="$HOME/.apt-cache" install -y \
libavcodec-dev libavformat-dev libavutil-dev \
libswscale-dev libswresample-dev libavfilter-dev \
libass9 libplacebo-dev \
pkg-config \
libwebkit2gtk-4.1-dev libgtk-3-dev \
libayatana-appindicator3-dev librsvg2-dev \
patchelf
sudo chown -R "$(id -u):$(id -g)" ~/.apt-cache
- name: Fetch libmpv (KhooLy/mpv gpu-next fork)
run: ./src-tauri/fetch-libmpv.sh
- name: Verify libmpv.so is intact
run: |
ldd src-tauri/lib/libmpv.so.2 | grep 'not found' && exit 1 || true
echo "OK: all libmpv deps resolvable on this runner"
- name: npm install
run: npm ci
- name: Build Tauri (AppImage + deb)
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
FLUXA_TRAKT_CLIENT_ID: ${{ secrets.FLUXA_TRAKT_CLIENT_ID }}
FLUXA_TRAKT_CLIENT_SECRET: ${{ secrets.FLUXA_TRAKT_CLIENT_SECRET }}
FLUXA_MAL_CLIENT_ID: ${{ secrets.FLUXA_MAL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_ID: ${{ secrets.FLUXA_SIMKL_CLIENT_ID }}
FLUXA_SIMKL_CLIENT_SECRET: ${{ secrets.FLUXA_SIMKL_CLIENT_SECRET }}
FLUXA_NUVIO_SUPABASE_URL: ${{ secrets.FLUXA_NUVIO_SUPABASE_URL }}
FLUXA_NUVIO_SUPABASE_KEY: ${{ secrets.FLUXA_NUVIO_SUPABASE_KEY }}
with:
tagName: ${{ github.ref_name }}
releaseName: "Fluxa Desktop ${{ github.ref_name }}"
releaseDraft: true
args: --target x86_64-unknown-linux-gnu
- name: Strip bundled GTK/WebKit2GTK from the AppImage
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
APPIMAGE="$(realpath "$(find src-tauri/target/x86_64-unknown-linux-gnu/release/bundle/appimage -maxdepth 1 -iname '*.AppImage' | head -n1)")"
chmod +x "$APPIMAGE"
WORKDIR="$(mktemp -d)"
(cd "$WORKDIR" && "$APPIMAGE" --appimage-extract >/dev/null)
find "$WORKDIR/squashfs-root/usr/lib" -maxdepth 1 -iname '*.so*' -delete
rm -rf "$WORKDIR/squashfs-root/usr/lib/x86_64-linux-gnu"
PLUGIN="$HOME/.cache/tauri/linuxdeploy-plugin-appimage.AppImage"
if [ ! -f "$PLUGIN" ]; then
curl -fL -o "$PLUGIN" "https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-x86_64.AppImage"
chmod +x "$PLUGIN"
fi
STRIPPED="$WORKDIR/$(basename "$APPIMAGE")"
OUTPUT="$STRIPPED" "$PLUGIN" --appdir="$WORKDIR/squashfs-root"
mv "$STRIPPED" "$APPIMAGE"
rm -rf "$WORKDIR"
gh release upload "${{ github.ref_name }}" "$APPIMAGE" --clobber
publish-release:
needs: [build-windows, build-macos, build-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
- name: Build release notes from commits
run: |
PREV_TAG="$(git describe --tags --abbrev=0 "${{ github.ref_name }}^" 2>/dev/null || true)"
RANGE="${PREV_TAG:+$PREV_TAG..}${{ github.ref_name }}"
REPO_URL="https://github.com/${{ github.repository }}"
: > notes.md
git log "$RANGE" --pretty=format:"%h%x09%s" | while IFS=$'\t' read -r hash subject; do
clean="$(sed -E 's/^[a-zA-Z]+(\([^)]*\))?: //; s/^(.)/\U\1/' <<< "$subject")"
echo "- $clean ([$hash]($REPO_URL/commit/$hash))" >> notes.md
done
- run: gh release edit "${{ github.ref_name }}" --draft=false --notes-file notes.md --repo "${{ github.repository }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}