Gitlab-CI Include and Extends
Include
Func: 用于引入.yml
或.yaml
结尾的YAML文件,其他类型的文件不能引入。我们可以利用include让.gitlab-ci.yml
文件的结构更清晰,同时也可以把一些需要集中管理维护的job写在一个YAML文件中,放在一个公共仓库,让其他项目的CI来引入该文件。
举个例子,假如每个团队都需要执行一个report
的job,用于报告版本发布的相关信息,那么我们可以把这个job写在report.yml
文件,放在一个公共的仓库,然后每个团队的.gitlab-ci.yml
文件引入report.yml
。假如以后需要在report
中添加一些需要上报的内容,只需要修改公共项目的report.yml
即可。
当然,由于report.yml
会被多个项目引用,所以必须通用且拥有较好的扩展性与兼容性,如果改一点东西都需要每个团队去配合你改,那就比较糟糕了。
include注意要点
假设模板文件 example.yml
内容如下:
1 |
|
.gitlab-ci.yml
内容如下:
1 |
|
- 被
include
的文件和.gitlab-ci.yml
在variable
中定义了同一个变量,则该变量被.gitlab-ci.yml
中定义的变量覆盖。如上例,最终example.yml
中变量的取值为:- POSTGRES_USER:
root
- POSTGRES_PASSWORD:
secure_password
- POSTGRES_DB:
$CI_ENVIRONMENT_SLUG
- POSTGRES_USER:
- 被
include
的文件和.gitlab-ci.yml
都定义了同一个job,则会将两个job进行合并。上例中example.yml
中production job的enviroment url
取值为https://domain.com
此外,include
还可以使用关键字template
去引入.gitlab-ci.yml
模板,更为详细的信息可以阅读官方文档
Extends
Func:extends
替代了YAML Anchors,可读性好,而且更加灵活。它定义一个可以让job去继承的模板,这样可以让我们把一些共同的key进行抽象,方便以后的维护与扩展。
Example:
1 |
|
Result:
1 |
|
以上是官方给的例子:tests
作为模板,rspec
去继承它,如果二者都有相同的key
,则使用子类的value
覆盖父类。
extend
相关详细的信息请阅读:gitlab-ci extends
include and extends
include
和extends
支持一起使用。如果只有include
,仅能让某个项目引用某个YAML文件,然后根据调解触发对应的job,而加入extend
后,我们可以把一些公共属性或者方法(主要是Script)也进行统一管理。这让我们可以更好地去抽象与统一维护。
Example:
- B.yml
1
2
3
4
5
6
7
8
9
10
11
12variables:
TEST_VAR: B
.template:
stage: test
only:
- master
script:
- echo_hello
- echo "VAR1 = ${VAR1}"
- echo "VAR2 = ${VAR2}"
- echo "TEST_VAR = ${TEST_VAR}" - .gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19variables:
TEST_VAR: A
include:
- B.yml
job_a:
before_script:
- |
function echo_hello(){
echo "hello world!"
}
- VAR1="hello"
- VAR2="world"
extends: .template
only:
variables:
- $A
当master
分支更新或定义了A
变量时,触发CI,执行结果:
1 |
|
以上结果表明:
- 在
.gitlab-ci.yml
中执行的job,使用的环境变量是.gitlab-ci.yml
文件定义的变量,故输出TEST_VAR = A
extends
的动作早于before_script
Summary
我们在做持续集成的时候应该仔细思考哪些东西可以用到include
或extends
,这样可以提高CI/CD的扩展性与可维护性。