scythe/.github/workflows/release.yml
spearzificial 0a406ba154 fix(packaging): correct runtime dependencies and drop the retired GTK deps
The Debian package declared libgtk-3-0 and libgtk-layer-shell0, which
belonged to the retired GTK backend, and omitted FFmpeg entirely. The
binary links libavcodec, libavformat, libavutil, libswresample and
libswscale directly, so a clean machine would have installed the package
and then failed to start it. The dependency list is now taken from the
dynamic section of the actual build output: libavcodec60,
libavformat60, libavutil58, libswresample4, libswscale7,
libpipewire-0.3-0, libxcb1, libasound2 and libva2.

XCB needs no extra package. The xcb crate marshals the SHM protocol in
Rust, so only libxcb.so.1 is linked and there is no libxcb-shm.so.0
load at runtime.

The RPM spec still said version 0.1.0 and required gtk3 and
gtk-layer-shell. It now tracks the Cargo.toml version, drops the GTK
packages, and adds the VAAPI, ALSA and XCB requirements it actually
needs.

The AUR PKGBUILD installed target/release/scythe-daemon and
target/release/scythe-ui, which no longer exist as build targets, so
any AUR build would have failed at the install step. It now installs the
single unified binary and points the compatibility names at it.

MSYS2 no longer installs gtk3 for the Windows build.
2026-10-21 16:50:06 +05:30

209 lines
7.9 KiB
YAML

name: Release & Packaging
on:
push:
tags:
- 'v*'
workflow_dispatch:
permissions:
contents: write
jobs:
build-linux:
name: Build Linux Packages (.tar.gz, .deb, .rpm, .AppImage)
runs-on: ubuntu-24.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install System Dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
pkg-config clang libva-dev \
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev \
libavfilter-dev libavdevice-dev \
libpipewire-0.3-dev libgtk-3-dev libgtk-layer-shell-dev libxcb1-dev libasound2-dev \
rpm alien wget
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Build Release Binaries
run: cargo build --release
- name: Package Linux Tarball (Unified Binary)
run: |
mkdir -p dist/scythe-linux-x86_64
cp target/release/scythe dist/scythe-linux-x86_64/
ln -sf scythe dist/scythe-linux-x86_64/scythe-daemon
ln -sf scythe dist/scythe-linux-x86_64/scythe-ui
ln -sf scythe dist/scythe-linux-x86_64/vrec-daemon
ln -sf scythe dist/scythe-linux-x86_64/vrec-ui
ln -sf scythe dist/scythe-linux-x86_64/vrec
cp packaging/scythe.desktop dist/scythe-linux-x86_64/
tar -czvf dist/scythe-linux-x86_64.tar.gz -C dist scythe-linux-x86_64
- name: Build Debian Package (.deb)
run: |
VERSION="${GITHUB_REF_NAME#v}"
if [ -z "$VERSION" ] || [ "$VERSION" = "main" ]; then
VERSION=$(grep '^version' Cargo.toml | head -n1 | cut -d '"' -f2)
fi
echo "Packaging Debian version: ${VERSION}"
mkdir -p "deb/scythe_${VERSION}/DEBIAN" "deb/scythe_${VERSION}/usr/bin" "deb/scythe_${VERSION}/usr/share/applications"
cat > "deb/scythe_${VERSION}/DEBIAN/control" << EOF
Package: scythe
Provides: vrec
Version: ${VERSION}
Section: video
Priority: optional
Architecture: amd64
Maintainer: oiupoyt
Description: High-performance GPU hardware screen recorder and instant replay overlay
Depends: libavcodec60, libavformat60, libavutil58, libswresample4, libswscale7, libpipewire-0.3-0, libxcb1, libasound2, libva2
EOF
cp target/release/scythe "deb/scythe_${VERSION}/usr/bin/scythe"
ln -sf scythe "deb/scythe_${VERSION}/usr/bin/scythe-daemon"
ln -sf scythe "deb/scythe_${VERSION}/usr/bin/scythe-ui"
ln -sf scythe "deb/scythe_${VERSION}/usr/bin/vrec-daemon"
ln -sf scythe "deb/scythe_${VERSION}/usr/bin/vrec-ui"
ln -sf scythe "deb/scythe_${VERSION}/usr/bin/vrec"
cp packaging/scythe.desktop "deb/scythe_${VERSION}/usr/share/applications/"
dpkg-deb --build "deb/scythe_${VERSION}" "dist/scythe_${VERSION}_amd64.deb"
- name: Build RPM Package (.rpm)
run: |
DEB_FILE=$(ls dist/*.deb | head -n 1)
alien --to-rpm --scripts "$DEB_FILE"
mv *.rpm dist/
- name: Package Standalone AppImage
run: |
mkdir -p AppDir/usr/bin AppDir/usr/share/applications AppDir/usr/share/icons/hicolor/scalable/apps
cp target/release/scythe AppDir/usr/bin/
ln -sf scythe AppDir/usr/bin/scythe-ui
ln -sf scythe AppDir/usr/bin/scythe-daemon
ln -sf scythe AppDir/usr/bin/vrec-ui
ln -sf scythe AppDir/usr/bin/vrec-daemon
ln -sf scythe AppDir/usr/bin/vrec
cp packaging/scythe.desktop AppDir/usr/share/applications/
cat > AppDir/AppRun << 'EOF'
#!/bin/sh
HERE="$(dirname "$(readlink -f "${0}")")"
exec "${HERE}/usr/bin/scythe" "$@"
EOF
chmod +x AppDir/AppRun
touch AppDir/usr/share/icons/hicolor/scalable/apps/media-record.svg
touch AppDir/media-record.svg
ln -s usr/share/applications/scythe.desktop AppDir/scythe.desktop
wget -q https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool
chmod +x appimagetool
./appimagetool --appimage-extract-and-run AppDir dist/scythe-x86_64.AppImage || true
- name: Upload Linux Artifacts
uses: actions/upload-artifact@v4
with:
name: linux-packages
path: dist/*
build-windows:
name: Build Windows Binaries (.exe)
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
update: true
path-type: minimal
install: >-
mingw-w64-x86_64-toolchain
mingw-w64-x86_64-rust
mingw-w64-x86_64-ffmpeg
mingw-w64-x86_64-pkg-config
mingw-w64-x86_64-clang
mingw-w64-x86_64-ntldd
python3
- name: Build Release Binaries (Windows)
shell: msys2 {0}
env:
LIBCLANG_PATH: /mingw64/bin
BINDGEN_EXTRA_CLANG_ARGS: "--target=x86_64-w64-windows-gnu"
run: |
cargo build --release
mkdir -p dist/bundle
cp target/release/scythe.exe dist/bundle/
python3 packaging/windows/bundle_deps.py dist/bundle
strip dist/bundle/*.exe || true
strip --strip-unneeded dist/bundle/*.dll || true
- name: Package Windows Standalone (.exe), Installer, and Zip
shell: pwsh
run: |
if (!(Get-Command makensis -ErrorAction SilentlyContinue)) {
if (Test-Path "C:\Program Files (x86)\NSIS\makensis.exe") {
$env:Path += ";C:\Program Files (x86)\NSIS"
} else {
choco install nsis -y --no-progress
$env:Path += ";C:\Program Files (x86)\NSIS"
}
}
makensis packaging/windows/scythe-installer.nsi
makensis packaging/windows/scythe-standalone.nsi
Compress-Archive -Path dist/bundle/* -DestinationPath dist/scythe-windows-x86_64.zip -Force
- name: Upload Windows Artifacts
uses: actions/upload-artifact@v4
with:
name: windows-packages
path: |
dist/scythe-setup.exe
dist/scythe.exe
dist/scythe-windows-x86_64.zip
publish-release:
name: Publish GitHub Release
needs: [build-linux, build-windows]
if: always() && !cancelled() && (needs.build-linux.result == 'success' || needs.build-windows.result == 'success')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download all built artifacts
uses: actions/download-artifact@v4
continue-on-error: true
with:
path: artifacts
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: "Scythe ${{ github.ref_name }}"
body: |
High-performance GPU hardware screen recorder and instant replay overlay for Linux and Windows.
### Packages
- **Windows**: `scythe-setup.exe` (Official installer with Start Menu & Desktop shortcuts)
- **Windows Portable**: `scythe.exe` (Standalone portable launcher)
- **Windows Archive**: `scythe-windows-x86_64.zip` (Portable zip archive)
- **Universal Linux**: `scythe-x86_64.AppImage`
- **Debian / Ubuntu / Mint**: `scythe_*_amd64.deb`
- **Fedora / RHEL / openSUSE**: `*.rpm`
- **Generic Linux**: `scythe-linux-x86_64.tar.gz`
files: |
artifacts/linux-packages/*
artifacts/windows-packages/*
draft: false
prerelease: false
generate_release_notes: false