除了 push,还能怎么触发
push 是最常用的触发方式,但不是唯一的。四种"主动触发"各有明确场景。
一、页面上放个按钮:web_trigger
给不熟悉命令行的人一个"点一下就发布"的入口。
配置分两处:.cnb/web_trigger.yml 定义按钮,.cnb.yml 定义按钮点击后跑什么。
.cnb/web_trigger.yml
branch:
- reg: ^release
buttons:
- name: 发布
event: web_trigger_release
inputs:
version:
name: 版本号
type: input
required: true
default: 1.0.0
env:
name: 环境
type: select
default: staging
options:
- name: 开发环境
value: dev
- name: 预发布
value: staging
- name: 生产环境
value: production
.cnb.yml
$:
web_trigger_release:
- stages:
- name: 发布到 $env
script: echo "发布 $version 到 $env"
要点:
reg是正则,控制按钮在哪些分支页面出现inputs支持八种类型:input、textarea、select、switch、radio、date、datetime、daterange- 用户填的值会变成环境变量(上面例子里是
$version、$env) - 目前只能在分支详情页配置按钮
.cnb/web_trigger.yml不支持include和imports
:::warning 日期默认值要加引号
default: "2026-08-01" 必须带引号,否则 YAML 会解析成 Date 对象。
:::
二、外部系统触发:api_trigger
事件名格式:api_trigger 或以 api_trigger_ 开头。
三个触发入口本质是同一个:OpenAPI(POST /{repo}/-/build/start),cnb:apply 和 cnb:trigger 都是对它的封装。
curl --request POST \
--url 'https://api.cnb.cool/<组织>/<仓库>/-/build/start' \
--header 'Authorization: Bearer <你的令牌>' \
--header 'Content-Type: application/json' \
--data '{
"event": "api_trigger_deploy",
"env": { "target": "prod" }
}'
注意 api_trigger 默认归入可信事件,CNB_TOKEN 权限较宽。如果想收窄成 NPC 语义,可以传 npc 字段。
三、到点自己跑:定时任务
.cnb.yml
main:
"crontab: 30 5,17 * * *":
- name: nightly-build-and-test
stages:
- name: run-tests
script: echo "Running scheduled tasks..."
三个必须知道的规则:
- 分支名必须是明确的单一分支,不支持 glob
- 最小间隔 5 分钟,
* * * * *提交不上去 - 执行身份是最后修改这条 crontab 配置的人——那个人离职或被移出仓库,任务就失败
第 3 条特别容易踩。团队里最好约定:定时任务配置由常驻负责人改。
四、跨仓库联动:cnb:trigger 和 cnb:apply
cnb:apply:触发当前仓库的另一条流水线cnb:trigger:触发指定仓库的流水线,可同步等结果
典型场景:A 仓库改了公共库,需要触发 B、C 两个下游仓库重新构建。
.cnb.yml
$:
push:
- stages:
- name: 触发下游
type: cnb:trigger
options:
slug: my-group/downstream-repo
event: api_trigger_build
多流水线之间要按顺序协作、传数据,用 cnb:await-resolve(cnb:await 等待 / cnb:resolve 通知)。
五、四类触发怎么选
| 需求 | 用什么 |
|---|---|
| 人点一下就走 | web_trigger + 页面按钮 |
| 系统自动调用 | api_trigger + OpenAPI |
| 时间到了就跑 | crontab |
| 仓库之间联动 | cnb:trigger / cnb:apply |
六、触发之后想确认真跑了没
云原生构建 → 历史事件。不过要注意:tag_deploy、web_deploy、API 事件、定时任务这些非代码事件不会出现在这里。它们要直接在构建列表里找。
另外重新构建产生的流水线也不在历史事件里。