Stage

# Stage介绍

  • type: Job | Array<Job> | Object<name: Job>

Stage 表示一个构建阶段,可以由一个或者多个 Job 组成,见 Job 介绍

# 单个 Job

如果一个 Stage 只有一个 Job,那么可以省掉 Stage 直接书写这个 Job

stages:
  - name: stage1
    jobs:
      - name: job A
        script: echo hello

可以简化为以下写法

- stages:
    - name: job A
      script: echo hello

# 串行 Job

当值为数组(有序)时,那么这组 Job 会串行执行。

# 串行
stages:
  - name: install
    jobs:
      - name: job1
        script: echo "job1"
      - name: job2
        script: echo "job2"

# 并行 Job

当值为对象(无序)时,那么这组 Job 会并行执行。

# 并行
stages:
  - name: install
    jobs:
      job1:
        script: echo "job1"
      job2:
        script: echo "job2"

多个 Job 串行、并行可灵活组织。 先串行后并行的示例:

main:
  push:
    - stages:
        - name: serial first
          script: echo "serial"
        - name: parallel
          jobs:
            parallel job 1:
              script: echo "1"
            parallel job 2:
              script: echo "2"
        - name: serial next
          script: echo "serial next"

# name

  • type: String

Stage 名称。

# ifNewBranch

  • type: Boolean
  • default: false

true 表示只有当前分支属于新分支(即 CNB_IS_NEW_BRANCHtrue)时,才执行此 Stage

当同时存在 ifNewBranch / ifModify / if 有一个条件满足,此 Stage 就会执行

# ifModify

  • type: Array<String> | String

指定只有相应文件变动时,才执行此 Stage。 是一个 glob 匹配表达式字符串或字符串数组。

# if

  • type: Array<String> | String

一个或者多个 Shell 脚本,根据脚本执行的退出程序码(exit code)来判断是否执行此 Stage。 当退出程序码为 0 时,表示需要执行本步骤。

示例1:判断某个变量的值

shell表达式语法 (opens new window)

main:
  push:
    - env:
        IS_NEW: true
      stages:
        - name: is new
          if: |
            [ "$IS_NEW" = "true" ]
          script: echo is new
        - name: is not new
          if: |
            [ "$IS_NEW" != "true" ]
          script: echo not new

示例2: 判断任务执行的输出

main:
  push:
    - stages:
        - name: make info
          script: echo 'haha'
          exports:
            info: RESULT
        - name: run if RESULT is haha
          if: |
            [ "$RESULT" = "haha" ]
          script: echo $RESULT

# env

  • type: Object

Pipeline env,只对当前 Stage 生效。

Stage env 优先级比 Pipeline env 高。

# imports

  • type: Array<String> | String

Pipeline imports,只对当前 Stage 生效。

# retry

  • type: Number
  • default: 0

失败重试次数,0 表示不重试。

# lock

  • type: BooleanObject

Stage 设置锁,Stage 执行完后自动释放锁,锁不能跨仓库使用。

表现: 任务 A 获取到锁后,任务 B 再申请锁,将等待锁释放后,才能获取到锁继续执行任务。

  • lock.key

    • type: String

    自定义锁名,默认值为 分支名-流水线名-stage下标

  • lock.expires

    • type: Number
    • default: 3600(一小时)

锁过期时间,过期后自动释放锁,单位“秒”。

  • lock.wait

    • type: Boolean
    • default: false

锁被占用是否等待。

  • lock.timeout

    • type: Number
    • default: 3600(一小时)

指定等待锁的超时时间,单位“秒”。

例1: lockBoolean 格式

main:
  push:
    - stages:
        - name: stage1
          lock: true
          jobs:
            - name: job1
              script: echo "job1"

例2: lockObject 格式

main:
  push:
    - stages:
        - name: stage1
          lock:
            key: key
            expires: 600 # 10分钟
            wait: true
            timeout: 60 # 最多等待 1分钟
          jobs:
            - name: job1
              script: echo "job1"

# image

  • type: Object | String

指定当前 Stage 的环境镜像,在当前 Stage 下的所有任务默认都将在这个镜像环境中执行。

  • image.name: String 镜像名,如 node:20
  • image.dockerUser: String 指定 Docker 用户名,用于拉取指定的镜像。
  • image.dockerPassword: String 指定 Docker 用户密码,用于拉取指定的镜像。

如果指定 image 为字符串,则等同于指定了 image.name