0%

Gitlab pipeline 等待手动操作

在持续交付的过程中,需要手动确认,然后才能继续部署到生产环境。在本文中将实现这个过程,也是一个踩坑的过程。

如何实现

说出来其实很简单,如下所示:

1
2
3
4
5
6
waiting-for-approval:
stage: waiting-for-approval
when: manual
allow_failure: false
script:
- echo "waiting-for-approval"

这里面有两个关键字段: whenallow_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
image: alpine
stages:
- test
- build
- deploy-to-qa
- waiting-for-approval
- deploy-to-prod

test:
stage: test
script:
- echo "test"

build:
stage: build
script:
- echo "build"

deploy-to-qa:
stage: deploy-to-qa
script:
- echo "deploy-to-qa"

waiting-for-approval:
stage: waiting-for-approval
when: manual
script:
- echo "waiting-for-approval"

deploy-to-prod:
stage: deploy-to-prod
script:
- echo "deploy-to-prod"

得到执行结果如下:

我还没有点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 to true with when: manual. However, if you use when: manual with [rules](https://docs.gitlab.com/ee/ci/yaml/#rules)allow_failure defaults to false.

谜题解开了!

之后又找到另外一篇文档 Choose when to run jobs | GitLab ,创建一个必须被手动触发的Job。

填坑

修改.gitlab-ci.yml ,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
image: alpine
stages:
- test
- build
- deploy-to-qa
- waiting-for-approval
- deploy-to-prod

test:
stage: test
script:
- echo "test"

build:
stage: build
script:
- echo "build"

deploy-to-qa:
stage: deploy-to-qa
script:
- echo "deploy-to-qa"

waiting-for-approval:
stage: waiting-for-approval
when: manual
allow_failure: false
script:
- echo "waiting-for-approval"

deploy-to-prod:
stage: deploy-to-prod
script:
- echo "deploy-to-prod"

其执行结果如下: