美文网首页
1.4 .gitlab-ci.yml里使用的YAML特性

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

作者: shark_tear | 来源:发表于2021-08-20 22:42 被阅读0次

    本来打算今天继续介绍.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的调用。目前还没看出这两种方式的区别,如果后面验证了这两个位置的区别,再来更新这部分的文档。

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

    相关文章

      网友评论

          本文标题:1.4 .gitlab-ci.yml里使用的YAML特性

          本文链接:https://www.haomeiwen.com/subject/pmsxiltx.html