name: Build binaries # Build OBDash GUI binaries on each self-hosted runner. On a version tag # (v*), publish a Gitea Release with every platform's binary attached. # Manual runs (workflow_dispatch) build-only (no release) to verify compilation. on: push: tags: ["v*"] workflow_dispatch: {} jobs: windows: runs-on: windows-latest # self-hosted Windows runner (no Python preinstalled) steps: - uses: actions/checkout@v4 - name: Build OBDash.exe (PyInstaller) shell: pwsh run: | $ErrorActionPreference = "Stop" if (-not (Get-Command python -ErrorAction SilentlyContinue)) { Write-Host "Python not found; installing 3.12 (per-user, no admin needed)..." $url = "https://www.python.org/ftp/python/3.12.7/python-3.12.7-amd64.exe" Invoke-WebRequest -Uri $url -OutFile "$env:TEMP\py.exe" Start-Process -Wait -FilePath "$env:TEMP\py.exe" -ArgumentList "/quiet","PrependPath=1","Include_test=0" $base = @( "$env:LOCALAPPDATA\Programs\Python\Python312", "C:\Program Files\Python312", "C:\Python312" ) | Where-Object { Test-Path "$_\python.exe" } | Select-Object -First 1 if (-not $base) { throw "Python install did not produce python.exe in a known location" } $env:Path = "$base;$base\Scripts;$env:Path" } python --version python -m pip install --upgrade pip pip install -r requirements-gui.txt pyinstaller pyinstaller --noconfirm --onefile --windowed --name OBDash --add-data "profiles;profiles" run_gui.py Copy-Item dist/OBDash.exe OBDash-windows.exe - name: Publish to release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: OBDash-windows.exe env: GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} macos: runs-on: self-hosted-mac steps: - uses: actions/checkout@v4 - name: Build OBDash.app (PyInstaller) shell: bash run: | python3 -m venv .build-venv . .build-venv/bin/activate pip install --upgrade pip pip install -r requirements-gui.txt pyinstaller pyinstaller --noconfirm --windowed --name OBDash --add-data "profiles:profiles" run_gui.py ditto -c -k --keepParent dist/OBDash.app OBDash-macos.zip - name: Publish to release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: OBDash-macos.zip env: GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} linux-amd64: runs-on: docker # Linux x86_64 runner container: nikolaik/python-nodejs:python3.12-nodejs20 # has python+pip AND node (for checkout) steps: - uses: actions/checkout@v4 - name: Build OBDash (PyInstaller) shell: bash run: | apt-get update && apt-get install -y patchelf libgl1 libegl1 libxkbcommon0 pip install --upgrade pip pip install -r requirements-gui.txt pyinstaller pyinstaller --noconfirm --onefile --name OBDash --add-data "profiles:profiles" run_gui.py cp dist/OBDash OBDash-linux-x86_64 - name: Publish to release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: OBDash-linux-x86_64 env: GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} linux-arm64: runs-on: arm64 # Raspberry Pi (aarch64) runner container: nikolaik/python-nodejs:python3.12-nodejs20 # multi-arch: pulls arm64 steps: - uses: actions/checkout@v4 - name: Build OBDash (PyInstaller) shell: bash run: | apt-get update && apt-get install -y patchelf libgl1 libegl1 libxkbcommon0 pip install --upgrade pip pip install -r requirements-gui.txt pyinstaller pyinstaller --noconfirm --onefile --name OBDash --add-data "profiles:profiles" run_gui.py cp dist/OBDash OBDash-linux-aarch64 - name: Publish to release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v2 with: files: OBDash-linux-aarch64 env: GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }}