name: Release # Tag pushes mirrored from Gitea (git.jezz.wtf) trigger this on the GitHub # mirror. Builds the NSIS installer and attaches it to a DRAFT GitHub Release — # review and publish manually. on: push: tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Existing release tag to build, for example v0.1.1' required: true type: string concurrency: group: ${{ github.workflow }}-${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} cancel-in-progress: false jobs: release: permissions: contents: write runs-on: windows-latest timeout-minutes: 120 env: CARGO_INCREMENTAL: 0 GITEA_STATUS_TOKEN: ${{ secrets.GITEA_STATUS_TOKEN }} RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} steps: # refs/tags/ qualification: a branch with a tag-like name must never win # ref resolution. Works for tag pushes too — RELEASE_TAG is the tag name. - uses: actions/checkout@v4 with: ref: refs/tags/${{ env.RELEASE_TAG }} # On workflow_dispatch GITHUB_SHA is the dispatched branch head, not the # tag's commit — resolve the real one for Gitea commit statuses. - name: Resolve release commit shell: pwsh run: | $sha = git rev-parse HEAD "RELEASE_SHA=$sha" | Out-File -FilePath $env:GITHUB_ENV -Append - name: Verify release version shell: pwsh run: | if ($env:RELEASE_TAG -notmatch '^v\d+\.\d+\.\d+(-.+)?$') { throw "Release tag '$env:RELEASE_TAG' must look like v0.1.1" } $packageVersion = (Get-Content package.json -Raw | ConvertFrom-Json).version $cargoVersion = (Select-String -Path src-tauri/Cargo.toml -Pattern '^version\s*=\s*"(.+)"').Matches[0].Groups[1].Value if ($packageVersion -ne $cargoVersion) { throw "package.json version ($packageVersion) does not match Cargo.toml version ($cargoVersion)" } if ($env:RELEASE_TAG -ne "v$packageVersion") { throw "Release tag '$env:RELEASE_TAG' does not match project version v$packageVersion" } - name: Report pending status to Gitea if: env.GITEA_STATUS_TOKEN != '' continue-on-error: true shell: pwsh env: GITHUB_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} run: | $headers = @{ Authorization = "token $env:GITEA_STATUS_TOKEN" Accept = "application/json" } $body = @{ state = "pending" context = "github/actions/release" description = "GitHub Actions release is running" target_url = $env:GITHUB_RUN_URL } | ConvertTo-Json Invoke-RestMethod ` -Method Post ` -Uri "https://git.jezz.wtf/api/v1/repos/JezzWTF/phokus/statuses/$env:RELEASE_SHA" ` -Headers $headers ` -ContentType "application/json" ` -Body $body - uses: pnpm/action-setup@v4 with: version: 11 - uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm cache-dependency-path: pnpm-lock.yaml - name: Install Rust stable uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: workspaces: src-tauri - name: Install frontend dependencies run: pnpm install --frozen-lockfile - name: Build and create draft release uses: tauri-apps/tauri-action@v0.6.2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Updater artifact signing (Phase 3) — set these repo secrets once # the updater keypair exists; empty values are ignored until then. TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} with: tagName: ${{ env.RELEASE_TAG }} releaseName: 'Phokus v__VERSION__' releaseBody: 'See the assets below to download and install this version.' releaseDraft: true prerelease: false includeUpdaterJson: true updaterJsonPreferNsis: true # Cargo args after `--`: ship the CPU/DirectML build — default # features enable candle-cuda, which runners (and most users) lack. args: '-- --no-default-features' - name: Report final status to Gitea if: always() && env.GITEA_STATUS_TOKEN != '' continue-on-error: true shell: pwsh env: GITHUB_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} JOB_STATUS: ${{ job.status }} run: | $state = switch ($env:JOB_STATUS) { "success" { "success" } "failure" { "failure" } default { "error" } } $headers = @{ Authorization = "token $env:GITEA_STATUS_TOKEN" Accept = "application/json" } $body = @{ state = $state context = "github/actions/release" description = "GitHub Actions release finished: $env:JOB_STATUS" target_url = $env:GITHUB_RUN_URL } | ConvertTo-Json # RELEASE_SHA is unset if the job died before checkout; fall back. $sha = if ($env:RELEASE_SHA) { $env:RELEASE_SHA } else { $env:GITHUB_SHA } Invoke-RestMethod ` -Method Post ` -Uri "https://git.jezz.wtf/api/v1/repos/JezzWTF/phokus/statuses/$sha" ` -Headers $headers ` -ContentType "application/json" ` -Body $body