Compare commits

...

2 Commits

Author SHA1 Message Date
zhengchen.tao cb4aa1c860 chore: 清理 Gitea Actions 残留的 UI 痕迹
两处治理之前 Gitea workflow 删除后的副作用:

- 新增 .gitea/workflows/release.yml 占位 noop:上一版同名 workflow
  删除后 Gitea sidebar 仍残留 release.yml 项且 workflow_dispatch 可点
  但无 runner 匹配。换成一个真实存在但什么也不做的 workflow 接管该
  sidebar 项,并在内容里说明真实 release 流程在 GitHub 一侧
- .github/workflows/release.yml 末尾追加一步:build + mirror 完成
  后调用 Gitea statuses API,给 GITHUB_SHA 打 state=success 的
  commit status,context 与 Gitea Actions 当年用的一致
  ("release / build (push)")。Gitea UI 显示每 context 的最新状态,
  这一步可覆盖之前 cancelled 状态在 release 页面留下的红叉
2026-05-07 15:13:26 +08:00
zhengchen.tao 407b63e45b feat: GitHub Actions 构建后同步发布到 Gitea Releases
release / build (push) Cleared cancelled status from deprecated Gitea Actions runs
构建只在 GitHub windows-latest 上跑一次,产物通过 Gitea REST API 上传到
Gitea Releases,让国内无法访问 GitHub 的用户也能下载到 exe。

- .github/workflows/release.yml: 新增 Mirror release to Gitea 步骤,
  调用 /api/v1/repos/.../releases 创建发布并上传 zip 资产;
  GITEA_TOKEN 未配置时仅警告跳过,不阻断 GitHub release
- .gitea/workflows/release.yml: 删除。Gitea NAS 上的 Linux runner 无法
  交叉编译 Windows exe,本仓库不再使用 Gitea Actions
- README: 在下载步骤列出 Gitea / GitHub 双下载渠道
- CHANGELOG: v0.1.0 条目同步更新
2026-05-07 14:54:43 +08:00
4 changed files with 79 additions and 74 deletions
+18 -72
View File
@@ -1,79 +1,25 @@
name: release
# 此文件不执行任何实际逻辑,仅用于占位。
#
# Why
# - Release 流程已迁到 GitHub Actions(见 .github/workflows/release.yml),
# 构建完成后通过 Gitea API 同步发布到 Gitea Releases
# - 上一版 Gitea workflow 删除后,Gitea Actions 的 workflow 注册表
# 不会自动清理,导致 sidebar 仍残留 release.yml 项 + workflow_dispatch
# 按钮可点但无 runner 匹配
# - 用一个 noop workflow "接管" 同名 sidebar 项,让手动触发能跑通
# 并清楚说明 release 流程在 GitHub 那边
name: placeholder (release pipeline lives on GitHub Actions)
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Release tag, 例如 v0.1.0(会自动创建 tag 并发布 release'
required: true
type: string
jobs:
build:
# 需要一台带 Windows 的自托管 act_runnerGitea 没有官方 hosted Windows runner
# 默认按 act_runner 常见标签 windows-latest;按你的 runner 实际 label 调整
runs-on: windows-latest
noop:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Resolve release tag
shell: pwsh
- name: Explain
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
echo "本仓库的 release 流程在 GitHub Actions 上执行。"
echo "构建完成后通过 Gitea API 同步到 Gitea Releases。"
echo "本 workflow 仅为占位,不构建任何产物。"
+54
View File
@@ -79,3 +79,57 @@ 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"
# 给同 SHA 打一条 success commit status,覆盖 Gitea Actions 历史残留的 cancelled
# 状态(Gitea release 页会沿 tag→commit 把 commit status badge 显示出来)
$statusPayload = @{
state = "success"
context = "release / build (push)"
description = "Built and mirrored from GitHub Actions"
target_url = "$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY/actions/runs/$env:GITHUB_RUN_ID"
} | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "$baseUrl/statuses/$env:GITHUB_SHA" -Headers $headers -ContentType 'application/json' -Body $statusPayload | Out-Null
Write-Host "已为 $env:GITHUB_SHA 打 success commit status"
+1 -1
View File
@@ -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
- 游戏客户端通常以管理员权限运行,本工具必须以同等权限运行才能检测到游戏进程
+6 -1
View File
@@ -18,7 +18,12 @@
### 2. 下载并解压
到本仓库 [Releases](../../releases) 页面下载最新的 `df-scope-hold-vX.X.X.zip`,解压到任意目录,里面包含
下载最新的 `df-scope-hold-vX.X.X.zip`,解压到任意目录。两个下载渠道任选其一
- **Gitea**(国内推荐):<https://git.zhengchentao.win/zhengchen.tao/df-scope-hold/releases>
- **GitHub**<https://github.com/ZhengchenTao/df-scope-hold/releases>
zip 内含:
- `df-scope-hold.exe`:主程序(已内嵌管理员权限 manifest,双击即弹 UAC
- `config.ini`:默认配置