ci(release): 正式发版自动更新 Homebrew cask(+ 补 cask 到 1.3.5)#586
Conversation
原 update-cask.yml 监听 release: published,但 Release 由 release-tauri.yml 用默认 GITHUB_TOKEN 创建,不会触发该事件(GitHub 防递归)——所以 cask 从不自动更新,需手动;且其条件 endsWith('-tauri') 连 beta 也匹配。
改为在 release-tauri.yml 内新增 needs:build 的 update-homebrew-cask job:仅正式版 tag(v*-tauri 且非 -beta-tauri),构建+建 Release 后下载 DMG 算 sha256、sed 更新 Casks/openless.rb、提交回默认分支([skip ci])。删除失效且会错配 beta 的 update-cask.yml。
cask 此前停在 1.3.4(自动更新一直没生效),Homebrew 用户拿不到 1.3.5。用 v1.3.5-tauri release 资产 sha256 一次性补齐。
PR Reviewer Guide 🔍(Review updated until commit 18ffbb0)Here are some key observations to aid the review process:
|
|
@claude 请审核这个 PR(目标合并到 beta)。重点:GitHub Actions |
|
Claude finished @appergb's task in 3m 59s —— View job PR #586 代码审核审核任务清单:
审核结论:🔴 存在一处严重 Bug,合并前必须修复1. 触发条件 ✅ 正确if: >-
startsWith(github.ref, 'refs/tags/v')
&& endsWith(github.ref, '-tauri')
&& !endsWith(github.ref, '-beta-tauri')三重条件组合严密。验证几类 tag:
只要命名规范保持 2. DMG 下载 + SHA256 计算 ✅ 可靠
3. Token 权限与注入风险 ✅ 安全
唯一的注意点(低风险):若 4. 删除
|
| 行 | 替换前 | 替换后 |
|---|---|---|
| 2(错误命中) | arch arm: "aarch64", intel: "x64" |
arch arm: "aarch64", intel: "6fa1960f..." ← 损坏 |
| 6(正确命中) | intel: "6fa1960f..." |
intel: "$INTEL_SHA" ✓ |
后果: arch 指令里的 intel: 从 "x64" 变成了 64 字符哈希。Homebrew 生成的 Intel 下载 URL 变为 OpenLess_1.x.y_6fa1960f...dmg(文件不存在),Intel Mac 用户 brew install/upgrade --cask openless 全部报 404 失败。(ARM 用户不受影响,因为 aarch64 那侧未动。)
注: 自动代码审查机器人虽然也标记了第 702 行,但给出的原因("前导空格使模式无法匹配")是错的——正因为没有前导空格锚定,才会多匹配了 arch 那行。实际上两行都被替换了。
修复(一行):
# 将第 702 行改为:
sed -i "s/^[[:space:]]*intel: \"[^\"]*\"/ intel: \"$INTEL_SHA\"/" "$cask"用 ^[[:space:]]*intel: 锚定行首:
- 第 2 行以
arch开头,不匹配^[[:space:]]*intel:→ 不被替换 ✓ - 第 6 行以
intel:开头,匹配 → 正确替换 ✓
6. Commit 2(cask 补到 1.3.5)✅ 正确
Casks/openless.rb 的手动更新(version + 两个 sha256)格式正确,可立即让 brew install/upgrade --cask openless 拿到 1.3.5。这个 commit 可以独立合并。
分级汇总
| 检查项 | 结论 |
|---|---|
| 触发条件(正式版/beta 区分) | ✅ 严格正确 |
| DMG 下载 + sha256 可靠性 | ✅ 可靠 |
| Token 权限 | ✅ 最小权限 |
| tag 名注入风险 | ✅ 安全(env 传入) |
| 删除 update-cask.yml | ✅ 无遗漏 |
| cask 补 1.3.5(commit 2) | ✅ 正确 |
| Intel sed 模式(第 702 行) | 🔴 严重 Bug |
合并建议:修复第 702 行的 sed 模式后可合并。 修复只需把 s/intel: 换成 s/^[[:space:]]*intel: 一处改动。Commit 2(cask 1.3.5 补丁)可不受影响独立先行。
裸 s/intel: "..."/ 会同时命中 cask 第2行 arch arm: "aarch64", intel: "x64",把 arch 的 intel 改成哈希 → Intel Mac 用户 brew 安装 404。改用 ^[[:space:]]*intel: 锚定 sha256 块行(捕获组保留缩进),并加防呆:arch 指令被破坏或 sha256 没写进去就让 job 失败。本地模拟新旧 sed 对比已验证。
|
Persistent review updated to latest commit 18ffbb0 |
|
✅ 第二轮复审(security-reviewer agent):无 CRITICAL/HIGH。已修的 intel sed CRITICAL 经实测验证正确(arch 行不再被误改)+ 防呆 grep 有效;tag 经 env 传入无注入、权限最小化、触发条件严格只匹配正式版。仅 2 个 MEDIUM(运维健壮性,后续跟进)。批准合并。 |
User description
解决的问题
每次发布正式版后,Homebrew cask 需要手动更新。诊断结果:
update-cask.yml,监听release: published。但正式版 Release 是release-tauri.yml用默认GITHUB_TOKEN创建的——GitHub 防递归:默认 token 创建的 Release 不会触发其它工作流,所以它从不自动跑(历史上只在一次手动 beta 场景跑过、且失败)。endsWith('-tauri')还会误匹配 beta(beta tag 也以-tauri结尾)。1.3.4,但最新正式版已是1.3.5—— Homebrew 用户拿不到 1.3.5。改动
① 把 cask 更新并进发版流水线(commit 1)
release-tauri.yml新增needs: build的update-homebrew-caskjob:构建 + 建 Release 完成后,在同一条流水线里更新 cask(不再依赖会被防递归吃掉的release事件)。v*-tauri且非-beta-tauri。beta 不碰 Homebrew。gh release download下载两个 DMG 自己算 sha256(不依赖 GitHub 资产 digest 字段的时序),sed更新Casks/openless.rb,提交回默认分支beta([skip ci],cask 文本改动不必再跑跨平台 CI)。update-cask.yml。② 一次性把 cask 补到 1.3.5(commit 2,可单独取舍)
v1.3.5-taurirelease 资产的 sha256 把Casks/openless.rb从 1.3.4 补到 1.3.5,立即让brew install/upgrade --cask openless拿到最新正式版。验证
ruby -ryaml校验 workflow YAML 通过;ruby -c校验 cask 语法 OK。v*-tauritag)才能端到端验证;逻辑沿用原update-cask.yml已验证过的 sed 模式,DMG 命名(OpenLess_<v>_aarch64.dmg/_x64.dmg)已确认匹配。之后你的发版动作不变
照常推
vX.Y.Z-tauritag → 自动构建多平台 + 建 Release + 自动更新 Homebrew cask。beta(-beta-tauri)完全不受影响。PR Type
Bug fix, Enhancement
Description
Fix Homebrew cask auto-update not triggered due to GitHub recursion prevention
Move cask update into release pipeline as a new job (update-homebrew-cask)
Fix sed command to avoid corrupting arch line in Casks/openless.rb
Remove obsolete update-cask.yml; update cask to version 1.3.5
Diagram Walkthrough
File Walkthrough
openless.rb
Update cask to version 1.3.5Casks/openless.rb
release-tauri.yml
Integrate homebrew cask update into release pipeline.github/workflows/release-tauri.yml
releases
file
update-cask.yml
Remove obsolete cask update workflow.github/workflows/update-cask.yml
trigger logic