name: Overlay Installer on: push: branches: - main tags: - "v*" - "overlay-v*" paths: - "overlay/**" - ".gitea/workflows/overlay-release.yml" pull_request: paths: - "overlay/**" - ".gitea/workflows/overlay-release.yml" workflow_dispatch: permissions: contents: read releases: write jobs: build-overlay: runs-on: windows defaults: run: shell: pwsh steps: - name: Check out repository uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "22" cache: npm cache-dependency-path: overlay/package-lock.json - name: Install overlay dependencies working-directory: overlay run: npm ci - name: Build overlay installer working-directory: overlay run: npm run dist:win - name: Upload installer artifact uses: actions/upload-artifact@v4 with: name: custom-streamdeck-overlay-installer path: overlay/release/*.exe if-no-files-found: error - name: Publish Gitea release if: ${{ gitea.ref_type == 'tag' }} env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_API_URL: ${{ gitea.api_url }} GITEA_REPOSITORY: ${{ gitea.repository }} GITEA_REF_NAME: ${{ gitea.ref_name }} GITEA_SHA: ${{ gitea.sha }} run: | $ErrorActionPreference = "Stop" $owner, $repo = $env:GITEA_REPOSITORY -split "/", 2 $tag = $env:GITEA_REF_NAME $installer = Get-ChildItem -Path "overlay/release" -Filter "*.exe" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if (-not $installer) { throw "No installer exe was produced under overlay/release." } $headers = @{ Authorization = "token $env:GITEA_TOKEN" } $releaseBody = @{ tag_name = $tag target_commitish = $env:GITEA_SHA name = "Custom Streamdeck Overlay $tag" body = "Windows installer for the Custom Streamdeck overlay." draft = $false prerelease = $tag -match "^(overlay-)?v?\d+\.\d+\.\d+-" } | ConvertTo-Json $releaseUri = "$env:GITEA_API_URL/repos/$owner/$repo/releases" try { $release = Invoke-RestMethod -Method Post -Uri $releaseUri -Headers $headers -ContentType "application/json" -Body $releaseBody } catch { $statusCode = $_.Exception.Response.StatusCode.value__ if ($statusCode -ne 409) { throw } $release = Invoke-RestMethod -Method Get -Uri "$releaseUri/tags/$tag" -Headers $headers } $existingAsset = @($release.assets) | Where-Object { $_.name -eq $installer.Name } | Select-Object -First 1 if ($existingAsset) { Invoke-RestMethod -Method Delete -Uri "$releaseUri/$($release.id)/assets/$($existingAsset.id)" -Headers $headers } $assetName = [uri]::EscapeDataString($installer.Name) Invoke-RestMethod ` -Method Post ` -Uri "$releaseUri/$($release.id)/assets?name=$assetName" ` -Headers $headers ` -Form @{ attachment = Get-Item $installer.FullName }