await-resolve

  • cnb:await
  • cnb:resolve

await 会等待 resolve 的执行,resolve 可以向 await传递变量或文件。

通过 await-resolve,可以让多个并发的 pipeline 相互配合,实现更灵活的顺序控制。

提示

await-resolveapplytrigger 的区别:

前者指一个构建中某 pipeline 执行到 await 任务时等待对应 keyresolve 通知才会继续进行。

后者指一个 pipeline 触发新事件,开启新的构建。可以跨仓库。可以异步调用,也可以同步等待。

# 使用限制

  1. 只能对同一个事件触发的 pipeline 进行 awaitresolve 操作
  2. 一个 key 仅能 resolve 一次,但可以 await 多次
  3. 通过 keyawaitresolve 进行分组

# 死锁检测

awaitresolve 相互配合可以完成灵活的流程控制,但也会引入更复杂的边界情况,比如:

  1. pipeline-1pipeline-2 相互 await,即:死锁
  2. 多条 pipeline 间存在 await 环,即:间接死锁
  3. await 一个不存在的 key,或者 key 没有关联 resolve,即:无限等待
  4. resolve 所在 pipeline 执行失败,对应的 await 陷入无限等待
  5. 多个 resolve 任务关联同一个 key,即抛出异常

死锁检测 机制会自动检测以上异常,结束 await 的等待状态,抛出 dead lock found. 异常。

awaitresolve 的在配置文件中顺序不影响运行结果,即最后 await 任务一定是会等待相应的 resolve 完成,这种情况不会被死锁检测机制终止。

# 适用事件

all

# await 参数

# key

  • type: String
  • required: true

配对ID

# resolve 参数

# key

  • type: String
  • required: true

配对ID

# data

  • type: object
  • required: false

要传递的对象

key:value 格式,支持多级。示例:

- name: resolve a json
  type: cnb:resolve
  options:
    key: demo
    data:
      a: 1
      b:
        c: 2

await 任务的结果,是 resolve 声明的 data 对象。

可以通过 exports 访问这个对象,示例:

- name: await a json
  type: cnb:await
  options:
    key: demo
  exports:
    a: VAR_A
    b.c: VAR_B
- name: show var
  script:
    - echo ${VAR_A}    # 1
    - echo ${VAR_B}    # 2

当然,也可以不传送任务内容,仅仅表示一个等待动作:

- name: ready
  type: cnb:resolve
  options:
    key: i-am-ready
- name: ready
  type: cnb:await
  options:
    key: i-am-ready

# 输出结果

{
  // resolve 返回的 data 内容
  data
}

# 配置样例

  • 传送文件
main:
  push:
    - runner:
        tags: cnb:arch:arm64:v8
      stages:
        - name: show Architecture
          script: lscpu | grep Architecture
        - name: hello
          script:
            - echo hello
            - mkdir ./files/
            - touch ./files/hello
        - name: resolve hello
          type: cnb:resolve
          options:
            key: u-nide-kuaidi
            dist: files
    - runner:
        tags: cnb:arch:amd64
      stages:
        - name: show Architecture
          script: lscpu | grep Architecture
        - name: await hello
          type: cnb:await
          options:
            key: u-nide-kuaidi
        - name: show files
          script: ls -l files