跳到主要内容

触发规则:什么时候跑,跑哪份代码

.cnb.yml 的四层结构里,前两层是"什么时候跑":分支 + 事件。这两层最容易踩坑,因为它决定了 CNB 去哪读配置、checkout 哪份代码。

一、分支匹配​

.cnb.yml
main: # 精确匹配
"dev/*": # glob:以 dev/ 开头(不跨 /)
"(main|dev)": # main 或 dev
"**/!(main|dev)": # 除 main、dev 外全部分支
$: # 兜底:没被任何 glob 匹配到的分支

匹配分两阶段:先跑所有 glob 规则,都没匹配上才用 $。多条 glob 同时匹配时,各条流水线并发执行。

:::warning 一个高频误解 .cnb.yml 的配置只对当前分支生效。你在 main 里写 dev: 下的流水线,dev 分支 push 时不会按它跑——系统会去读 dev 分支自己的 .cnb.yml。 :::

二、常用事件清单​

分类事件触发时机
分支push分支推送
分支commit.add推送包含新提交(额外给 CNB_NEW_COMMITS_COUNT)
分支branch.create / branch.delete分支创建 / 删除
PRpull_requestPR 创建、重开、源分支 push
PRpull_request.update上面这些 + 标题/描述修改
PRpull_request.target同上,但 checkout 目标分支
PRpull_request.mergeable保护分支 + 可合并 + 评审通过
PRpull_request.mergedPR 合并完成
PRpull_request.approved / .changes_requested评审通过 / 要求修改
PRpull_request.commentPR 评论
Tagtag_push推送 Tag
页面web_trigger / web_trigger_xxx页面按钮手动触发
APIapi_trigger / api_trigger_xxxOpenAPI 或 cnb:trigger 触发
定时crontab: ...cron 表达式
Issueissue.open / .close / .comment / .updateIssue 相关操作
NPCissue.comment@npc / pull_request.comment@npc评论里 @NPC

Issue 类事件有个硬性要求:必须挂在 $ 下。

三、最关键的一张表:跑哪份代码​

事件checkout 的代码
push、commit.add、branch.create当前分支最新 commit
issue.*、auto_tag、branch.delete默认分支最新 commit
tag_push该 Tag 的 commit
pull_request 系列预合并后的 commit
pull_request.target / .mergeable目标分支最新 commit
pull_request.merged合并后的 commit
pull_request.comment@npcPR 目标分支最新 commit
issue.comment@npc默认分支最新 commit
api_trigger可指定版本

"预合并"是什么意思:把源分支合到目标分支上,得到一份临时结果再 checkout。所以你测的是合并后的效果,能提前发现冲突和集成问题。

四、pull_request 和 pull_request.target 怎么选​

  • 想检查"我这个 PR 合进去会不会炸" → 用 pull_request(预合并)
  • 想在目标分支状态上跑独立任务(比如打标签、统计) → 用 pull_request.target

五、不可信事件:安全相关的常识​

以下事件被归为不可信事件,因为触发者可能没有仓库写权限:

pull_request、pull_request.update、pull_request.approved、pull_request.changes_requested、pull_request.comment、pull_request.comment@npc、所有 issue.* 事件、issue.comment@npc

对它们,平台会自动收窄 CNB_TOKEN:

  • 以触发者身份签发,且默认限定在当前仓库
  • 引用密钥仓库文件时必须通过 allow_events 显式声明允许

所以:涉及密钥、凭据、部署的动作,不要放在 PR/Issue 事件里跑。放在 push、tag_push 这类可信事件里。

六、跳过流水线​

三个办法:

# 1. commit message 里标记
git commit -m "docs: 改个说明 [ci skip]"

# 2. push 选项
git push origin main -o ci.skip

第三种是仓库层面的忽略:密钥仓库文件变更、仓库迁移、未勾选「允许自动触发」等,系统本来就不会触发。

前两种只在 push、commit.add、branch.create 上生效。

七、Fork 仓库默认不跑​

安全考虑,Fork 出来的仓库在 Git 操作事件、定时任务、Issue 事件下默认不执行流水线。需要在源仓库 设置 → 云原生构建 里勾选允许。

即便允许了,Fork 仓库流水线里的 CNB_TOKEN 也只能访问当前仓库。