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