mirror of
https://github.com/FluxaMedia/fluxa-desktop.git
synced 2026-08-05 16:28:55 +00:00
272 lines
10 KiB
YAML
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 }}
|