至此,我们所有的准备工作就都做完了,接下来我们正式开始CI/CD之旅。

gitlab CI/CD所有的操作、任务都在项目根目录下的.gitlab-ci.yml文件中配置,yml语法,为项目创建此文件,并写入相应的规则,这样当我们提交的时候,gitlab就会触发对应的任务,规则怎么写呢,请继续往下看。

.gitlab-ci.yml中的任务、操作都是安装一定的顺序执行的,有的下一次执行依赖上一次执行的结果,有点像shell中的管道,因此,一次配置文件中任务整体的执行也叫一次pipeline。一个pipeline中包好多个阶段,每个阶段又有多个任务、操作。默认情况下,有三个阶段可以设置buildtestdeploy

如下所示,配置了3个任务,包含两个阶段,testdeploy,阶段的执行顺序跟在脚本中顺序没关系,只跟阶段配置的顺序有关,这里包含了隐藏的执行顺序build -> test -> deploy,同一个阶段的多个任务是并列的,他们之间没有顺序关系,执行也是并行执行的。执行本阶段的时候,必须上一个阶段的所有任务都执行成功了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
image: {your ip}:5000/php_runner:latest

job-1:
stage: deploy
script:
- echo "stage phpunit 1"
tags:
- php
job-2:
stage: deploy
script:
- echo "stage phpunit 2"
tags:
- php

job-none:
stage: test
script:
echo "stage-test\n"
tags:
- php

再看看下面这个例子,我们自定义了三个阶段(注意,自定义阶段,默认的三个阶段会失效),

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
# PHP 代码检测语法;单元测试
image: {your ip}:5000/php_runner:latest

stages:
- test
- deploy
- what

job-any:
stage: what
script:
- echo "job what"
tags:
- test

job-1:
stage: deploy
script:
- echo "stage phpunit 1"
tags:
- test
job-2:
stage: deploy
script:
- echo "stage phpunit 2"
tags:
- test

job-none:
stage: test
script:
echo "stage-test\n"
tags:
- php

在下面这里可以看到界面化的具体的执行情况,简洁明了

也许,你可能要问了,这是不是太容易出发了,我没提提交的时候都会触发,有时候并不是想上线,比如一个bug-fix分支,这个时候并不想运行CI/CD任务,没关系,是可以的,在每个任务上面加上下面配置就可以了:

1
2
3
job:
only:
- master

另外我们还可以手动干预,比如编译完之后,有些功能可能我们需要手动干预,这时候在job下面设置when: manual就可以了,默认情况下,pipeline碰到这种情况会跳过,不会执行,等待用户手动执行,当然了,也可以设置为堵塞模式,这样只有用户执行了之后pipeline才能继续向下执行。

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: {your ip}:5000/php_runner:latest

stages:
- deploy
- test
- what

job-any:
stage: what
script:
- echo "job what"
tags:
- test

job-1:
stage: deploy
script:
- echo "stage phpunit 1"
tags:
- test
job-2:
stage: deploy
script:
- echo "stage phpunit 2"
tags:
- test

job-none:
stage: test
when: manual
script:
echo "stage-test\n"
tags:
- php

堵塞,不堵塞的两种情况,第一条是堵塞的情况,需要手动执行第二部之后,堵塞情况需要在job下面添加allow_failure: false