feat(release): split updater manifest by channel from tag suffix#330
Conversation
让 release pipeline 根据 tag 名后缀区分 Beta / 正式版渠道,是 opt-in beta
机制的服务端基础。客户端读取的 endpoint 在 PR-B-2 接入。
约定:
- `v<v>-tauri` = 正式版渠道(stable)
- `v<v>-beta-tauri` = Beta 渠道(beta)
release-tauri.yml 改动:
- 在 jobs.build 顶层加 OPENLESS_RELEASE_CHANNEL job-env,由
endsWith(github.ref_name, '-beta-tauri') 决定;workflow_dispatch 与
非 tag 触发回退为 stable,不改变现有 dispatch 行为。
- Write updater manifest step 把 OPENLESS_RELEASE_CHANNEL 透传给脚本。
- Upload-artifact 的 manifest path 改为 `latest-{tgt}-{arch}*.json` glob,
让 stable 和 beta 两种文件名(或 mirror 变体)都能被收集,避免
if-no-files-found 在 beta release 时挂掉。
- Create release 的 prerelease 改为
`${{ env.OPENLESS_RELEASE_CHANNEL == 'beta' }}`:beta tag 自动标
GitHub prerelease(UI 折叠 + 默认不算 latest),stable 保持不变。
write-updater-manifest.mjs 改动:
- 读取 OPENLESS_RELEASE_CHANNEL(默认 stable);非 stable / beta 时
fail-fast,避免拼错 env 静默走错路径。
- beta 渠道时 manifest 文件名加 `-beta` 后缀:
latest-{tgt}-{arch}-beta.json
latest-{tgt}-{arch}-beta-mirror.json
正式版用户的 endpoint 永远指向不带后缀的旧文件名,不会被 beta release 覆盖。
向后兼容:
- 现有 v1.2.23-tauri 等 stable release 行为完全不变(文件名、prerelease=false 沿用旧逻辑)。
- workflow_dispatch 不打 tag 时也照常构建 + 不上传 release。
发版后 checklist(PR-B-2 文档段会写进 CLAUDE.md):
- 推 v<v>-beta-tauri tag → GitHub Release 应标 prerelease 且只含
latest-*-beta.json
- 推 v<v>-tauri tag → 正式 release 且只含 latest-*.json(不带后缀)
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b10ae9da5f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| env: | ||
| OPENLESS_RELEASE_CHANNEL: ${{ endsWith(github.ref_name, '-beta-tauri') && 'beta' || 'stable' }} |
There was a problem hiding this comment.
Merge the channel into the existing job env
This adds a second env: mapping under the same jobs.build object, while the workflow already has another job-level env below runs-on for the Tauri signing secrets. YAML cannot keep both mappings for the same key (parsers either reject the workflow or keep only one; e.g. the later block drops this OPENLESS_RELEASE_CHANNEL value), so a v*-beta-tauri run will not propagate beta to the manifest step and prerelease evaluates false. Put this variable into the existing job env block instead.
Useful? React with 👍 / 👎.
| const assetName = basename(artifact); | ||
| const manifestName = `latest-${target}-${arch}.json`; | ||
| const mirrorManifestName = `latest-${target}-${arch}-mirror.json`; | ||
| const manifestName = `latest-${target}-${arch}${channelSuffix}.json`; |
There was a problem hiding this comment.
Avoid releases/latest for beta manifests
When channelSuffix is -beta, this creates a manifest intended to live on a GitHub prerelease, but the url written just below still uses /releases/latest/download/.... GitHub's latest download route resolves to the latest non-prerelease release, so a beta manifest fetched from a prerelease would point users at the stable asset (and a beta endpoint using latest/download/latest-...-beta.json would not find the prerelease manifest). Beta artifacts need tag-specific or otherwise beta-specific download URLs instead of the global latest route.
Useful? React with 👍 / 👎.
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
…ml (#335) PR #330 在 jobs.build 顶层多加了一个 env: 块来定义 OPENLESS_RELEASE_CHANNEL, 但下面 strategy/runs-on 之后已经有一个 env: 块(TAURI_SIGNING_PRIVATE_KEY 等)。 YAML map 不允许重复 key——GitHub Actions 解析直接 fail,整条 release-tauri.yml 工作流变成 "workflow file issue" 启动失败。 修复:把 OPENLESS_RELEASE_CHANNEL 并到下面那个唯一的 env: 块里,保留完整注释。 校验: - python -c "yaml.safe_load(...)" 解析成功 - jobs.build.env 现在有 3 个 key: OPENLESS_RELEASE_CHANNEL, TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD Co-authored-by: baiqing <lbx12309@icloud.com>
PR #330 在 jobs.build 顶层多加了一个 env: 块来定义 OPENLESS_RELEASE_CHANNEL, 但下面 strategy/runs-on 之后已经有一个 env: 块(TAURI_SIGNING_PRIVATE_KEY 等)。 YAML map 不允许重复 key——GitHub Actions 解析直接 fail,整条 release-tauri.yml 工作流变成 "workflow file issue" 启动失败。 修复:把 OPENLESS_RELEASE_CHANNEL 并到下面那个唯一的 env: 块里,保留完整注释。 校验: - python -c "yaml.safe_load(...)" 解析成功 - jobs.build.env 现在有 3 个 key: OPENLESS_RELEASE_CHANNEL, TAURI_SIGNING_PRIVATE_KEY, TAURI_SIGNING_PRIVATE_KEY_PASSWORD Co-authored-by: baiqing <lbx12309@icloud.com>
User description
Summary
让 release pipeline 根据 tag 后缀区分 Beta / 正式版渠道。这是 opt-in Beta 机制的服务端基础——客户端按渠道选 endpoint 的代码在 PR-B-2 中接入。
约定(这套机制的全部行为都建立在这一行规则上)
正式版用户的 endpoint 永远指向不带后缀的 `latest-{tgt}-{arch}.json`,beta release 不会覆盖这个文件——这是「Beta 不溢出正式版」的物理隔离基础。
改动
`.github/workflows/release-tauri.yml`
`openless-all/app/scripts/write-updater-manifest.mjs`
向后兼容
本地烟囱测试
```bash
不合法值:fail-fast
OPENLESS_UPDATE_TARGET=darwin OPENLESS_UPDATE_ARCH=aarch64 \
OPENLESS_RELEASE_CHANNEL=invalid \
node openless-all/app/scripts/write-updater-manifest.mjs
→ Error: Invalid OPENLESS_RELEASE_CHANNEL: "invalid" (expected "stable" or "beta")
合法值或不设:进入正常 artifact 解析路径(本地无 build artifact 时报 No updater artifact found,符合预期)
```
Test plan
PR Type
Enhancement
Description
Support beta channel releases via
-beta-tauritag suffixGenerate
-betasuffix in updater manifest filenames for betaMark beta GitHub Releases as prerelease to hide from stable users
Switch artifact upload paths to glob to capture both channel manifests
Diagram Walkthrough
File Walkthrough
release-tauri.yml
Add beta channel support to release CI.github/workflows/release-tauri.yml
write-updater-manifest.mjs
Add beta channel suffix to updater manifestopenless-all/app/scripts/write-updater-manifest.mjs