脚本、插件、内置任务:该用哪个
流水线里每一步(Stage)有几种写法。选错类型不是不能用,而是会多写一堆不该写的代码。
一、三种类型
1. 脚本任务——最直接
- name: build
script: |
npm install
npm run build
2. 插件任务——用一个镜像的 settings 传参
- name: 企业微信通知
image: tencentcom/wecom-message
settings:
robot: $WECOM_ROBOT
content: |
> **PR 需要评审:**
> **标题:** ${CNB_PULL_REQUEST_TITLE}
3. 内置任务——平台原生提供,用 type 声明,用 options 传参
- name: 随机添加一位评审人
type: git:reviewer
options:
type: add-reviewer-from-repo-members
二、优先级:内置 > 插件 > 脚本
判据只有一个:这件事在 CI/CD 里是不是通用动作。
- 通用动作(建 Release、更新 Issue、算覆盖率、删过期 Tag)→ 内置任务。免写脚本、免配凭据、结果还能
exports给后面用 - 对接外部服务(企业微信、飞书、TAPD、附件上传)→ 插件
- 你项目自己的业务逻辑 → 脚本
三、内置任务清单
| 分类 | 任务 | 干什么 |
|---|---|---|
| docker | docker:cache | 把目录构建成镜像缓存,跨节点复用 |
| cnb | cnb:apply | 触发当前仓库的另一条流水线 |
| cnb | cnb:trigger | 触发指定仓库的流水线 |
| cnb | cnb:await-resolve | 多流水线等待/通知 |
| cnb | cnb:read-file | 读文件内容导出为环境变量(不写日志) |
| cnb | cnb:destroy-token | 提前销毁 CNB_TOKEN |
| vscode | vscode:go | 推迟云原生开发入口出现时机 |
| git | git:reviewer | PR 自动加评审人 |
| git | git:auto-merge | PR 自动合并 |
| git | git:issue-update | 更新 Issue 状态与标签 |
| git | git:release | 按 Tag 建/更新 Release |
| git | git:pr-update | 改 PR 标题、标签 |
| git | git:pr-commit-message-preset | 预设 PR 合并时的提交信息 |
| testing | testing:coverage | 单测覆盖率上报 + 门禁 |
| artifact | artifact:remove-tag | 清理过期制品标签 |
| tapd | tapd:status-update / tapd:comment | 同步 TAPD 工作项 |
| knowledge | knowledge:update | 构建知识库 |
| npc | npc:go | 执行 NPC 任务 |
有几个特别值得用的:
cnb:read-file:读文件导出为环境变量,全程不写日志。比script: cat file安全得多cnb:destroy-token:用不到令牌了就提前销毁,缩小暴露窗口vscode:go:先装完依赖、拉起服务,再让云原生开发入口出现,避免进来就报错
四、插件任务的硬规则
插件的参数只能通过 settings 传,不能用 env:
# ❌ 错误:env 声明的变量不会传给插件
- name: notify
image: some-plugin
env:
KEY: value
# ✅ 正确:通过 settings
- name: notify
image: some-plugin
settings:
key: value
另外 settings 里的值支持环境变量插值,所以敏感信息用 imports 注入后引用即可。
五、脚本任务的几个坑
坑 1:默认 shell 不一定有 bash
官方镜像大多是 bash,但精简镜像(alpine 等)只有 sh。脚本里用了 [[ ]]、set -o pipefail 就会挂。
坑 2:多行脚本默认是 set -e 吗
不是。所以中间某条命令失败,后面的还会继续跑,最后可能"看起来成功"。稳妥写法:
- name: build
script: |
set -e
npm ci
npm run build
坑 3:$ 被 YAML 或 shell 抢先解释
要输出字面量 ${VERSION} 时用单引号包裹脚本,或者转义。
坑 4:Windows 自建节点默认走 PowerShell
- name: win
script: |
cmd /c ver
systeminfo | findstr /B /C:"OS Name"
ver 是 cmd 内置命令,必须通过 cmd /c 调。
六、任务结果怎么用
所有任务(脚本/插件/内置)执行完都有 result,通过 exports 导出:
- name: 算覆盖率
type: testing:coverage
options:
file: coverage/lcov.info
exports:
totalRate: COVERAGE
- name: 打标签
type: git:pr-update
options:
labels: coverage:$COVERAGE
from-key 支持深层取值(如 a.b.c),也支持从环境变量里拿 key。