diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml deleted file mode 100644 index 0a43cc5..0000000 --- a/.gitea/workflows/release.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: release - -on: - push: - tags: - - 'v*' - workflow_dispatch: - inputs: - tag: - description: 'Release tag, 例如 v0.1.0(会自动创建 tag 并发布 release)' - required: true - type: string - -jobs: - build: - # 需要一台带 Windows 的自托管 act_runner(Gitea 没有官方 hosted Windows runner) - # 默认按 act_runner 常见标签 windows-latest;按你的 runner 实际 label 调整 - runs-on: windows-latest - steps: - - uses: actions/checkout@v4 - - - name: Resolve release tag - shell: pwsh - run: | - if ($env:GITHUB_EVENT_NAME -eq 'workflow_dispatch') { - $t = '${{ inputs.tag }}' - } else { - $t = $env:GITHUB_REF_NAME - } - echo "RELEASE_TAG=$t" >> $env:GITHUB_ENV - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - name: Install dependencies - run: pip install -r requirements.txt - - - name: Build exe - run: pyinstaller --onefile --uac-admin --console --name df-scope-hold script.py - - - name: Package release zip - shell: pwsh - run: | - New-Item -ItemType Directory -Force -Path release | Out-Null - Copy-Item dist/df-scope-hold.exe release/ - Copy-Item config.ini release/ - Copy-Item README.md release/ - Compress-Archive -Path release/* -DestinationPath "df-scope-hold-$env:RELEASE_TAG.zip" -Force - echo "ASSET_ZIP=df-scope-hold-$env:RELEASE_TAG.zip" >> $env:GITHUB_ENV - - - name: Upload workflow artifact - uses: actions/upload-artifact@v3 - with: - name: df-scope-hold-${{ env.RELEASE_TAG }} - path: ${{ env.ASSET_ZIP }} - - - name: Extract release notes from CHANGELOG.md - shell: pwsh - run: | - $content = Get-Content CHANGELOG.md -Raw - $escaped = [regex]::Escape($env:RELEASE_TAG) - $pattern = "(?ms)^## \[$escaped\].*?(?=^## |\Z)" - $m = [regex]::Match($content, $pattern) - if ($m.Success) { - $body = ($m.Value -replace '^## .*\r?\n', '').Trim() - } else { - $body = "Release $env:RELEASE_TAG" - } - $date = [DateTime]::UtcNow.ToString('yyyy-MM-dd') - $body = "**发布日期**: $date (UTC)`n`n" + $body - Set-Content -Path release-notes.md -Value $body -Encoding utf8 - - - name: Create Gitea Release - uses: akkuman/gitea-release-action@v1 - with: - tag_name: ${{ env.RELEASE_TAG }} - files: ${{ env.ASSET_ZIP }} - body_path: release-notes.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d71e204..c57abc3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,3 +79,46 @@ jobs: tag_name: ${{ env.RELEASE_TAG }} files: ${{ env.ASSET_ZIP }} body_path: release-notes.md + + - name: Mirror release to Gitea + shell: pwsh + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + GITEA_URL: https://git.zhengchentao.win + GITEA_OWNER: zhengchen.tao + GITEA_REPO: df-scope-hold + run: | + if (-not $env:GITEA_TOKEN) { + Write-Warning "secrets.GITEA_TOKEN 未配置,跳过 Gitea release 同步" + exit 0 + } + + $headers = @{ Authorization = "token $env:GITEA_TOKEN" } + $baseUrl = "$env:GITEA_URL/api/v1/repos/$env:GITEA_OWNER/$env:GITEA_REPO" + + # 同 tag 已存在则先删(含其 assets),允许 re-run 覆盖发布 + try { + $existing = Invoke-RestMethod -Method Get -Uri "$baseUrl/releases/tags/$env:RELEASE_TAG" -Headers $headers -ErrorAction Stop + Write-Host "覆盖已存在的 Gitea release id=$($existing.id)" + Invoke-RestMethod -Method Delete -Uri "$baseUrl/releases/$($existing.id)" -Headers $headers | Out-Null + } catch { + if ($_.Exception.Response.StatusCode.value__ -ne 404) { throw } + } + + # 创建 release。tag 不存在时 Gitea 按 target_commitish 自动建 tag + $bodyContent = Get-Content release-notes.md -Raw + $payload = @{ + tag_name = $env:RELEASE_TAG + name = $env:RELEASE_TAG + body = $bodyContent + draft = $false + prerelease = $false + target_commitish = $env:GITHUB_SHA + } | ConvertTo-Json + $release = Invoke-RestMethod -Method Post -Uri "$baseUrl/releases" -Headers $headers -ContentType 'application/json' -Body $payload + Write-Host "已创建 Gitea release id=$($release.id)" + + # 上传 zip 资产 + $assetName = [uri]::EscapeDataString($env:ASSET_ZIP) + Invoke-RestMethod -Method Post -Uri "$baseUrl/releases/$($release.id)/assets?name=$assetName" -Headers $headers -Form @{ attachment = Get-Item $env:ASSET_ZIP } | Out-Null + Write-Host "已上传 $env:ASSET_ZIP 到 Gitea release" diff --git a/CHANGELOG.md b/CHANGELOG.md index 002ee35..9510a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ - 进程门控:仅在目标游戏进程运行时激活监听,游戏关闭自动停止,重启自动恢复 - `config.ini` 配置文件,可自定义按键、按键延迟(毫秒)、目标进程名 - Windows 单 exe 分发,内嵌 UAC manifest,双击自动请求管理员权限 -- GitHub / Gitea Actions 自动构建并发布 release zip(含 exe + 默认 config.ini) +- GitHub Actions 自动构建 Windows exe,构建完成后同时发布到 GitHub Releases 与 Gitea Releases,方便不同网络环境下载(zip 包含 exe + 默认 config.ini + README) ### Notes - 游戏客户端通常以管理员权限运行,本工具必须以同等权限运行才能检测到游戏进程 diff --git a/README.md b/README.md index 093224d..f73ddb4 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,12 @@ ### 2. 下载并解压 -到本仓库 [Releases](../../releases) 页面下载最新的 `df-scope-hold-vX.X.X.zip`,解压到任意目录,里面包含: +下载最新的 `df-scope-hold-vX.X.X.zip`,解压到任意目录。两个下载渠道任选其一: + +- **Gitea**(国内推荐): +- **GitHub**: + +zip 内含: - `df-scope-hold.exe`:主程序(已内嵌管理员权限 manifest,双击即弹 UAC) - `config.ini`:默认配置