流水线为什么没跑 / 为什么被杀了
这篇解决两类问题:没跑起来,和跑到一半被杀了。
一、没跑起来:按顺序查五步
官方 FAQ 给的排查顺序,照着走一遍基本能定位:
- 代码真的 push 到远端了吗——
git log origin/main看一眼 - 对应分支有
.cnb.yml吗——注意是"对应分支",不是默认分支 - 配置语法对吗——YAML 缩进错、
include的文件没权限,都会静默不跑 - 声明了当前分支的当前事件吗——你在
pull_request里等push当然是空的 - 命中 skip 检测了吗——
[ci skip]、密钥仓库变更、未勾选自动触发
:::tip 最快的入口
云原生构建 → 历史事件,没触发的事件不可点,但鼠标悬停会直接告诉你原因。这一步比人肉排查快十倍。
:::
二、几个特别隐蔽的坑
默认分支不一定是 main
从其他平台迁移的仓库,默认分支可能是 master。issue.*、tag_push 之外的一些事件读的是默认分支的配置,写错就白配。
评论数超过 100 条后,@NPC 不再触发
issue.comment / pull_request.comment / @npc 事件在评论数 > 100 时全部不再触发流水线。老 Issue 里 @ 机器人没反应,多半是这个。
同一分支下有多条 glob 都匹配
它们会并发执行,不是取第一个。你可能收到多份构建结果。
改了 title / description 触发的是 pull_request.update
pull_request 不含标题描述修改。想覆盖全部变更用 .update。
三、被杀了:超时规则
| 层级 | 默认限制 |
|---|---|
| 流水线整体 | 最长 20 小时,超时容器销毁 |
| 单个任务(Job)无输出 | 连续 10 分钟无输出即超时 |
| 单个任务最大执行 | 默认 2 小时,最多可调到 12 小时 |
自己声明 timeout 可以同时改"无输出超时"和"最大执行时间":
main:
push:
- stages:
- name: build
image: node:20
script: |
npm install
npm run build
timeout: 30m
写了 timeout: 30m 之后:连续 30 分钟无输出才超时(替代默认 10 分钟),最长执行 30 分钟。单位支持 ms、s、m、h。
:::warning 无输出超时是最常见的“假死”
很多卡死的任务其实是被"10 分钟无输出"杀的。长任务记得定期打印进度,或者直接调大 timeout。
:::
四、失败时做兜底
main:
pull_request:
- stages:
- name: lint
script: npm run lint
- name: test
script: npm test
failStages:
- name: notify
script: echo "检查失败"
failStages 在任一 stage 失败后执行,适合发通知、归档现场日志。
五、本地好 CI 不好:登进容器看
这是 CI 环境不一致的经典问题。CNB 提供了「登录调试」:
- 构建过程中:日志页直接点「登录调试」
- 构建结束后:日志页勾选
Debug,点Rebuild,新构建结束后环境保留 5 分钟供你登入
系统会定时检测登录状态:无人登录就销毁,有人登录就续命,最长 1 小时。
更精准的用法是只重跑可疑的那一段——Rebuild 时勾选具体 Pipeline / Stage / Job,再登进去核对产物(比如 node_modules 和本地是否一致)。
:::tip 注意前置依赖 只勾选后面的 Stage 时,如果它依赖前面的产物,会因为缺产物而失败。按需把前置任务一起勾上。 :::
六、构建日志、耗时怎么用
- 失败先看第一个报错的 stage,后面的错误往往是被连带的
- 耗时排行看每个 stage 的耗时条,优化要打最长的那个
- 构建历史可以下载,方便贴给别人看