在持续交付的过程中,需要手动确认,然后才能继续部署到生产环境。在本文中将实现这个过程,也是一个踩坑的过程。
如何实现
说出来其实很简单,如下所示:
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_failure
changes totrue
withwhen: manual
. However, if you usewhen: manual
with[rules](https://docs.gitlab.com/ee/ci/yaml/#rules)
,allow_failure
defaults tofalse
.
谜题解开了!
之后又找到另外一篇文档 Choose when to run jobs | GitLab ,创建一个必须被手动触发的Job。
填坑
修改.gitlab-ci.yml
,如下所示:
1 | image: alpine |
其执行结果如下: