在持续交付的过程中,需要手动确认,然后才能继续部署到生产环境。在本文中将实现这个过程,也是一个踩坑的过程。
如何实现
说出来其实很简单,如下所示:
1 | waiting-for-approval: |
这里面有两个关键字段: when 和 allow_failure 。
when
该字段指示在什么条件下执行该Job。可以使用如下值,
on_success(默认): 当上一个stage中的所有Job成功执行之后才能执行或者上一个stage中所有的Job 配置有字段allow_failure: true。manual: 手动触发该Job。always: 无论之前的stage是否成功,总是执行该Job。on_failure: 当上一个stage中有Job失败的情况下,执行该Job。delayed: 延迟一段时间执行该Job。never: 不执行该Job.
allow_failure
该字段决定了当前Job执行失败的情况下,是否继续执行pipeline。值可以是true 或者false 。
注意其默认值,这是比较坑的一点
- 当Job有
when: true时,默认值为true - 当Job有
when: true并且配置了rules,默认值为 false - 其他情况,默认值为
true
踩坑过程
踩坑
我想实现如所示pipeline

.gitlab-ci.yml 如下:
1 | image: alpine |
得到执行结果如下:
我还没有点approval,怎么就执行 deploy-to-prod 了?又看了一眼pipeline的状态是 passed ,怎么就 passed 了?
坑在哪里?
又去看看了文档Keyword reference for the .gitlab-ci.yml file | GitLab ,在 Additional details 中发现 了下面这段话
The default behavior of
allow_failurechanges totruewithwhen: manual. However, if you usewhen: manualwith[rules](https://docs.gitlab.com/ee/ci/yaml/#rules),allow_failuredefaults tofalse.
谜题解开了!
之后又找到另外一篇文档 Choose when to run jobs | GitLab ,创建一个必须被手动触发的Job。
填坑
修改.gitlab-ci.yml ,如下所示:
1 | image: alpine |
其执行结果如下:
