自定义部署流程

云原生构建支持自定义部署流程,通过自定义部署环境、审批流程、部署流水线,实现自动化的部署流程。

操作示例:

自定义部署环境

在仓库根目录下添加 .cnb/tag_deploy.yml 文件用于配置部署环境。 如下示例中定义了 developmentstagingproduction 三种环境,用户可在页面上选择需要部署的环境类型。

  1# .cnb/tag_deploy.yml
  2environments:
  3  # name: 环境名,点击该环境对应的部署按钮将触发 .cnb.yml 中的 tag_deploy.development 事件流水线
  4  - name: development
  5    description: Development environment
  6    # 环境变量(触发流水线时,会将环境变量传入流水线,包括部署流水线、web_trigger 流水线)
  7    env:
  8      name: development
  9      # CNB_BRANCH: 环境变量,部署事件中,为 tag 名
 10      tag_name: $CNB_BRANCH
 11
 12  - name: staging
 13    description: Staging environment
 14    env:
 15      name: staging
 16      # CNB_BRANCH: 环境变量,部署事件中,为 tag 名
 17      tag_name: $CNB_BRANCH
 18
 19  - name: production
 20    description: Production environment
 21    # 环境变量(触发流水线时,会将环境变量传入流水线,包括部署流水线、web_trigger 流水线)
 22    env:
 23      name: production
 24      # CNB_BRANCH: 环境变量,部署事件中,为 tag 名
 25      tag_name: $CNB_BRANCH
 26    button:
 27      - name: 创建审批单
 28        # 如存在,则将作为流水线 title,否则流水线使用默认 title
 29        description: 自动创建审批单流程
 30        # 需要在 .cnb.yml 中自定义 web_trigger_approval 事件流水线
 31        event: web_trigger_approval
 32        # 权限控制,不配置则有仓库写权限的用户可触发构建
 33        # 如果配置,则需要有仓库写权限,并且满足 roles 或 users 其中之一才有权限触发构建
 34        permissions:
 35          # roles 和 users 配置其中之一或都配置均可,二者满足其一即可
 36          roles:
 37            - owner
 38            - developer
 39          users:
 40            - name1
 41            - name2
 42        # 传给 web_trigger_approval 事件流水线的环境变量
 43        # 可继承上一级别环境变量,优先级高于上一级别环境变量
 44        env:
 45          name1: value1
 46          name2: value2
 47
 48    # 部署前置条件检查(支持对环境、元数据、审批流程的检查),满足所有前置条件才可进行部署操作
 49    require:
 50      # 1 对部署环境是否满足要求的检查
 51
 52      # 1.1 要求 development 环境部署成功
 53      - environmentName: development
 54
 55      # 1.2 要求 staging 环境部署成功 30 分钟后
 56      - environmentName: staging
 57        after: 1800
 58
 59      # 2 对元数据是否满足要求的检查
 60
 61      # 2.1 键值 key1 对应的 value 不为空,即有值
 62      - annotation: key1
 63
 64      # 2.2 键值 key1 对应的 value 值需等于 value1
 65      - annotation: key1
 66        expect:
 67          eq: value1
 68
 69      # 2.3 键值 key2 对应的 value 值需大于 1 且小于 10
 70      - annotation: key2
 71        expect:
 72          and:
 73            gt: 1
 74            lt: 10
 75        # 自定义按钮,点击可触发执行 web_trigger_annotation 事件。
 76        # 可定义与 require 信息有关的按钮事件,当 require 满足条件后隐藏按钮
 77        button:
 78          - name: 生成元数据
 79            event: web_trigger_annotation
 80            # 如存在,则将作为流水线 title,否则流水线使用默认 title
 81            description: 生成元数据流程
 82            # 权限控制,不配置则有仓库写权限的用户可触发构建
 83            # 如果配置,则需要有仓库写权限,并且满足 roles 或 users 其中之一才有权限触发构建
 84            permissions:
 85              # roles 和 users 配置其中之一或都配置均可,二者满足其一即可
 86              roles:
 87                - owner
 88                - developer
 89              users:
 90                - name1
 91                - name2
 92            # 传给 web_trigger_annotation 事件流水线的环境变量
 93            # 可继承上一级别环境变量,优先级高于上一级别环境变量
 94            env:
 95              name1: value1
 96              name2: value2
 97
 98      # 3 对审批流程是否满足要求的检查(可按以下方式自定义审批流程)
 99      # - 审批顺序:如下 1、2、3 审批流程需按顺序进行,即 1 审批通过,2 才能进行审批。1、2、3 审批流程全部通过才算通过审批
100      # - 审批操作:包括 同意、拒绝。一人同意即算通过。如果拒绝,其他审批人无法再操作,直到拒绝的审批人再修改审批结果为同意
101
102      # 3.1 按用户名审批,其中一人审批通过即可
103      - approver:
104          users:
105            - user1
106            - user2
107            - user3
108        title: 测试审批
109
110      # 3.2 按角色审批,其中一人审批通过即可
111      - approver:
112          roles:
113            - developer
114            - master
115        title: 开发审批
116
117      # 3.3 按用户名或角色审批(审批人满足 users 或 roles 其一即可),其中一人审批通过才行
118      - approver:
119          users:
120            - user4
121            - user5
122          roles:
123            - master
124            - owner
125        title: 运维审批
126
127    # 自定义部署按钮(缺省值:默认展示一个部署按钮)
128    # 使用场景:有多个不同模块(例如仓库、CI、制品库等),需要分开独立部署时,可以配置多个不同的按钮
129    # 注意:部署流水线中要区分是哪个模块,可以通过传入流水线的环境变量来区分
130    deploy:
131      - name: 部署按钮名1
132        description: 部署按钮描述
133        # 环境变量(触发部署流水线时,会将环境变量传入流水线),优先级高于上一级 env
134        env:
135          name1: value1
136          name2: value2
137      - name: 部署按钮名2
138        description: 部署按钮描述
139        # 环境变量(触发部署流水线时,会将环境变量传入流水线),优先级高于上一级 env
140        env:
141          name1: value1
142          name2: value2

