From 62019a29cd8d551b700e9b8f81730699d30b0736 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sun, 1 Nov 2026 09:37:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(packaging):=20M47=20r1=20P2=20=E2=80=94?= =?UTF-8?q?=E2=80=94=20=E9=87=8D=E8=B7=91=E4=B8=8D=E5=86=8D=E6=96=AD?= =?UTF-8?q?=E8=A8=80=20pre-release=20=E6=A0=87=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reviewer 指出:edit 分支此前每次默认重跑都重传 --prerelease,会把用户按 README 建议手动提升为 stable 的 Release 静默翻回 pre-release,文档承诺"重跑 不翻转标记"不成立。按首选修法让代码匹配文档: - release.yml:create/edit 两套标记分开算。create 保持老契约(空输入 → 首建 pre-release);edit 只在 inputs.prerelease 显式给出时断言 (true → --prerelease,false → --prerelease=false),空值(push 或其 Re-run) 不传任何标记。非法取值直接 ::error + exit 1。 - README §3:重跑语义与实现逐字一致,并把"改标记"的两条等价路径 (gh workflow run -f prerelease=false / 手动 gh release edit)与 dispatch 语义写顺;yml 头注释同步一句。 --- .github/workflows/release.yml | 35 ++++++++++++++++++++++++++++------- packaging/README.md | 10 ++++++++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6b72d67..05f2b72 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,8 @@ name: Release # 发布流水线:tag `v*` → 三平台(四槽位)矩阵构建 → 单文件产物 + SHA256SUMS # → 上传 artifact + 创建 GitHub Release(pre-release 默认开)。同一 tag 重跑幂等: -# Release 已存在时覆盖资产与说明,不再 `gh release create`(见 release job 末步)。 +# Release 已存在时覆盖资产与说明,不再 `gh release create`(见 release job 末步); +# 重跑**不碰** pre-release 标记,该标记只在 `inputs.prerelease` 显式给出时才被断言。 # # 契约唯一真相源:packaging/README.md(命名/目录/运行时依赖)。 # 打包本体在 packaging/make_artifacts.py(本地与 CI 同一份脚本,逐字节同布局)。 @@ -198,10 +199,30 @@ jobs: shell: bash run: | set -euo pipefail - flags=(--title "Unlucky Launcher $TAG" --notes-file release-body.md) - if [ "${PRERELEASE:-true}" != "false" ]; then - flags+=(--prerelease) - fi + base_flags=(--title "Unlucky Launcher $TAG" --notes-file release-body.md) + # pre-release 标记只在**显式要求**时才断言: + # PRERELEASE=true / false —— 来自 tag ref 上的 workflow_dispatch 输入; + # PRERELEASE 空 —— push 触发的运行或它的 Re-run,此时**不碰**该标记, + # 否则会把用户手动提升为 stable 的 Release 静默翻回 pre-release。 + # 首次创建(create)仍保持「pre-release 默认开」的老契约:空值按 true 处理。 + create_mark=() + edit_mark=() + case "${PRERELEASE:-}" in + true) + create_mark=(--prerelease) + edit_mark=(--prerelease) + ;; + false) + edit_mark=(--prerelease=false) + ;; + "") + create_mark=(--prerelease) + ;; + *) + echo "::error::非预期的 inputs.prerelease 取值:$PRERELEASE" + exit 1 + ;; + esac # Windows 单 exe 装不下 LICENSE/NOTICE/README.md,这三份与产物并列挂到 Release 上, # 保证每个下载平台的许可条款都随包分发。 assets=(dist/unlucky-launcher-* dist/SHA256SUMS.txt LICENSE NOTICE README.md) @@ -209,7 +230,7 @@ jobs: # 同 tag 重跑(补丁 / 重编):Release 已存在 → 覆盖资产 + 刷新说明, # 不再 `create`(那会因已存在而失败,把整条流水线在最后一步染红)。 gh release upload "$TAG" "${assets[@]}" --clobber - gh release edit "$TAG" "${flags[@]}" + gh release edit "$TAG" "${base_flags[@]}" "${edit_mark[@]}" else - gh release create "$TAG" "${assets[@]}" "${flags[@]}" + gh release create "$TAG" "${assets[@]}" "${base_flags[@]}" "${create_mark[@]}" fi diff --git a/packaging/README.md b/packaging/README.md index a7a6a4c..909280d 100644 --- a/packaging/README.md +++ b/packaging/README.md @@ -63,10 +63,16 @@ python packaging/make_artifacts.py --no-smoke # 跳过 ull --version 冒 `macos-latest`(arm64)、`macos-15-intel`(Intel x64;`macos-13` 已下线,`macos-26-intel` 为更新替位)。 - 每个槽位 `cargo build --release --locked` → `make_artifacts.py` → 归档内容自检 → 上传 artifact。 - `release` job:下载全部 artifact → 重算一份全量 `SHA256SUMS.txt` → 用 `packaging/release-notes.md` - 模板渲染支持矩阵 → `gh release create`(**pre-release 默认开**,`workflow_dispatch` 可关)。 + 模板渲染支持矩阵 → `gh release create`(**pre-release 默认开**:首建时 `push` 触发按 pre-release,`workflow_dispatch` 可关)。 - **同一 tag 重跑幂等**:`gh release view` 命中已存在的 Release 时改走 `gh release upload --clobber` + `gh release edit`,覆盖资产与说明而不是再 `create`(`create` 遇已存在会失败,把流水线最后一步染红)。 - pre-release 标记以首次创建为准,重跑不会翻转它——要改标记请手动 `gh release edit --prerelease / --prerelease=false`。 +- **pre-release 标记只按显式输入断言**:`gh release edit` 分支在默认重跑(`push` 触发的 Re-run, + `inputs.prerelease` 为空)时**不传** `--prerelease`,所以重跑**不会**翻转标记;只有 tag ref 上的 + `workflow_dispatch` 显式给了输入才断言——`prerelease=true` → `--prerelease`,`prerelease=false` → + `--prerelease=false`。要改标记两条路等价且互不打架:① 走流水线 + `gh workflow run release.yml --ref v0.1.0 -f prerelease=false`(会落到 edit 分支显式断言) + ② 直接 `gh release edit --prerelease=false`(不经流水线;后续默认重跑不碰该标记, + 不会被翻回去)。首建(`create`)仍保持「pre-release 默认开」的老契约,空输入按 `true` 处理。 Windows 为什么用 MSVC 静态 CRT 而不是本机这套 GNU 工具链:两者都属"标准工具链"(D21), 但发布产物要**不依赖 VC++ 可再发行包**,`+crt-static` 把 CRT 静态链进 exe,Win10+ 的 UCRT 本身是