跳到主要内容

脚本、插件、内置任务:该用哪个

流水线里每一步(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、附件上传)→ 插件
  • 你项目自己的业务逻辑 → 脚本

三、内置任务清单​

分类任务干什么
dockerdocker:cache把目录构建成镜像缓存,跨节点复用
cnbcnb:apply触发当前仓库的另一条流水线
cnbcnb:trigger触发指定仓库的流水线
cnbcnb:await-resolve多流水线等待/通知
cnbcnb:read-file读文件内容导出为环境变量(不写日志)
cnbcnb:destroy-token提前销毁 CNB_TOKEN
vscodevscode:go推迟云原生开发入口出现时机
gitgit:reviewerPR 自动加评审人
gitgit:auto-mergePR 自动合并
gitgit:issue-update更新 Issue 状态与标签
gitgit:release按 Tag 建/更新 Release
gitgit:pr-update改 PR 标题、标签
gitgit:pr-commit-message-preset预设 PR 合并时的提交信息
testingtesting:coverage单测覆盖率上报 + 门禁
artifactartifact:remove-tag清理过期制品标签
tapdtapd:status-update / tapd:comment同步 TAPD 工作项
knowledgeknowledge:update构建知识库
npcnpc: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。