大冬の小站

04 CNB 云原生构建

2025/11/09
4
0

云原生构建简介

基于 Docker 生态,对环境、缓存、插件进行抽象,通过声明式的语法,帮助开发者以更酷的方式构建软件。

声明式:声明式语法,可编程、易分享。 易管理:与代码一起,同源管理。 云原生:资源池化,屏蔽基础设施复杂性。

一、快速开始

1 入门流水线

创建一个新的仓库

20250711150357使用git clone 到本地

git clone https://your-git.com/your-repo.git

云原生构建 会在收到事件时,从对应的分支获取、解析 .cnb.yml 配置文件,从中获取对应分支下对应事件的流水线配置,然后执行构建。

以 main 分支代码 push 事件为例:

20250711154353

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

20250711153324

2 串/并行任务

串行任务:同一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"

二、触发规则

1 触发分支

对应代码仓库的分支,用于匹配事件对应的分支,指定流水线配置。

注意:在某个分支下 .cnb.yml 配置了其他分支的流水线,并不代表其他分支的事件会按此配置执行流水线,而是看各分支下具体的 .cnb.yml 的配置。

以下将创建devdev-2dadong 三个分支进行演示

# 定义模板
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

2 常见触发事件

这里只介绍常用的cnb触发事件,其他触发事件,请参考官方文档

1 Push事件

说明: 当分支触发push时触发相应流水线

$:
  push:
    - stages:
      - name: hello cnb
        script: echo "hello word"

2 Tag 事件

Tag push 时触发

20250714155436

# 对指定 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

3 auto_tag 事件

触发方式:仅支持在仓库的 Tag 列表页面,点击 自动生成 Tag 按钮触发。

20250714155809

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

20250714163039

4 定时事件

简单案例:在每天的16:30定时输出hello cnb

注意:

  1. 定时任务最小的时间间隔为 5 分钟,低于 5 分钟间隔的定时任务(例如:* * * * *)将无法成功添加。

  2. 定时任务流水线分支名不支持 glob 表达式,需要明确的分支名,例如 maindev

main:
  # 定时流水线
  "crontab: 30 16 * * *":
    # 修改内容可重新关联定时任务触发者,建议修改name,改出问题的风险低
    - name: crontab
      stages:
        - name: echo
          script: echo hello cnb

三、环境变量

1 声明环境变量

通过 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}"

2 导入环境变量

  1. 通过 imports 导入一个密钥仓库文件,可将敏感信息注入到环境变量,供后续任务使用。

  2. envimportskey 冲突时,优先使用 env

20250714194625

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

3 导出环境变量

Job 执行结束后,有一个 result 对象,可通过 exportsresult 中的属性导出到环境变量,生命周期为当前 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

4 增删改查环境变量

可以覆盖已有的环境变量,设为空字符串或 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