Skip to content

DirectPipe v4.0.4

DirectPipe v4.0.4 #30

Workflow file for this run

name: Build & Release
on:
pull_request:
branches: [v4, main]
release:
types: [created]
workflow_dispatch:
inputs:
release_tag:
description: 'Upload artifacts to this release tag (e.g., v4.0.0-alpha). Leave empty for CI-only.'
required: false
default: ''
env:
BUILD_TYPE: Release
jobs:
text-integrity:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Check UTF-8 text integrity
run: python tools/check_text_integrity.py --repo-root .
# ═══════════════════════════════════════════
# Windows — DirectPipe.exe + Receiver VST2/VST3
# ═══════════════════════════════════════════
build-windows:
needs: [text-integrity]
runs-on: windows-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
# Optional: restore proprietary SDKs from repository secrets
- name: Restore VST2 SDK
shell: bash
env:
VST2_SDK_B64: ${{ secrets.VST2_SDK_B64 }}
run: |
if [ -n "$VST2_SDK_B64" ]; then
mkdir -p thirdparty/VST2_SDK/pluginterfaces/vst2.x
echo "$VST2_SDK_B64" | base64 -d | tar xz -C thirdparty/VST2_SDK/
echo "✓ VST2 SDK restored"
else
echo "VST2 SDK secret not set — VST2 format skipped"
fi
- name: Restore ASIO SDK
shell: bash
env:
ASIO_SDK_B64: ${{ secrets.ASIO_SDK_B64 }}
run: |
if [ -n "$ASIO_SDK_B64" ]; then
mkdir -p thirdparty/asiosdk
echo "$ASIO_SDK_B64" | base64 -d | tar xz -C thirdparty/asiosdk/
echo "✓ ASIO SDK restored"
else
echo "ASIO SDK secret not set — ASIO driver disabled"
fi
- name: Configure CMake
run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build
run: cmake --build build --config Release
- name: Run Tests
run: cd build && ctest --output-on-failure --timeout 120 -C Release --timeout 120
- name: Package
shell: bash
run: |
mkdir -p staging
cp "build/host/DirectPipe_artefacts/Release/DirectPipe.exe" staging/
# Receiver VST3
if [ -d "build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST3" ]; then
cp -r build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST3/*.vst3 staging/ 2>/dev/null || true
fi
# Receiver VST2 (only if SDK was available)
if [ -d "build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST" ]; then
cp build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST/*.dll staging/ 2>/dev/null || true
fi
echo "=== Windows package contents ==="
ls -lh staging/
- name: Create ZIP
shell: bash
run: |
cd staging
7z a -tzip ../DirectPipe-win64.zip .
cd ..
ls -lh DirectPipe-win64.zip
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: DirectPipe-win64
path: DirectPipe-win64.zip
if-no-files-found: error
# ═══════════════════════════════════════════
# macOS — DirectPipe.app + Receiver VST2/VST3/AU (Universal Binary)
# ═══════════════════════════════════════════
build-macos:
needs: [text-integrity]
runs-on: macos-14
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- name: Restore VST2 SDK
env:
VST2_SDK_B64: ${{ secrets.VST2_SDK_B64 }}
run: |
if [ -n "$VST2_SDK_B64" ]; then
mkdir -p thirdparty/VST2_SDK/pluginterfaces/vst2.x
echo "$VST2_SDK_B64" | base64 -d | tar xz -C thirdparty/VST2_SDK/
echo "✓ VST2 SDK restored"
else
echo "VST2 SDK secret not set — VST2 format skipped"
fi
- name: Configure CMake
run: |
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations"
- name: Build
run: cmake --build build --config Release -j$(sysctl -n hw.ncpu)
- name: Run Tests
run: cd build && ctest --output-on-failure --timeout 120
- name: Package
run: |
mkdir -p staging
# DirectPipe.app (ditto preserves bundles, symlinks, resource forks)
ditto "build/host/DirectPipe_artefacts/Release/DirectPipe.app" "staging/DirectPipe.app"
# Receiver VST3
for f in build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST3/*.vst3; do
[ -e "$f" ] && ditto "$f" "staging/$(basename "$f")"
done
# Receiver VST2 (.vst bundle)
for f in build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST/*.vst; do
[ -e "$f" ] && ditto "$f" "staging/$(basename "$f")"
done
# Receiver AU (.component bundle)
for f in build/plugins/receiver/DirectPipeReceiver_artefacts/Release/AU/*.component; do
[ -e "$f" ] && ditto "$f" "staging/$(basename "$f")"
done
echo "=== macOS package contents ==="
ls -lhR staging/
- name: Create DMG
run: |
hdiutil create -volname "DirectPipe" \
-srcfolder staging \
-ov -format UDZO \
DirectPipe-macOS.dmg
ls -lh DirectPipe-macOS.dmg
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: DirectPipe-macOS
path: DirectPipe-macOS.dmg
if-no-files-found: error
# ═══════════════════════════════════════════
# Linux — DirectPipe + Receiver VST2/VST3
# ═══════════════════════════════════════════
build-linux:
needs: [text-integrity]
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libasound2-dev \
libjack-jackd2-dev \
libfreetype-dev \
libx11-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libgl-dev
- name: Restore VST2 SDK
env:
VST2_SDK_B64: ${{ secrets.VST2_SDK_B64 }}
run: |
if [ -n "$VST2_SDK_B64" ]; then
mkdir -p thirdparty/VST2_SDK/pluginterfaces/vst2.x
echo "$VST2_SDK_B64" | base64 -d | tar xz -C thirdparty/VST2_SDK/
echo "✓ VST2 SDK restored"
else
echo "VST2 SDK secret not set — VST2 format skipped"
fi
- name: Configure CMake
run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build
run: cmake --build build --config Release -j$(nproc)
- name: Run Tests
run: cd build && ctest --output-on-failure --timeout 120
- name: Package
run: |
mkdir -p staging
cp "build/host/DirectPipe_artefacts/Release/DirectPipe" staging/
chmod +x staging/DirectPipe
# Receiver VST3
cp -r build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST3/*.vst3 staging/ 2>/dev/null || true
# Receiver VST2 (.so)
cp build/plugins/receiver/DirectPipeReceiver_artefacts/Release/VST/*.so staging/ 2>/dev/null || true
echo "=== Linux package contents ==="
ls -lh staging/
- name: Create tar.gz
run: |
cd staging
tar czf ../DirectPipe-linux-x64.tar.gz .
cd ..
ls -lh DirectPipe-linux-x64.tar.gz
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: DirectPipe-linux-x64
path: DirectPipe-linux-x64.tar.gz
if-no-files-found: error
# ═══════════════════════════════════════════
# Stream Deck Plugin — cross-platform Node.js package
# ═══════════════════════════════════════════
build-streamdeck:
needs: [text-integrity]
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
working-directory: com.directpipe.directpipe.sdPlugin
run: npm ci
- name: Generate icons (SVG -> PNG)
working-directory: com.directpipe.directpipe.sdPlugin
run: npm run icons
- name: Build (Rollup bundle)
working-directory: com.directpipe.directpipe.sdPlugin
run: npm run build
- name: Install Stream Deck CLI
run: npm install -g @elgato/cli
- name: Pack Stream Deck Plugin
working-directory: com.directpipe.directpipe.sdPlugin
run: |
streamdeck pack . --output ../dist/ --force
ls -lh ../dist/*.streamDeckPlugin
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: StreamDeck-Plugin
path: dist/com.directpipe.directpipe.streamDeckPlugin
if-no-files-found: error
# ═══════════════════════════════════════════
# Upload to GitHub Release
# Runs only on: release created / workflow_dispatch with tag
# ═══════════════════════════════════════════
upload-release:
if: >-
github.event_name == 'release' ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.release_tag != '')
needs: [build-windows, build-macos, build-linux, build-streamdeck]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Determine release tag
id: tag
run: |
if [ "${{ github.event_name }}" = "release" ]; then
echo "tag=${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT"
else
echo "tag=${{ github.event.inputs.release_tag }}" >> "$GITHUB_OUTPUT"
fi
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts/
- name: Rename and list artifacts
run: |
TAG="${{ steps.tag.outputs.tag }}"
mkdir -p release
# Windows ZIP
cp artifacts/DirectPipe-win64/DirectPipe-win64.zip \
"release/DirectPipe-${TAG}-Windows.zip"
# macOS DMG
cp artifacts/DirectPipe-macOS/DirectPipe-macOS.dmg \
"release/DirectPipe-${TAG}-macOS.dmg"
# Linux tar.gz
cp artifacts/DirectPipe-linux-x64/DirectPipe-linux-x64.tar.gz \
"release/DirectPipe-${TAG}-Linux.tar.gz"
# Stream Deck Plugin
cp artifacts/StreamDeck-Plugin/com.directpipe.directpipe.streamDeckPlugin \
"release/com.directpipe.directpipe.streamDeckPlugin"
# Generate SHA-256 checksums for integrity verification
cd release
sha256sum * > checksums.sha256
cd ..
echo "=== Release artifacts ==="
ls -lh release/
echo "=== Checksums ==="
cat release/checksums.sha256
- name: Upload to GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="${{ steps.tag.outputs.tag }}"
gh release upload "$TAG" \
release/* \
--repo ${{ github.repository }} \
--clobber