name: release on: push: tags: - "v*" jobs: gui-build: strategy: fail-fast: false matrix: include: - os: macos shell: bash - os: windows shell: cmd - os: linux shell: bash runs-on: ${{ matrix.os }} steps: # Plain git clone instead of actions/checkout (a JS action that would # require node on the host). Full history so setuptools_scm sees tags. # ${{ }} expressions are substituted by the runner, so both shells work. # Windows uses cmd: bash resolves to WSL (refuses SYSTEM accounts) and # powershell hits the script execution policy under SYSTEM. - name: Checkout shell: ${{ matrix.shell }} run: | git clone "${{ gitea.server_url }}/${{ gitea.repository }}.git" . git checkout -f "${{ gitea.sha }}" # The sdist build compiles the Vue frontend and needs node/npm. # Install per-job via uv so runner hosts don't need node set up. - name: Install Node.js if: matrix.os != 'windows' shell: bash run: | uv tool install nodejs-wheel echo "$HOME/.local/bin" >> "$GITHUB_PATH" - name: Install Node.js (Windows) if: matrix.os == 'windows' shell: cmd run: | uv tool install nodejs-wheel echo %USERPROFILE%\.local\bin>>"%GITHUB_PATH%" - name: Build GUI app zip and dist packages shell: ${{ matrix.shell }} run: uv run --extra gui scripts/guibuild.py # Every platform converges on the one release for the tag; release.py # reuses an existing release and skips already-uploaded assets. # Only the linux job publishes the wheel/sdist (identical across platforms). - name: Create Gitea release and upload assets if: matrix.os == 'linux' shell: ${{ matrix.shell }} env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: uv run scripts/release.py - name: Attach platform artifact to the Gitea release if: matrix.os != 'linux' shell: ${{ matrix.shell }} env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: uv run scripts/release.py --no-dist