1.4 .gitlab-ci.yml里使用的YAML特性

2021-08-20  本文已影响0人  shark_tear

本来打算今天继续介绍.gitlab-ci.yml文件里使用的其他关键字,但是普通的关键字太多,而且一些重要关键字内容都比较长。需要花更多的时间去整理。今天暂时把理解了的一部分内容先放上来。

这篇文章要介绍的是.gitlab-ci.yml文件里使用的YAML特性,主要介绍:

特殊符号

.gitlab-ci.yml文件里常用的特殊符号主要有以下几个:

上面三个符号,除了最后一个以外,前面两个都是和锚相关的,这三个符号都是用来提高.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的调用。目前还没看出这两种方式的区别,如果后面验证了这两个位置的区别,再来更新这部分的文档。

以上就是今天弄懂的一些东西

上一篇下一篇

猜你喜欢

热点阅读