name: Release on: workflow_dispatch: push: tags: - "v*" jobs: release: permissions: contents: write strategy: fail-fast: false matrix: include: - platform: "macos-latest" args: "--target aarch64-apple-darwin" python-version: "3.12" backend: "mlx" - platform: "macos-15-intel" args: "--target x86_64-apple-darwin" python-version: "3.12" backend: "pytorch" - platform: "windows-latest" args: "" python-version: "3.12" backend: "pytorch" runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v4 - name: Install dependencies (ubuntu only) if: contains(matrix.platform, 'ubuntu') || contains(matrix.platform, 'namespace') run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf llvm-dev libasound2-dev - name: Install LLVM (macOS) if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-15-intel' run: | brew install llvm@20 echo "$(brew --prefix llvm@20)/bin" >> $GITHUB_PATH echo "LLVM_CONFIG=$(brew --prefix llvm@20)/bin/llvm-config" >> $GITHUB_ENV - name: Setup Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: "pip" - name: Install CPU-only PyTorch (Linux) if: contains(matrix.platform, 'ubuntu') || contains(matrix.platform, 'namespace') run: | pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install pyinstaller pip install -r backend/requirements.txt pip install --no-deps chatterbox-tts pip install --no-deps hume-tada - name: Install MLX dependencies (Apple Silicon only) if: matrix.backend == 'mlx' run: | pip install -r backend/requirements-mlx.txt - name: Build Python server (Linux/macOS) if: matrix.platform != 'windows-latest' run: | chmod +x scripts/build-server.sh ./scripts/build-server.sh - name: Build Python server (Windows) if: matrix.platform == 'windows-latest' shell: bash run: | cd backend python build_binary.py # Get platform tuple PLATFORM=$(rustc --print host-tuple) # Create binaries directory mkdir -p ../tauri/src-tauri/binaries # Copy with platform suffix cp dist/voicebox-server.exe ../tauri/src-tauri/binaries/voicebox-server-${PLATFORM}.exe echo "Built voicebox-server-${PLATFORM}.exe" - name: Setup Bun uses: oven-sh/setup-bun@v2 - name: Install Rust stable uses: dtolnay/rust-toolchain@stable with: targets: ${{ (matrix.platform == 'macos-latest' && 'aarch64-apple-darwin') || (matrix.platform == 'macos-15-intel' && 'x86_64-apple-darwin') || '' }} - name: Rust cache uses: swatinem/rust-cache@v2 with: workspaces: "./tauri/src-tauri -> target" - name: Install dependencies run: bun install - name: Install Apple API key if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-15-intel' run: | mkdir -p ~/.appstoreconnect/private_keys/ cd ~/.appstoreconnect/private_keys/ echo ${{ secrets.APPLE_API_KEY_BASE64 }} >> AuthKey_${{ secrets.APPLE_API_KEY }}.p8.base64 base64 --decode -i AuthKey_${{ secrets.APPLE_API_KEY }}.p8.base64 -o AuthKey_${{ secrets.APPLE_API_KEY }}.p8 rm AuthKey_${{ secrets.APPLE_API_KEY }}.p8.base64 - name: Install Codesigning Certificate if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-15-intel' uses: apple-actions/import-codesign-certs@v3 with: p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }} p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - name: Extract release notes from CHANGELOG.md id: changelog shell: bash run: | # Get the version from the tag (strip leading 'v') VERSION="${GITHUB_REF_NAME#v}" # Extract the section for this version from CHANGELOG.md # Matches from "## [X.Y.Z]" until the next "## [" heading NOTES=$(sed -n "/^## \[${VERSION}\]/,/^## \[/{/^## \[${VERSION}\]/d;/^## \[/d;p;}" CHANGELOG.md) # Fall back to a placeholder if the version isn't in the changelog if [ -z "$(echo "$NOTES" | tr -d '[:space:]')" ]; then NOTES="See the assets below to download and install this version." fi # Use multiline output syntax { echo "notes<> "$GITHUB_OUTPUT" - uses: tauri-apps/tauri-action@v0.6 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 }} ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} APPLE_PROVIDER_SHORT_NAME: ${{ secrets.APPLE_PROVIDER_SHORT_NAME }} APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} with: projectPath: tauri tagName: v__VERSION__ releaseName: "voicebox v__VERSION__" releaseBody: ${{ steps.changelog.outputs.notes }} releaseDraft: true prerelease: false args: ${{ matrix.args }} includeUpdaterJson: true build-cuda-windows: runs-on: windows-latest permissions: contents: write steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.12" cache: "pip" - name: Install Python dependencies run: | python -m pip install --upgrade pip pip install pyinstaller pip install -r backend/requirements.txt pip install --no-deps chatterbox-tts pip install --no-deps hume-tada - name: Install PyTorch with CUDA 12.6 run: | pip install torch --index-url https://download.pytorch.org/whl/cu126 --force-reinstall --no-deps pip install torchaudio --index-url https://download.pytorch.org/whl/cu126 --force-reinstall --no-deps - name: Verify CUDA support in torch run: | python -c "import torch; print(f'CUDA available in build: {torch.cuda.is_available()}'); print(f'CUDA version: {torch.version.cuda}')" - name: Build CUDA server binary (onedir) shell: bash working-directory: backend run: python build_binary.py --cuda - name: Package into server core + CUDA libs archives shell: bash run: | python scripts/package_cuda.py \ backend/dist/voicebox-server-cuda/ \ --output release-assets/ \ --cuda-libs-version cu126-v1 \ --torch-compat ">=2.6.0,<2.11.0" - name: Upload archives to GitHub Release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: | release-assets/voicebox-server-cuda.tar.gz release-assets/voicebox-server-cuda.tar.gz.sha256 release-assets/cuda-libs-cu126-v1.tar.gz release-assets/cuda-libs-cu126-v1.tar.gz.sha256 release-assets/cuda-libs.json draft: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload onedir as workflow artifact uses: actions/upload-artifact@v4 with: name: voicebox-server-cuda-windows path: backend/dist/voicebox-server-cuda/ retention-days: 7