mirror of
https://github.com/arabianq/pipewire-soundpad.git
synced 2026-07-26 13:56:57 +00:00
ci: refactor and optimize GitHub Actions workflows (#146)
* ci: refactor and optimize GitHub Actions workflows\n\n- **Consolidate build processes (`build.yml`, `release.yml`)**: Merged the standalone `.zip` (linux-build) and `.deb` (deb-build) jobs into a single matrix job (`build-and-package` / `build-release`).
This prevents compiling the Rust binaries twice per architecture, effectively cutting the build time in half and saving CI runner minutes.
- **Parallelize and fix Flatpak deployment (`flatter.yml`)**:
- Converted `x86_64` and `aarch64` flatpak jobs to run concurrently via a matrix strategy, removing the sequential bottleneck.
- Resolved an issue where GitHub Pages would only host the `aarch64` repository. Introduced a new `prepare-repo` job that downloads the `.flatpak` bundles from both architectures, merges them into a
single OSTree repository locally, signs it with GPG, and deploys the unified multi-arch repository to GitHub Pages.
- Configured `flatter.yml` to automatically attach the offline `.flatpak` bundles to GitHub Releases when triggered by a release event.
- **Toolchain and cleanup**: Switched hardcoded Rust toolchain version (`1.96.0`) to `stable` across all workflows to prevent manual bumps in the future. Simplified bash scripts and removed redundant
dependency installation steps.
* Extract Copr trigger into a separate job: Copr build now starts immediately in parallel with GitHub Actions builds, eliminating unnecessary waiting time.
* use ubuntu 22.04 to build binaries instead of ubuntu-latest
* fix cache poisoning
* another attemp to fix cache poisoning
* disable cache in setup-rust-toolchain
* use ubuntu-latest
* optimize dependencies in debug profile
* remove --release flag from build.yml and CARGO env vars
* fix flatter names collision
* better flatter key changing
* auto formatting
* add auto updating cargo-sources for dependabot pull requests
* add groups to dependabot.yml
* add github-actions to dependabot
* add ppa deb repo
* add concurrency: gh-pages-deploy
This commit is contained in:
@@ -1,6 +1,29 @@
|
|||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
|
||||||
- package-ecosystem: "cargo"
|
- package-ecosystem: "cargo"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
|
groups:
|
||||||
|
egui-stack:
|
||||||
|
patterns:
|
||||||
|
- "egui*"
|
||||||
|
- "eframe"
|
||||||
|
|
||||||
|
serde-stack:
|
||||||
|
patterns:
|
||||||
|
- "serde*"
|
||||||
|
|
||||||
|
tokio-stack:
|
||||||
|
patterns:
|
||||||
|
- "tokio*"
|
||||||
|
- "reqwest"
|
||||||
|
|
||||||
|
clap-stack:
|
||||||
|
patterns:
|
||||||
|
- "clap*"
|
||||||
|
|||||||
+13
-68
@@ -12,7 +12,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux-build:
|
build-and-package:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
@@ -43,22 +43,19 @@ jobs:
|
|||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: 1.96.0
|
toolchain: stable
|
||||||
|
cache: false
|
||||||
|
|
||||||
- name: Rust Cache
|
- name: Rust Cache
|
||||||
uses: swatinem/rust-cache@v2
|
uses: swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
prefix-key: "v3-${{ matrix.runner }}"
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: cargo test --locked
|
run: cargo test --locked
|
||||||
|
|
||||||
- name: Build all binaries (debug-speed compilation into target/release)
|
- name: Build all binaries
|
||||||
env:
|
run: cargo build --locked
|
||||||
CARGO_PROFILE_RELEASE_OPT_LEVEL: 0
|
|
||||||
CARGO_PROFILE_RELEASE_DEBUG: "true"
|
|
||||||
CARGO_PROFILE_RELEASE_STRIP: "false"
|
|
||||||
CARGO_PROFILE_RELEASE_LTO: "false"
|
|
||||||
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 256
|
|
||||||
run: cargo build --release --locked
|
|
||||||
|
|
||||||
- name: Extract all binary names
|
- name: Extract all binary names
|
||||||
id: cargo-meta
|
id: cargo-meta
|
||||||
@@ -70,7 +67,7 @@ jobs:
|
|||||||
echo "$BIN_NAMES" >> $GITHUB_OUTPUT
|
echo "$BIN_NAMES" >> $GITHUB_OUTPUT
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Package all binaries into one archive
|
- name: Package ZIP archive
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -81,7 +78,7 @@ jobs:
|
|||||||
FILES=()
|
FILES=()
|
||||||
while IFS= read -r BIN; do
|
while IFS= read -r BIN; do
|
||||||
[ -z "$BIN" ] && continue
|
[ -z "$BIN" ] && continue
|
||||||
FILES+=("target/release/$BIN")
|
FILES+=("target/debug/$BIN")
|
||||||
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
|
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
|
||||||
|
|
||||||
if [ "${#FILES[@]}" -eq 0 ]; then
|
if [ "${#FILES[@]}" -eq 0 ]; then
|
||||||
@@ -89,67 +86,15 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for f in "${FILES[@]}"; do
|
|
||||||
if [ ! -f "$f" ]; then
|
|
||||||
echo "Error: expected binary not found: $f" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Will add: $f"
|
|
||||||
done
|
|
||||||
|
|
||||||
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
|
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
|
||||||
|
|
||||||
- name: Upload archive as artifact
|
- name: Upload ZIP artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: archive-${{ matrix.arch }}
|
name: archive-${{ matrix.arch }}
|
||||||
path: pwsp-*.zip
|
path: pwsp-*.zip
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
|
|
||||||
deb-build:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: x64
|
|
||||||
runner: ubuntu-latest
|
|
||||||
- arch: arm64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
fail-fast: false
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install apt deps (dev-libs)
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
libpipewire-0.3-dev \
|
|
||||||
libclang-dev \
|
|
||||||
libasound2-dev \
|
|
||||||
libdbus-1-dev \
|
|
||||||
pkg-config
|
|
||||||
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: 1.96.0
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: swatinem/rust-cache@v2
|
|
||||||
|
|
||||||
- name: Build all binaries (debug-speed compilation into target/release)
|
|
||||||
env:
|
|
||||||
CARGO_PROFILE_RELEASE_OPT_LEVEL: 0
|
|
||||||
CARGO_PROFILE_RELEASE_DEBUG: "true"
|
|
||||||
CARGO_PROFILE_RELEASE_STRIP: "false"
|
|
||||||
CARGO_PROFILE_RELEASE_LTO: "false"
|
|
||||||
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 256
|
|
||||||
run: cargo build --release --locked
|
|
||||||
|
|
||||||
- name: Cache cargo-deb
|
- name: Cache cargo-deb
|
||||||
id: cache-cargo-deb
|
id: cache-cargo-deb
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -161,14 +106,14 @@ jobs:
|
|||||||
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
|
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
|
||||||
run: cargo install --locked cargo-deb
|
run: cargo install --locked cargo-deb
|
||||||
|
|
||||||
- name: Create .deb package (debug binaries from target/release)
|
- name: Create .deb package
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
export PATH="$HOME/.cargo/bin:$PATH"
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
cargo-deb -p pwsp-gui --no-build --no-strip
|
cargo-deb -p pwsp-gui --no-build --no-strip --profile dev
|
||||||
|
|
||||||
- name: Upload .deb(s) as artifacts
|
- name: Upload .deb artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: deb-packages-${{ matrix.arch }}
|
name: deb-packages-${{ matrix.arch }}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: Dependabot Flatpak Cargo Sources
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
paths:
|
||||||
|
- "Cargo.lock"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-cargo-sources:
|
||||||
|
if: github.actor == 'dependabot[bot]'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # Needed to push back to the branch
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.head_ref }}
|
||||||
|
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip install aiohttp toml
|
||||||
|
|
||||||
|
- name: Generate cargo-sources.json
|
||||||
|
run: bash ./scripts/generate-sources.sh
|
||||||
|
|
||||||
|
- name: Commit and push changes
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
commit_message: "chore(flatpak): automatically update cargo-sources.json"
|
||||||
|
file_pattern: "packages/flatpak/cargo-sources.json"
|
||||||
@@ -21,9 +21,17 @@ on:
|
|||||||
default: "stable"
|
default: "stable"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
flatter-x64:
|
build-flatpak:
|
||||||
name: Flatter (x86_64)
|
name: Build Flatpak (${{ matrix.arch }})
|
||||||
runs-on: ubuntu-latest
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86_64
|
||||||
|
runner: ubuntu-latest
|
||||||
|
- arch: aarch64
|
||||||
|
runner: ubuntu-24.04-arm
|
||||||
|
fail-fast: false
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
container:
|
container:
|
||||||
@@ -56,6 +64,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Modify Manifest
|
- name: Modify Manifest
|
||||||
run: |
|
run: |
|
||||||
|
sed -i '/^branch:/d' packages/flatpak/ru.arabianq.pwsp.yaml
|
||||||
|
sed -i '/^default-branch:/d' packages/flatpak/ru.arabianq.pwsp.yaml
|
||||||
echo "branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
echo "branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
||||||
echo "default-branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
echo "default-branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
||||||
|
|
||||||
@@ -69,26 +79,28 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
files: packages/flatpak/ru.arabianq.pwsp.yaml
|
files: packages/flatpak/ru.arabianq.pwsp.yaml
|
||||||
gpg-sign: ${{ steps.gpg.outputs.fingerprint }}
|
gpg-sign: ${{ steps.gpg.outputs.fingerprint }}
|
||||||
upload-bundles: false
|
upload-bundles: true
|
||||||
upload-pages-artifact: false
|
upload-pages-artifact: false
|
||||||
arch: x86_64
|
arch: ${{ matrix.arch }}
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
flatter-arm64:
|
prepare-repo:
|
||||||
name: Flatter (aarch64)
|
name: Prepare OSTree Repo
|
||||||
needs: flatter-x64
|
needs: build-flatpak
|
||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
concurrency: gh-pages-deploy
|
||||||
contents: read
|
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/andyholmes/flatter/freedesktop:25.08
|
image: ghcr.io/andyholmes/flatter/freedesktop:25.08
|
||||||
options: --privileged
|
options: --privileged
|
||||||
|
permissions:
|
||||||
|
contents: write # Needed to upload files to GitHub Release
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Download Flatpak Bundles
|
||||||
uses: actions/checkout@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ inputs.tag_name || github.ref }}
|
path: bundles
|
||||||
|
pattern: flatpak-bundle-*
|
||||||
|
|
||||||
- name: Setup GPG
|
- name: Setup GPG
|
||||||
id: gpg
|
id: gpg
|
||||||
@@ -97,49 +109,40 @@ jobs:
|
|||||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||||
|
|
||||||
- name: Set Default Branch
|
- name: Create OSTree Repo and Prepare Release Bundles
|
||||||
id: set_branch
|
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ github.event_name }}" == "release" ]; then
|
mkdir -p pages-repo release-bundles
|
||||||
echo "branch=stable" >> $GITHUB_OUTPUT
|
ostree init --mode=archive-z2 --repo=pages-repo
|
||||||
elif [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
|
||||||
echo "branch=${{ inputs.build_branch }}" >> $GITHUB_OUTPUT
|
for dir in bundles/flatpak-bundle-*; do
|
||||||
else
|
arch=$(basename "$dir" | sed 's/flatpak-bundle-//')
|
||||||
echo "branch=nightly" >> $GITHUB_OUTPUT
|
|
||||||
|
# Find the flatpak file inside the dir
|
||||||
|
bundle=$(find "$dir" -name "*.flatpak" | head -n 1)
|
||||||
|
|
||||||
|
if [ -n "$bundle" ]; then
|
||||||
|
echo "Importing $bundle for architecture $arch..."
|
||||||
|
flatpak build-import-bundle pages-repo "$bundle"
|
||||||
|
|
||||||
|
# Copy with a unique name for GitHub Release
|
||||||
|
cp "$bundle" "release-bundles/ru.arabianq.pwsp-${arch}.flatpak"
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
- name: Modify Manifest
|
# Update summary and sign the repository
|
||||||
run: |
|
flatpak build-update-repo --generate-static-deltas --gpg-sign=${{ steps.gpg.outputs.fingerprint }} pages-repo
|
||||||
echo "branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
|
||||||
echo "default-branch: ${{ steps.set_branch.outputs.branch }}" >> packages/flatpak/ru.arabianq.pwsp.yaml
|
|
||||||
|
|
||||||
- name: Install SDK Extensions
|
- name: Deploy Flatpak Repo to GitHub Pages
|
||||||
run: |
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
flatpak install -y flathub org.freedesktop.Sdk.Extension.rust-stable//25.08
|
|
||||||
flatpak install -y flathub org.freedesktop.Sdk.Extension.llvm20//25.08
|
|
||||||
|
|
||||||
- name: Build Flatpak
|
|
||||||
uses: andyholmes/flatter@main
|
|
||||||
with:
|
with:
|
||||||
files: packages/flatpak/ru.arabianq.pwsp.yaml
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
gpg-sign: ${{ steps.gpg.outputs.fingerprint }}
|
publish_dir: ./pages-repo
|
||||||
upload-bundles: false
|
destination_dir: .
|
||||||
upload-pages-artifact: true
|
keep_files: true
|
||||||
arch: aarch64
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
deploy:
|
- name: Upload bundles to GitHub Release
|
||||||
name: Deploy to GitHub Pages
|
if: github.event_name == 'release'
|
||||||
runs-on: ubuntu-latest
|
uses: softprops/action-gh-release@v2
|
||||||
needs: flatter-arm64
|
with:
|
||||||
permissions:
|
files: release-bundles/*.flatpak
|
||||||
pages: write
|
tag_name: ${{ github.event.release.tag_name }}
|
||||||
id-token: write
|
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: GitHub Pages
|
|
||||||
id: deployment
|
|
||||||
uses: actions/deploy-pages@v4
|
|
||||||
|
|||||||
+99
-106
@@ -23,46 +23,32 @@ jobs:
|
|||||||
id: tag
|
id: tag
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
INPUT_TAG="${{ github.event.inputs.tag || '' }}"
|
INPUT_TAG="${{ github.event.inputs.tag || '' }}"
|
||||||
if [ -n "$INPUT_TAG" ]; then
|
|
||||||
echo "Using input tag: $INPUT_TAG"
|
|
||||||
echo "tag=$INPUT_TAG" >> $GITHUB_OUTPUT
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
EVENT_TAG="${{ github.event.release.tag_name || '' }}"
|
EVENT_TAG="${{ github.event.release.tag_name || '' }}"
|
||||||
if [ -n "$EVENT_TAG" ]; then
|
|
||||||
echo "Using event tag: $EVENT_TAG"
|
if [ -n "$INPUT_TAG" ]; then
|
||||||
|
echo "tag=$INPUT_TAG" >> $GITHUB_OUTPUT
|
||||||
|
elif [ -n "$EVENT_TAG" ]; then
|
||||||
echo "tag=$EVENT_TAG" >> $GITHUB_OUTPUT
|
echo "tag=$EVENT_TAG" >> $GITHUB_OUTPUT
|
||||||
exit 0
|
elif [[ "${GITHUB_REF:-}" =~ ^refs/tags/(.+)$ ]]; then
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${GITHUB_REF:-}" =~ ^refs/tags/(.+)$ ]]; then
|
|
||||||
echo "Using GITHUB_REF tag: ${BASH_REMATCH[1]}"
|
|
||||||
echo "tag=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
|
echo "tag=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
|
||||||
exit 0
|
else
|
||||||
fi
|
|
||||||
|
|
||||||
echo "No tag in input/event/GITHUB_REF — querying latest release via API..."
|
|
||||||
LATEST_JSON=$(curl -sSf -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${{ github.repository }}/releases/latest" || true)
|
LATEST_JSON=$(curl -sSf -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${{ github.repository }}/releases/latest" || true)
|
||||||
TAG_NAME=$(echo "$LATEST_JSON" | jq -r '.tag_name // empty')
|
TAG_NAME=$(echo "$LATEST_JSON" | jq -r '.tag_name // empty')
|
||||||
if [ -n "$TAG_NAME" ]; then
|
if [ -n "$TAG_NAME" ]; then
|
||||||
echo "Found latest release tag: $TAG_NAME"
|
|
||||||
echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT
|
echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT
|
||||||
exit 0
|
else
|
||||||
fi
|
|
||||||
|
|
||||||
echo "No tag found"
|
|
||||||
echo "tag=" >> $GITHUB_OUTPUT
|
echo "tag=" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Fail if no tag determined
|
- name: Fail if no tag determined
|
||||||
if: ${{ steps.tag.outputs.tag == '' }}
|
if: ${{ steps.tag.outputs.tag == '' }}
|
||||||
run: |
|
run: |
|
||||||
echo "ERROR: No tag determined. Provide a tag when running manually or ensure a release exists."
|
echo "ERROR: No tag determined."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
linux-release:
|
build-release:
|
||||||
needs: prepare
|
needs: prepare
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -75,7 +61,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install apt deps (jq/zip + dev-libs)
|
- name: Install apt deps
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y \
|
sudo apt-get install -y \
|
||||||
@@ -95,10 +81,13 @@ jobs:
|
|||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: 1.96.0
|
toolchain: stable
|
||||||
|
cache: false
|
||||||
|
|
||||||
- name: Rust Cache
|
- name: Rust Cache
|
||||||
uses: swatinem/rust-cache@v2
|
uses: swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
prefix-key: "v3-${{ matrix.runner }}"
|
||||||
|
|
||||||
- name: Extract all binary names
|
- name: Extract all binary names
|
||||||
id: cargo-meta
|
id: cargo-meta
|
||||||
@@ -113,13 +102,12 @@ jobs:
|
|||||||
- name: Build all release binaries
|
- name: Build all release binaries
|
||||||
run: cargo build --release --locked
|
run: cargo build --release --locked
|
||||||
|
|
||||||
- name: Package all binaries into one archive
|
- name: Package ZIP archive
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
TAG="${{ needs.prepare.outputs.tag }}"
|
TAG="${{ needs.prepare.outputs.tag }}"
|
||||||
ARCHIVE_NAME="pwsp-${TAG}-linux-${{ matrix.arch }}.zip"
|
ARCHIVE_NAME="pwsp-${TAG}-linux-${{ matrix.arch }}.zip"
|
||||||
echo "Creating archive: $ARCHIVE_NAME"
|
|
||||||
|
|
||||||
FILES=()
|
FILES=()
|
||||||
while IFS= read -r BIN; do
|
while IFS= read -r BIN; do
|
||||||
@@ -127,68 +115,15 @@ jobs:
|
|||||||
FILES+=("target/release/$BIN")
|
FILES+=("target/release/$BIN")
|
||||||
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
|
done <<< "${{ steps.cargo-meta.outputs.bin_names }}"
|
||||||
|
|
||||||
if [ "${#FILES[@]}" -eq 0 ]; then
|
|
||||||
echo "Error: no binaries were discovered via cargo metadata." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for f in "${FILES[@]}"; do
|
|
||||||
if [ ! -f "$f" ]; then
|
|
||||||
echo "Error: expected binary not found: $f" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Will add: $f"
|
|
||||||
done
|
|
||||||
|
|
||||||
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
|
zip -j "$ARCHIVE_NAME" "${FILES[@]}"
|
||||||
|
|
||||||
- name: Upload zip archive
|
- name: Upload ZIP artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: zip-archive-${{ matrix.arch }}
|
name: zip-archive-${{ matrix.arch }}
|
||||||
path: pwsp-*.zip
|
path: pwsp-*.zip
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
deb-release:
|
|
||||||
needs: prepare
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: x64
|
|
||||||
runner: ubuntu-latest
|
|
||||||
- arch: arm64
|
|
||||||
runner: ubuntu-24.04-arm
|
|
||||||
fail-fast: false
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install apt deps (dev-libs)
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
libpipewire-0.3-dev \
|
|
||||||
libclang-dev \
|
|
||||||
libasound2-dev \
|
|
||||||
libdbus-1-dev \
|
|
||||||
pkg-config
|
|
||||||
|
|
||||||
- name: Checkout code at tag
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: ${{ needs.prepare.outputs.tag }}
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: 1.96.0
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: swatinem/rust-cache@v2
|
|
||||||
|
|
||||||
- name: Build all release binaries
|
|
||||||
run: cargo build --release --locked
|
|
||||||
|
|
||||||
- name: Cache cargo-deb
|
- name: Cache cargo-deb
|
||||||
id: cache-cargo-deb
|
id: cache-cargo-deb
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -200,14 +135,14 @@ jobs:
|
|||||||
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
|
if: steps.cache-cargo-deb.outputs.cache-hit != 'true'
|
||||||
run: cargo install --locked cargo-deb
|
run: cargo install --locked cargo-deb
|
||||||
|
|
||||||
- name: Create .deb package (release binaries)
|
- name: Create .deb package
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
export PATH="$HOME/.cargo/bin:$PATH"
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
cargo-deb -p pwsp-gui --no-build
|
cargo-deb -p pwsp-gui --no-build
|
||||||
|
|
||||||
- name: Upload deb package
|
- name: Upload DEB artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: deb-package-${{ matrix.arch }}
|
name: deb-package-${{ matrix.arch }}
|
||||||
@@ -215,32 +150,14 @@ jobs:
|
|||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
publish-release:
|
publish-release:
|
||||||
needs: [prepare, linux-release, deb-release]
|
needs: [prepare, build-release]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Download zip archive (x64)
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: zip-archive-x64
|
|
||||||
path: ./dist
|
|
||||||
|
|
||||||
- name: Download zip archive (arm64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: zip-archive-arm64
|
|
||||||
path: ./dist
|
|
||||||
|
|
||||||
- name: Download deb package (x64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: deb-package-x64
|
|
||||||
path: ./dist
|
|
||||||
|
|
||||||
- name: Download deb package (arm64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: deb-package-arm64
|
|
||||||
path: ./dist
|
path: ./dist
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
- name: Upload artifacts to Release
|
- name: Upload artifacts to Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -251,6 +168,10 @@ jobs:
|
|||||||
./dist/pwsp-*.zip
|
./dist/pwsp-*.zip
|
||||||
./dist/*.deb
|
./dist/*.deb
|
||||||
|
|
||||||
|
trigger-copr:
|
||||||
|
needs: prepare
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
- name: Install copr-cli
|
- name: Install copr-cli
|
||||||
run: pip install copr-cli
|
run: pip install copr-cli
|
||||||
|
|
||||||
@@ -265,3 +186,75 @@ jobs:
|
|||||||
--commit ${{ needs.prepare.outputs.tag }} \
|
--commit ${{ needs.prepare.outputs.tag }} \
|
||||||
--spec packages/rpm/pwsp.spec \
|
--spec packages/rpm/pwsp.spec \
|
||||||
arabianq/pwsp
|
arabianq/pwsp
|
||||||
|
|
||||||
|
build-apt-repo:
|
||||||
|
needs: [prepare, build-release]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
concurrency: gh-pages-deploy
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup GPG
|
||||||
|
id: gpg
|
||||||
|
uses: crazy-max/ghaction-import-gpg@v6
|
||||||
|
with:
|
||||||
|
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
|
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||||
|
|
||||||
|
- name: Download DEB artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
pattern: deb-package-*
|
||||||
|
path: debs
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Checkout existing gh-pages
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: gh-pages
|
||||||
|
path: gh-pages-branch
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Generate APT Repository
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y reprepro
|
||||||
|
|
||||||
|
mkdir -p apt-repo/conf
|
||||||
|
|
||||||
|
cat <<EOF > apt-repo/conf/distributions
|
||||||
|
Origin: arabianq
|
||||||
|
Label: PipeWire Soundpad
|
||||||
|
Codename: stable
|
||||||
|
Architectures: amd64 arm64
|
||||||
|
Components: main
|
||||||
|
Description: APT Repository for PWSP
|
||||||
|
SignWith: ${{ steps.gpg.outputs.fingerprint }}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Export public key for users to download
|
||||||
|
gpg --armor --export ${{ steps.gpg.outputs.fingerprint }} > apt-repo/pubkey.gpg
|
||||||
|
|
||||||
|
if [ -d "gh-pages-branch/apt" ]; then
|
||||||
|
cp -r gh-pages-branch/apt/* apt-repo/ || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd apt-repo
|
||||||
|
|
||||||
|
for deb in ../debs/*.deb; do
|
||||||
|
if [ -f "$deb" ]; then
|
||||||
|
echo "Adding $deb to APT repository..."
|
||||||
|
reprepro includedeb stable "$deb"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Deploy APT Repo to GitHub Pages
|
||||||
|
uses: peaceiris/actions-gh-pages@v3
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_dir: ./apt-repo
|
||||||
|
destination_dir: apt
|
||||||
|
keep_files: true
|
||||||
|
|||||||
+6
-1
@@ -76,10 +76,15 @@ egui_dnd = "0.16.0"
|
|||||||
reqwest = "0.13.4"
|
reqwest = "0.13.4"
|
||||||
percent-encoding = "2.3.2"
|
percent-encoding = "2.3.2"
|
||||||
|
|
||||||
|
[profile.dev]
|
||||||
|
|
||||||
|
[profile.dev.package."*"]
|
||||||
|
opt-level = 3
|
||||||
|
debug = false
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
strip = true
|
strip = true
|
||||||
lto = true
|
lto = true
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
opt-level = "z"
|
opt-level = "z"
|
||||||
panic = "abort"
|
panic = "abort"
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,19 @@ paru -S pwsp-bin # or 'pwsp' to build from source
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Debian / Ubuntu:**
|
**Debian / Ubuntu:**
|
||||||
Download pre-built `.deb` packages or standalone binaries from the [Releases page](https://github.com/arabianq/pipewire-soundpad/releases).
|
We provide an official APT repository for automatic updates:
|
||||||
|
```bash
|
||||||
|
# 1. Download the public key
|
||||||
|
wget -O- https://arabianq.github.io/pipewire-soundpad/apt/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/pwsp.gpg
|
||||||
|
|
||||||
|
# 2. Add the repository to your sources
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/pwsp.gpg] https://arabianq.github.io/pipewire-soundpad/apt/ stable main" | sudo tee /etc/apt/sources.list.d/pwsp.list
|
||||||
|
|
||||||
|
# 3. Update and install
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install pwsp-gui
|
||||||
|
```
|
||||||
|
*(Alternatively, you can manually download `.deb` packages from the [Releases page](https://github.com/arabianq/pipewire-soundpad/releases)).*
|
||||||
|
|
||||||
### 🦀 Cargo / Source Build
|
### 🦀 Cargo / Source Build
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
Reference in New Issue
Block a user