From 7f62fd7645a7f1b3046226eb2e32516440143966 Mon Sep 17 00:00:00 2001 From: Justin Paul Date: Fri, 8 May 2026 11:59:41 -0400 Subject: [PATCH 1/2] CI: skip GitHub-specific workflows on Gitea Actions; add workflow_dispatch Gitea reads .github/workflows/ for compatibility, so without guards it tries to run the release and wiki-sync workflows on Gitea too - which fail because they use softprops/action-gh-release@v2 (GitHub-only) and push to GitHub-hosted wiki URLs. Add `if: github.server_url == 'https://github.com'` to the release-builder and wiki-sync jobs so Gitea no-ops them. ci.yml (plain dotnet build + test) still runs on both, and now also accepts workflow_dispatch so it can be triggered by hand to verify a self- hosted runner is picking up jobs. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 1 + .github/workflows/release.yml | 3 +++ .github/workflows/wiki-sync.yml | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2646469..69e19ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,7 @@ on: branches: [main] pull_request: branches: [main] + workflow_dispatch: jobs: build: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b7e6750..38c8648 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,6 +12,9 @@ on: jobs: build-installer: + # Gitea reads .github/workflows/ for compatibility, but the create-release + # step uses a GitHub-only action. Skip the whole job on non-GitHub runners. + if: github.server_url == 'https://github.com' runs-on: windows-latest permissions: contents: write # needed to create releases / upload assets diff --git a/.github/workflows/wiki-sync.yml b/.github/workflows/wiki-sync.yml index 349fefa..289eee8 100644 --- a/.github/workflows/wiki-sync.yml +++ b/.github/workflows/wiki-sync.yml @@ -11,6 +11,10 @@ on: jobs: sync: + # Gitea reads .github/workflows/ for compatibility, but this workflow + # pushes to a GitHub-hosted wiki. Skip on non-GitHub runners; the Gitea + # wiki is synced separately via scripts/sync-wiki.ps1. + if: github.server_url == 'https://github.com' runs-on: windows-latest permissions: contents: write From c0ae1961bf4d5af2fe2d0de7dc0c371467eb593d Mon Sep 17 00:00:00 2001 From: Justin Paul Date: Fri, 8 May 2026 12:01:24 -0400 Subject: [PATCH 2/2] Gitea release workflow: build installer + attach to Gitea release .gitea/workflows/release.yml runs on the self-hosted Windows runner when a v* tag is pushed (or via workflow_dispatch with a version override for testing without bumping the project). Mirrors the GitHub release workflow shape - dotnet test, choco-install Inno Setup if missing, run scripts/build-installer.ps1 - then uses Gitea's REST API directly for the release-creation + asset-upload steps (Gitea has no equivalent to softprops/action-gh-release). Token is the runner-injected secrets.GITHUB_TOKEN, which Gitea provides for GitHub Actions compatibility. Path location matters: lives under .gitea/ so GitHub Actions never sees it, while the existing .github/workflows/release.yml stays GitHub-only (already gated with `if: github.server_url == ...`). Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/release.yml | 102 +++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 .gitea/workflows/release.yml diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..0abb5ee --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,102 @@ +name: Release (Gitea) + +# Lives in .gitea/workflows/ so it runs on Gitea Actions only. The GitHub-side +# release lives in .github/workflows/release.yml. +# +# Triggered automatically on v* tag pushes; can also be invoked manually via +# workflow_dispatch with a version override (useful for testing the runner +# without bumping the project version). + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Version to build (e.g. 0.1.4). Defaults to Directory.Build.props.' + required: false + +jobs: + build-installer: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Resolve version + id: ver + shell: pwsh + run: | + if ('${{ github.event_name }}' -eq 'push') { + $v = '${{ github.ref_name }}'.TrimStart('v') + } elseif ('${{ inputs.version }}') { + $v = '${{ inputs.version }}' + } else { + [xml]$p = Get-Content Directory.Build.props + $v = $p.Project.PropertyGroup.Version + } + "version=$v" | Out-File $env:GITHUB_OUTPUT -Append + Write-Host "Building version $v" + + - name: Restore + test + shell: pwsh + run: | + dotnet restore WebhookServer.sln + dotnet test WebhookServer.sln -c Release + + - name: Ensure Inno Setup is installed + shell: pwsh + run: | + if (-not (Get-Command iscc -ErrorAction SilentlyContinue) -and ` + -not (Test-Path 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe') -and ` + -not (Test-Path 'C:\Program Files\Inno Setup 6\ISCC.exe')) { + choco install innosetup --no-progress -y + } + + - name: Build installer + shell: pwsh + run: ./scripts/build-installer.ps1 -VersionOverride ${{ steps.ver.outputs.version }} + + - name: Upload installer artifact + uses: actions/upload-artifact@v4 + with: + name: WebhookServer-Setup-${{ steps.ver.outputs.version }} + path: dist/WebhookServer-Setup-*.exe + + - name: Create Gitea release with installer attached + if: startsWith(github.ref, 'refs/tags/v') + shell: pwsh + env: + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + $version = '${{ steps.ver.outputs.version }}' + $tag = '${{ github.ref_name }}' + $repo = '${{ github.repository }}' + $serverUrl = '${{ github.server_url }}' + $apiBase = "$serverUrl/api/v1/repos/$repo" + $headers = @{ Authorization = "token $env:GITEA_TOKEN" } + + # 1. Create the release. + $isPre = $version.StartsWith('0.') + $createBody = @{ + tag_name = $tag + name = "Webhook Server $version" + body = "Automated build via Gitea Actions runner." + draft = $false + prerelease = $isPre + } | ConvertTo-Json + $rel = Invoke-RestMethod -Uri "$apiBase/releases" -Method Post ` + -Headers $headers -ContentType 'application/json' -Body $createBody + Write-Host "Created release id=$($rel.id) tag=$tag" + + # 2. Attach the installer. + $file = Get-Item "dist/WebhookServer-Setup-$version.exe" + $uploadUri = "$apiBase/releases/$($rel.id)/assets?name=$($file.Name)" + Invoke-RestMethod -Uri $uploadUri -Method Post -Headers $headers ` + -ContentType 'application/octet-stream' -InFile $file.FullName | Out-Null + Write-Host "Uploaded $($file.Name) ($([math]::Round($file.Length / 1MB, 2)) MB) to $tag"