用途
SGLang Cherry-Pick 用于 SGLang 发布管理场景:把一批已经合并(MERGED)的 PR 批量拣选到某个 release 分支上。它触发仓库中的 .github/workflows/bot-cherry-pick.yml 工作流,然后监控每个运行直至结束,并报告每个 PR 的成功或失败,附带生成的拣选 PR 链接(或失败原因)。
主要能力
- 通过斜杠命令批量提交多个 PR 号,支持空格或逗号分隔。
- 在触发前做参数校验:目标分支格式、分支是否存在于上游、每个 PR 是否为数字、是否存在、是否已合并、是否有合并提交。
- 本地预检:用 git merge-tree 模拟每个拣选,列出会变更的文件并提前发现冲突,避免为注定失败的 CI 付费。
- 检测目标分支上已有的拣选 PR(任意状态),按标题中的 (#<源PR>) 后缀交叉引用,区分已合并、仍开启、已关闭、无记录四种情况。
- 逐个派发工作流并解析运行 URL,必要时回退到轮询运行列表。
- 逐个监控运行至完成,收集结论,成功时找出本次运行创建的拣选 PR,失败时提取错误行。
- 输出预检报告表和最终批次汇总表,含成功/失败/未知计数。
使用方式
命令格式:
/sglang-cherrypick <target_branch> <pr1> [pr2 pr3 ...]
示例:
/sglang-cherrypick release/v0.5.7 25956 25958 25987
/sglang-cherrypick release/v0.5.7 25956,25958,25987
参数说明:
- target_branch(必填):形如 release/vX.Y 或 release/vX.Y.Z 的发布分支,必须已存在于 origin(即 sgl-project/sglang)。
- pr_numbers(必填,一个或多个):要拣选的已合并 PR 号,每个必须是正整数。
仓库:始终针对上游仓库 sgl-project/sglang。工作流的 job guard(if: github.repository == 'sgl-project/sglang')意味着在 fork 上触发是空操作。
执行流程分为六步:
- 校验参数:快速失败,不触发任何部分批次。
- 预检:定位上游 remote,拉取目标分支与各 PR 的合并提交,索引目标分支上已有的拣选 PR,对每个 PR 运行 git merge-tree 并 diff 结果,打印预检报告表。
- 派发:对每个 PR 执行 gh workflow run,解析运行 URL,必要时回退轮询。
- 监控:用 gh run watch 逐个等待运行完成。
- 收集结果:获取每个运行的结论,成功时找出创建的拣选 PR,失败时提取错误行。
- 最终汇总:按输入顺序打印汇总表与总计。
适用场景
- SGLang 发布管理者需要把多个已合并 PR 批量回移到 release 分支。
- 希望在触发 CI 前先在本地发现冲突、避免重复拣选。
- 需要逐 PR 的成功/失败报告与拣选 PR 链接。
限制与注意事项
- 技能从不修改工作流文件,只派发它。
- 仅作用于上游仓库 sgl-project/sglang,用户的 fork 在此无关。
- 工作流有按分支的并发控制(concurrency: cherry-pick-${{ target_branch }},cancel-in-progress: false),同一目标分支的多次派发会串行排队,客户端无法并行加速;跨不同目标分支则可并发。
- 不要跳过已合并状态预检:工作流会拒绝未合并的 PR,但技能希望先给出一次批量校验报告,而不是 N 次单独的工作流失败。
- 调用前应确保 gh auth status 已通过,否则应暴露认证错误并停止。
- 预检 git merge-tree 需要 git ≥ 2.38(--write-tree 选项),否则会报未知选项错误。
- 派发需要 token 具备 actions:write 权限,否则 gh workflow run 返回 403。
- 若预检干净但变更文件数为 0 且未发现已有拣选 PR,说明该提交已通过直接合并或 rebase 落在发布分支上,应跳过派发并提示该异常。
常见失败模式
- PR 未合并(state=OPEN):等待合并,或使用 --commit-sha(本斜杠命令不支持)。
- 目标分支不存在:确认分支名,发布管理者可能尚未切出该分支。
- 拣选因冲突失败:按工作流错误提示手动处理——git checkout release/v0.5.7 && git cherry-pick <SHA>,解决冲突,推送分支并手动开 PR。
- 预检 git merge-tree 报告冲突:从批次中移除该 PR 并手动解决。
- 没有指向 sgl-project/sglang 的 remote:添加上游 remote:git remote add upstream https://github.com/sgl-project/sglang.git。
- 预检报告 Prior cherry-pick: merged as #N:该 PR 已被拣选并合并,跳过以免产生重复 PR。
- 预检报告 Prior cherry-pick: OPEN as #N:上一次派发仍在进行,默认跳过并请用户先落地或关闭 #N。
- 多次运行但只检测到一个:两次派发落在同一轮询周期,可重跑缺失的 PR 或手动查找其运行。
- gh workflow run 返回 403:token 缺少 actions:write,使用具备工作流派发权限的 token。