基于 Docker 生态,对环境、缓存、插件进行抽象,通过声明式的语法,帮助开发者以更酷的方式构建软件。
声明式:声明式语法,可编程、易分享。 易管理:与代码一起,同源管理。 云原生:资源池化,屏蔽基础设施复杂性。
创建一个新的仓库
使用git clone 到本地
git clone https://your-git.com/your-repo.git
云原生构建 会在收到事件时,从对应的分支获取、解析 .cnb.yml 配置文件,从中获取对应分支下对应事件的流水线配置,然后执行构建。
以 main 分支代码 push 事件为例:

# 分支名
main:
# 事件名,push代表提交代码时出发
push:
# 流水线
- stages:
# 任务名字
- name: hello cnb
script: echo "hello cnb"

串行任务:同一Pipeline内的Stage顺序执行
$:
push:
- stages:
- name: hello cnb
script: echo "hello word" && sleep 2
- name: hello cnb2
script: echo "hello word2"
并行任务:多条Pipeline在同一事件下并行执行
$:
push:
# 流水线
- stages:
- name: hello cnb
script: echo "hello word" && sleep 2
- name: hello cnb2
script: echo "hello word2"
# 流水线
- stages:
- name: hello cnb3
script: echo "hello word3"
对应代码仓库的分支,用于匹配事件对应的分支,指定流水线配置。
注意:在某个分支下 .cnb.yml 配置了其他分支的流水线,并不代表其他分支的事件会按此配置执行流水线,而是看各分支下具体的 .cnb.yml 的配置。
以下将创建dev、dev-2、dadong 三个分支进行演示
# 定义模板
push_pipeline: &push_pipeline
- stages:
- name: CNB_BRANCH
# $CNB_BRANCH 代表当前分支名字
script: echo $CNB_BRANCH
# 匹配以 dev 开头的所有分支
"dev*":
push:
# 使用模板
- <<: *push_pipeline
# 匹配 main 或 dev 分支
"(main|dev)":
push:
- <<: *push_pipeline
# 匹配除 main 和 dev 以外的所有分支
"**/!(main|dev)":
push:
- <<: *push_pipeline
# 匹配所有分支
"**":
push:
- <<: *push_pipeline
# 兜底,匹配没有 glob 匹配的分支
"$":
push:
- <<: *push_pipeline
这里只介绍常用的cnb触发事件,其他触发事件,请参考官方文档
说明: 当分支触发push时触发相应流水线
$:
push:
- stages:
- name: hello cnb
script: echo "hello word"
Tag push 时触发

# 对指定 tag 生效
v1.0.*:
tag_push:
- stages:
- name: echo tag name
script: echo $CNB_BRANCH
# 对所有 tag 生效
$:
tag_push:
- stages:
- name: echo tag name
script: echo $CNB_BRANCH
触发方式:仅支持在仓库的 Tag 列表页面,点击 自动生成 Tag 按钮触发。

规则:默认规则,仅 feat 、 fix 、 perf 三种格式的提交注释会生成 tag

简单案例:在每天的16:30定时输出hello cnb
注意:
定时任务最小的时间间隔为 5 分钟,低于 5 分钟间隔的定时任务(例如:* * * * *)将无法成功添加。
定时任务流水线分支名不支持 glob 表达式,需要明确的分支名,例如 main,dev
main:
# 定时流水线
"crontab: 30 16 * * *":
# 修改内容可重新关联定时任务触发者,建议修改name,改出问题的风险低
- name: crontab
stages:
- name: echo
script: echo hello cnb
通过 env 声明环境变量,当触发阶段的环境变量和流水线中的环境变量冲突时,优先使用流水线中的环境变量
main:
push:
- env:
RELEASE_MSG: CNB RELEASE
DD_MSG: dd msg
stages:
- name: print env
env:
RELEASE_MSG: RELEASE-1
script: echo "RELEASE_MSG:${RELEASE_MSG},DD_MSG:${DD_MSG}"
通过 imports 导入一个密钥仓库文件,可将敏感信息注入到环境变量,供后续任务使用。
当 env 和 imports 的 key 冲突时,优先使用 env

main:
push:
# 导入密钥仓库文件为环境变量
imports: https://cnb.cool/dadong.cnb/test/test1/-/blob/main/env/envs.yml
stages:
- name: username
script: echo $TEST_USER
- name: passwd
script: echo $TEST_PASSWD
Job 执行结束后,有一个 result 对象,可通过 exports 将 result 中的属性导出到环境变量,生命周期为当前 Pipeline。
script 自定义脚本任务执行完,Job result的属性有:
code: 返回码
stdout: 标准输出
stderr: 标准错误
info: 标准输出、标准错误,按时序的混合体
main:
push:
- stages:
- name: set env
script: echo -n $(date "+%Y-%m-%d %H:%M")
exports:
code: CODE
info: INFO
- name: echo env
script:
- echo $CODE
- echo $INFO
可以覆盖已有的环境变量,设为空字符串或 null 即为删除。
main:
push:
- env:
DATE_INFO: 20220212
DELETE: dadong
stages:
- name: set env
script: echo -n $(date "+%Y-%m-%d %H:%M")
exports:
# 新增
code: CODE
# 修改
info: DATE_INFO
# 删除
# DELETE: null
# 删除
DELETE:
- name: echo env
script:
- echo $CODE
- echo $DATE_INFO
- echo $DELETE