GitLab CI/CD关键词(七):继承 extends,自动阻断interruptible

拿我格子衫来 发表于 2022/05/15 14:17:43 2022/05/15
【摘要】 简介本篇文章给大家介绍二个关键词,一个是用于优化流水线写法的关键词extends,另一个关键词 interruptible 可以将项目旧的流水线自动取消的。这两个关键词对于流水线的优化都起着很重要的作用。下面来详细看一下他们的用法。 继承 extendsextends关键词可以极大地提高流水线代码的复用率,虽然在YAML文件中,我们使用YAML锚点的功能来达到代码复用的功能,这种方式比较复...

简介

全网最新最全的GitLab CI/CD中文教程

本文最新地址 https://fizzz.blog.csdn.net/article/details/124327488
本篇文章给大家介绍二个关键词,一个是用于优化流水线写法的关键词extends,另一个关键词 interruptible 可以将项目旧的流水线自动取消的。这两个关键词对于流水线的优化都起着很重要的作用。
下面来详细看一下他们的用法。

继承 extends

extends关键词可以极大地提高流水线代码的复用率,虽然在YAML文件中,我们使用YAML锚点的功能来达到代码复用的功能,这种方式比较复杂,而且书写起来不太美观。
下面是使用YAML锚点进行复用的一个例子

下面看一下使用extends的用法。

首先 extends是一个作业关键词,这也意味着你只能在作业上使用它,另外一个就是extends的值可以是一个或多个作业名称,而这些作业的内容将会被合并到当前的作业中 下面看一个具体的例子

上面的例子定义了一个作业模板.Irelia,或者叫做一个已经注释的作业,它的作业名以.开头,并不会真正运行。
在test_job中,我们使用extends继承了它,那么.Irelia作业的内容将与test_job合并。如果有重名的key,则以test_job为主。只合并key,不会合并key对应的值。

除了继承当前yaml的模板作业,你也可以继承使用include 引入的模板作业。
如下
included.yml

.template:
  script:
    - echo Hello!

.gitlab-ci.yml

include: included.yml

useTemplate:
  image: alpine
  extends: .template

下面有一个更为复杂的例子,大家可以学习一下。

真正执行的代码

rspec:
  variables:
    URL: "http://docker-url.internal"
    IMPORTANT_VAR: "the details"
    GITLAB: "is-awesome"
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
    - if: $CI_COMMIT_BRANCH == "stable"
  tags:
    - docker
  image: alpine
  script:
    - rake rspec

自动阻断 interruptible

在运行流水线时,有时会遇到这样一种情况,在修改bug或处理紧急事项时,会频繁地发到研发环境或测试环境进行验证。在这种情况下,会有这样一种情况,在短时间内,在同一分支,提交多次代码,触发多条流水线,流水线将并行运行。这种情况可能会造成系统超载,而且部署的结果有时是无法保证的,因为在并发运行环境下,受各种因素的影响,“旧代码的流水线”会比“新代码的流水线”部署更晚

为了解决这一问题,GitLab CI/CD提供了一种功能,就是当一个分支的流水线多次被触发时,可以设置自动取消旧的流水线。这里用到的就是关键词interruptible

关键词interruptible的值只能是true或false,默认为false,意味着默认:当有新的流水线被触发时,旧的流水线是不会自动取消旧的。

注意这里有一个细节,就是如果你在A分支提交代码,触发了流水线PA,然后再通过Web页面手动触发流水线,这种情况不会取消正在运行的PA流水线。(亲测,版本V14.0)

还有一点需要注意,当流水线运行过了interruptible:false的作业后,该流水线就不会被自动取消了。

看一下这个例子

stages:
  - stage1
  - stage2
  - stage3
 
step-3:
  stage: stage3
  script:
    - echo "Because step-2 can not be canceled, this step can never be canceled, even though it's set as interruptible."
  interruptible: true

当流水线运行到了step-2时,该流水线不会被取消,运行到step-3时也不会被取消。

如果你要想让流水线不管在哪个作业下都可以取消运行,可以在default关键词下设置interruptible:true。在部署作业上慎用。

后记

全网最新最全的GitLab CI/CD中文教程

参考链接

https://docs.gitlab.com/ee/ci/yaml/#interruptible

吾山拔地三千尺,凌空耸翠一万年

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。