1.4 .gitlab-ci.yml里使用的YAML特性
本来打算今天继续介绍.gitlab-ci.yml
文件里使用的其他关键字,但是普通的关键字太多,而且一些重要关键字内容都比较长。需要花更多的时间去整理。今天暂时把理解了的一部分内容先放上来。
这篇文章要介绍的是.gitlab-ci.yml
文件里使用的YAML特性,主要介绍:
- 一些特殊符号的含义
- 锚的含义和使用。
特殊符号
在.gitlab-ci.yml
文件里常用的特殊符号主要有以下几个:
-
&
,用来定义一个锚的名称,具体什么是锚,有什么用,下面第二部分会具体讲解。 -
*
,后面跟上锚的名称,用来引用锚 -
<<
,用于字典合并的,YAML文件的格式和嵌套字典非常类似,一层一层嵌套的键值对。而这个符号就是用来在指定位置插入新的键值对或者嵌套的键值对。因此被称为字典合并。
上面三个符号,除了最后一个以外,前面两个都是和锚相关的,这三个符号都是用来提高.gitlab-ci.yml
文件里代码的复用性及可读性。降低代码复杂度,让你写出来的.gitlab-ci.yml
文件更容易理解。
锚(anchor)
锚是用来提高代码复用性的,类似于编程语言里的函数。在编程语言里,先把一些常用功能抽象出来,定义成函数。然后在需要使用的位置字节调用函数即可。而锚的作用也是这样,可以把需要执行的脚本先定义好,然后在需要的位置调用即可。定义锚的格式是:&anchor_name
,调用锚的格式则是*anchor_name
,就是上面说的两个特殊符号&
和*
号的作用,我们来看两个具体示例:
.job_template: &job_configuration # 隐藏定义一个叫做'job_configuration'的锚的内容
image: ruby:2.6
services:
- postgres
- redis
test1:
<<: *job_configuration # 合并 'job_configuration' 别名的内容
script:
- test1 project
test2:
<<: *job_configuration # 合并 'job_configuration' 别名的内容
script:
- test2 project
在上面这个示例里不光演示了锚的定义和使用,还定义了字典合并符号<<
的使用。这里来详细介绍一下。在上面的示例里首先定义了一个隐藏任务模板.job_template
,所谓的隐藏任务就是在任务名称前面加上一个点号.
,然后在Gitlab的UI界面就看不到这个任务对应的图标,在实际运行的时候也不会跑这个任务。隐藏任务一般是用来当做模板使用,就像上面例子里的用法。
隐藏任务定义好以后,在它名称后面使用&job_configuration
定义一个锚叫做job_configuration
,它下面的内容就是模板的内容。
然后在下面的任务test1和test2中,使用字典合并符号<<:*job_configuration
,表示要在这个位置导入隐藏任务模板里的内容。当正式开始运行以后,解析出来的实际任务是:
.job_template:
image: ruby:2.6
services:
- postgres
- redis
test1:
image: ruby:2.6
services:
- postgres
- redis
script:
- test1 project
test2:
image: ruby:2.6
services:
- postgres
- redis
script:
- test2 project
表示脚本的锚
锚的另外一个常用方式是,将多个任务里都使用的命令抽出来,定义为锚,然后在任务里通过锚的名称直接调用,看下面的示例:
.some-script-before: &some-script-before
- echo "Execute this script first"
.some-script: &some-script
- echo "Execute this script second"
- echo "Execute this script too"
.some-script-after: &some-script-after
- echo "Execute this script last"
job1:
before_script:
- *some-script-before
script:
- *some-script
- echo "Execute something, for this job only"
after_script:
- *some-script-after
job2:
script:
- *some-script-before
- *some-script
- echo "Execute something else, for this job only"
- *some-script-after
在上面的示例中,就是将多个不同位置的脚本都抽出来,定义成锚,然后在下面的任务里直接调用。
用于变量的锚
在Gitlab的官方文档上,锚的最后一种用法是,将多个位置都要使用的同名变量抽出来定义为锚,然后直接调用,给出的示例是:
variables: &global-variables
SAMPLE_VARIABLE: sample_variable_value
ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
# a job that must set the GIT_STRATEGY variable, yet depend on global variables
job_no_git_strategy:
stage: cleanup
variables:
<<: *global-variables
GIT_STRATEGY: none
script: echo $SAMPLE_VARIABLE
但是在这里我感觉它给出的例子非常不恰当,例如下面的代码:
variables:
SAMPLE_VARIABLE: sample_variable_value
ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
# a job that must set the GIT_STRATEGY variable, yet depend on global variables
job_no_git_strategy:
stage: cleanup
variables:
GIT_STRATEGY: none
script: echo $SAMPLE_VARIABLE
在这里我不需要直接定义锚,也可以直接使用variables
关键字实现变量GIT_STRATEGY
的定义。也可以直接通过$SAMPLE_VARIABLE
实现对全局变量SAMPLE_VARIABLE
的调用。目前还没看出这两种方式的区别,如果后面验证了这两个位置的区别,再来更新这部分的文档。
以上就是今天弄懂的一些东西