跳转到内容

cnb-rs build rerun ​

cnb-rs build rerun <sn> [--event <EVENT>] [--sync]
cnb-rs run rerun <sn>     # 命令组 alias

按构建号 (SN) 重跑历史构建。对齐 gh run rerun。

流程:

  1. 用 <sn> 过滤 build list 拿到原构建的 branch / commit
  2. 用 api_trigger 事件(CNB API 硬性要求)+ 同 branch + 同 commit 调 start_build 发起新构建
  3. 轮询新构建,识别事件未定义时生成的空 error 构建
  4. 打印新构建号和日志 URL,或给出流水线配置诊断

BRANCH 字段 caveat

原构建同时有 sha 和 branch 时,CNB 后端会以 sha 为主、不回填 BRANCH 字段,build list 表里新构建 BRANCH 列可能显示为空。你仍能在 status / stage 里看到实际构建走的 commit 是对的。这是 CNB 后端约定不是 rerun 缺陷,rerun 命令会在成功段主动提示。

选项 ​

  • <sn>:要重跑的构建号(必填)
  • -e, --event <EVENT>:触发事件名,默认 api_trigger
  • --sync:等待构建正式触发再返回

继承的全局选项:

  • --repo <REPO>:指定仓库路径(格式:group/repo)
  • --json:以 JSON 格式输出
  • --domain <DOMAIN>:指定目标域名(默认:cnb.cool)

--json 保持原有 BuildResult JSON 结构,避免破坏脚本兼容性;事后探测只在命中配置错误时影响退出码并向 stderr 输出诊断。

为什么默认 event 是 api_trigger ​

CNB POST /-/build/start 服务端硬性约束:

Event must be api_trigger or start with api_trigger_.

原 event(vscode / push / pr / cron)都是 CNB 平台内部通道触发(IDE 启动 / git push hook / 定时器),不能从 API 反向触发。 所以 rerun 默认把 event 重写为 api_trigger;仓库 .cnb.yml 需要提前为该事件定义构建配置。事件未定义时,服务端仍会接受请求并创建新构建,但该构建会随即进入 error 状态且没有正常流水线;rerun 会短暂轮询并给出明确诊断,以非零状态退出。

如果你希望走仓库中已定义的其他 api_trigger_<suffix> 子配置,用 --event 覆盖。

与 gh 的差异 ​

  • gh run rerun 重跑同一个 GitHub Actions run(保留 run id)
  • CNB 没有「重用同一 build record」的概念,每次都是新 SN;语义对齐为「用同 commit / 分支 再触发一次」

示例 ​

bash
# 重跑某次历史构建(默认事件 api_trigger)
$ cnb-rs build rerun cnb-bp7-1jooim7cn
从构建 cnb-bp7-1jooim7cn 提取参数:
  分支:   main
  Commit: 5d1764d6913491540fdf3c1dd9316d93e066d223
  原事件: vscode
  新事件: api_trigger (CNB API 仅接受 api_trigger∗)

✓ 构建已重新触发
  新构建号: cnb-xxx-1jp1234ab
  日志:     https://cnb.cool/wwvo/cnb-rs/cnb-rs/-/build/cnb-xxx-1jp1234ab

# 用自定义 api_trigger 子配置
$ cnb-rs build rerun cnb-bp7-1jooim7cn --event api_trigger_release

# 等待构建正式触发后再返回
$ cnb-rs build rerun cnb-bp7-1jooim7cn --sync

# JSON 输出供脚本使用
$ cnb-rs build rerun cnb-bp7-1jooim7cn --json

错误诊断 ​

仓库 .cnb.yml 没有为 api_trigger 事件配置时,服务端有两种表现(实测两者都会出现):直接返回 HTTP 422 [CONFIG_EVENT_EMPTY],或先成功创建构建、随后立刻置为 error。两种情况 rerun 都会给出同一句诊断;后者显示为:

✗ 新构建 cnb-xxx-1jp1234ab 立即失败:该 commit 的 .cnb.yml 没有为事件 `api_trigger` 定义流水线。请用 `--event api_trigger_<name>` 指定已定义的事件(查看:`cnb-rs repo file view .cnb.yml`);构建日志:https://cnb.cool/wwvo/cnb-rs/cnb-rs/-/build/cnb-xxx-1jp1234ab
错误: 构建重跑失败

解决方法:用 --event api_trigger_<name> 选择 .cnb.yml 中已有的事件,或在仓库 .cnb.yml 顶层加 api_trigger 事件定义,例:

yaml
main:
  api_trigger:
    - runner:
        cpus: 2
      docker:
        image: docker.cnb.cool/your/image
      stages:
        - name: build
          script: echo "rerun by API"

另请参阅 ​

Released under the MIT License.