await-resolve
cnb:await
cnb:resolve
await
会等待 resolve
的执行,resolve
可以向 await
传递变量或文件。
通过 await-resolve
,可以让多个并发的 pipeline
相互配合,实现更灵活的顺序控制。
提示
await-resolve
同 apply
、trigger
的区别:
前者指一个构建中某 pipeline
执行到 await
任务时等待对应 key
的 resolve
通知才会继续进行。
后者指一个 pipeline
触发新事件,开启新的构建。可以跨仓库。可以异步调用,也可以同步等待。
# 使用限制
- 只能对同一个事件触发的
pipeline
进行await
和resolve
操作 - 一个
key
仅能resolve
一次,但可以await
多次 - 通过
key
对await
和resolve
进行分组
# 死锁检测
await
和 resolve
相互配合可以完成灵活的流程控制,但也会引入更复杂的边界情况,比如:
pipeline-1
和pipeline-2
相互await
,即:死锁- 多条
pipeline
间存在await
环,即:间接死锁 await
一个不存在的key
,或者key
没有关联resolve
,即:无限等待resolve
所在pipeline
执行失败,对应的await
陷入无限等待- 多个
resolve
任务关联同一个key
,即重复resolve
抛出异常
死锁检测
机制会自动检测以上异常,结束 await
的等待状态,抛出 dead lock found.
异常。
await
和 resolve
的在配置文件中顺序不影响运行结果,即最后 await
任务一定是会等待相应的 resolve
完成,这种情况不会被死锁检测
机制终止。
# 适用事件
all
# await 参数
# 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