自定义部署前置条件

对于每个环境可定义部署前置条件,只有满足所有前置条件才可进行部署操作。可定义如下三种前置条件:

环境部署前置条件示例

 1# .cnb/tag_deploy.yml
 2environments:
 3  - name: development
 4    description: Development environment
 5    env:
 6      name: development
 7      tag_name: $CNB_BRANCH
 8
 9  - name: staging
10    description: Staging environment
11    env:
12      name: staging
13      tag_name: $CNB_BRANCH
14    require:
15      # 要求 development 环境部署成功
16      - environmentName: development
17
18  - name: production
19    description: Production environment
20    require:
21      # 要求 staging 环境部署成功 30 分钟后
22      - environmentName: staging
23        after: 1800

元数据前置条件示例

 1# .cnb/tag_deploy.yml
 2environments:
 3  - name: production
 4    description: Production environment
 5    require:
 6      # 对元数据是否满足要求的检查
 7
 8      # 键值 key1 对应的 value 不为空,即有值
 9      - annotation: key1
10
11      # 键值 key2 对应的 value 值需等于 value1
12      - annotation: key2
13        expect:
14          eq: value2
15
16      # 键值 key3 对应的 value 值需大于 1 且小于 10
17      - annotation: key3
18        expect:
19          and:
20            gt: 1
21            lt: 10
22        # 自定义按钮,点击可触发执行 web_trigger_annotation 事件。
23        # 可定义与 require 信息有关的按钮事件,当 require 满足条件后隐藏按钮
24        button:
25          - name: 生成元数据
26            event: web_trigger_annotation
27            # 如存在,则将作为流水线 title,否则流水线使用默认 title
28            description: 生成元数据流程
29            # 传给 web_trigger_annotation 事件流水线的环境变量
30            # 可继承上一级别环境变量,优先级高于上一级别环境变量
31            env:
32              name1: value1
33              name2: value2

审批流程前置条件示例

可自定义审批流程和指定审批人。有权限的审批人可进行审批操作(同意、拒绝)。全部流程审批通过后,即算满足要求

 1# .cnb/tag_deploy.yml
 2environments:
 3  - name: production
 4    description: Production environment
 5    require:
 6      # 对审批流程是否满足要求的检查(可按以下方式自定义审批流程)
 7      # - 审批顺序:如下 1、2、3 审批流程需按顺序进行,即 1 审批通过,2 才能进行审批。1、2、3 审批流程全部通过才算通过审批
 8      # - 审批操作:包括 同意、拒绝。一人同意即算通过。如果拒绝,其他审批人无法再操作,直到拒绝的审批人再修改审批结果为同意
 9
10      # 按用户名审批,其中一人审批通过即可
11      - approver:
12          users:
13            - user1
14            - user2
15            - user3
16        title: 测试审批
17
18      # 按角色审批,其中一人审批通过即可
19      - approver:
20          roles:
21            - developer
22            - master
23        title: 开发审批
24
25      # 按用户名或角色审批(审批人满足 users 或 roles 其一即可),其中一人审批通过才行
26      - approver:
27          users:
28            - user4
29            - user5
30          roles:
31            - master
32            - owner
33        title: 运维审批

自定义部署流水线

如下示例定义了三种环境的部署事件流水线, 当在页面中选择部署 development 环境时,则触发 tag_deploy.development 事件。 流水线基于当前 tag 对应的代码进行部署操作。

 1# .cnb.yml
 2$:
 3  tag_deploy.development:
 4    - name: dev
 5      stages:
 6        - name: 部署环境名
 7          script: echo $name
 8        - name: tag 名
 9          script: echo $tag_name
10  tag_deploy.staging:
11    - name: staging
12      stages:
13        - name: 部署环境名
14          script: echo $name
15        - name: tag 名
16          script: echo $tag_name
17  tag_deploy.production:
18    - name: production
19      stages:
20        - name: 部署环境名
21          script: echo $name
22        - name: tag 名
23          script: echo $tag_name

示例中的流水线事件名和部署环境类型对应关系如下:

自定义按钮触发的 web_trigger 事件

tag_deploy.yml 中的自定义按钮,仅支持触发 web_trigger事件 事件。 如下流水线配置中,web_trigger_annotation 事件执行时,会进行上传元数据操作。

 1# .cnb.yml
 2$:
 3  # 自定义按钮可触发的事件
 4  web_trigger_annotation:
 5    - stages:
 6        - name: 上传元数据
 7          image: cnbcool/annotations:latest
 8          settings:
 9            data: |
10              key1=value1
11              key2=value2

部署权限说明

需有 仓库写权限 且有 推送 Tag 权限的用户才能进行部署操作。