Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >.gitlab-ci.yml关键词完整解析(二)

.gitlab-ci.yml关键词完整解析(二)

作者头像
拿我格子衫来
发布于 2022-01-23 06:40:54
发布于 2022-01-23 06:40:54
1.7K01
代码可运行
举报
文章被收录于专栏:TopFETopFE
运行总次数:1
代码可运行

.gitlab-ci.yml关键词完整解析(二)

上次我们介绍了 script, image, artifacts ,tags, cache ,stage ,when ,only/except。 学习了这几个关键词的用法,就不难配置一条简单的流水线。但如果要遇到更加复杂的业务场景,如微服务,流水线继承,多流水线,等复杂场景,那么只靠以上的几个用法是无法实现的。下面我就再给大家讲解其他几个更加复杂的关键词。 这次讲解的关键词有 before_script, after_script, dependencies, environment, extends, include, interruptible ,parallel, rules ,trigger, services

before_script

before_script 关键词是用于在每个任务之前执行的脚本,但是会在artifacts恢复之后执行。你可以这样定义一个全局的before_script,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
default:
  before_script:
    - echo "Execute this script in all jobs that don't already have a before_script section."

也可以在一个任务中中单独定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
job:
  before_script:
    - echo "Execute this script instead of the global before_script."
  script:
    - echo "This script executes after the job's `before_script`"

任务中的before_script会覆盖全局的before_script

after_script

after_script与before_script类似,用于定义多行脚本,会在任务执行完成后执行,即使任务失败也会被执行。如果任务被取消或者超时,after_script就不会被执行了,目前官方正在计划这个特性。 可以定义全局的,也可以定义局部的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
default:
  after_script:
    - echo "Execute this script in all jobs that don't already have an after_script section."

job1:
  script:
    - echo "This script executes first. When it completes, the global after_script executes."

job:
  script:
    - echo "This script executes first. When it completes, the job's `after_script` executes."
  after_script:
    - echo "Execute this script instead of the global after_script."
dependencies

dependencies关键词是定义特定的job运行规则。默认artifacts是从当前阶段产生,在后续的阶段都会被下载,但我们可以使用dependencies关键词来控制artifacts从哪里下载, 这里有一个例子,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
build:osx:
  stage: build
  script: make build:osx
  artifacts:
    paths:
      - binaries/

build:linux:
  stage: build
  script: make build:linux
  artifacts:
    paths:
      - binaries/

test:osx:
  stage: test
  script: make test:osx
  dependencies:
    - build:osx

test:linux:
  stage: test
  script: make test:linux
  dependencies:
    - build:linux

deploy:
  stage: deploy
  script: make deploy

根据这个例子我们不难看出, 任务test:osx 依赖build:osx 任务test:linux 依赖 build:linux 这样配置以后 任务test:linux 就不用等任务build:osx 执行完成在执行了,只需要等待任务build:linux完成 很好地利用了依赖关系来优化流水线的速率,前四个任务都执行完成后,才会执行最后一个部署的任务。

environment

environment是用于定义环境变量,可以是用k-v的方式定义 如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
deploy to production:
  stage: deploy
  script: git push production HEAD:master
  environment:
    name: production

需要注意的是这里定义的环境变量是不能在script值使用的。 这个关键词可以和review和merge搭配。

extends

这个关键词可以使一个任务继承另一个任务。 如下案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.tests:
  script: rake test
  stage: test
  only:
    refs:
      - branches

rspec:
  extends: .tests
  script: rake rspec
  only:
    variables:
      - $RSPEC

任务rspec 继承了.tests任务,在流水线中.tests是一个隐藏的任务,在流水线中,以英文远点开头的任务名,都是隐藏的任务。不会被执行。 被rspec继承后,相同的key会以rspec为准,rspec没有的,而.tests有的,则合并到rspec中, 合并后的结果是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rspec:
  script: rake rspec
  stage: test
  only:
    refs:
      - branches
    variables:
      - $RSPEC

使用这一个手段,可以写一个模板,只要稍微改改就能后使用。非常适合大批量编写流水线。

include

使用include可以导入一个或多个额外的yaml文件到你的CICD配置里,这一你就可以将一个很长的流水线,分隔出来。使用include来引入。 也可以将几个流水线中相同的配置,提取出来,公用。引入的文件扩展名 必须是.yaml或者.yml两种,其他的不行。 include 关键词下,有四个可选性, local, 引入一个当前项目的文件 file, 引入一个不同项目的文件 remote, 引入一个公网文件, template, 引入一个由GitLab提供的模板

下面是几个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include:
  - local: '/templates/.gitlab-ci-template.yml'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include:
  - project: 'my-group/my-project'
    file: '/templates/.gitlab-ci-template.yml'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include:
  - local: '/templates/.gitlab-ci-template.yml'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include:
  - project: 'my-group/my-project'
    ref: master
    file: '/templates/.gitlab-ci-template.yml'

  - project: 'my-group/my-project'
    ref: v1.0.0
    file: '/templates/.gitlab-ci-template.yml'

  - project: 'my-group/my-project'
    ref: 787123b47f14b552955ca2786bc9542ae66fee5b  # Git SHA
    file: '/templates/.gitlab-ci-template.yml'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include:
  - remote: 'https://gitlab.com/awesome-project/raw/master/.gitlab-ci-template.yml'
trigger

trigger 是应对那些更加复杂的CICD流程,如多流水线,父子流水线 使用它可以定义一个下游的流水线,配置了trigger的任务是不能跑脚本的,就是说不能定义script, before_script, 和 after_script. 项目这个是一个多项目流水线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rspec:
  stage: test
  script: bundle exec rspec

staging:
  stage: deploy
  trigger: my/deployment

流水线执行完test任务后就会去执行my/deployment项目的流水线

配置下游流水线式也可以执行分支

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rspec:
  stage: test
  script: bundle exec rspec

staging:
  stage: deploy
  trigger:
    project: my/deployment
    branch: stablez
rules

rules是用于规定任务的执行规则,使用一个表达式,来规范那些任务执行,那些任务不执行.还可以在任务成功,或者失败后,触发另一个任务。 如下面这个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
      when: delayed
      start_in: '3 hours'
      allow_failure: true

如果当前的分支是master分支则任务执行就延迟3个小时,并且允许失败。 rules的下面有是哪个可选属性

  • if 使用if表达式 添加或移除一个任务, 类似 only:variables.
  • changes 根据某些个文件是否改变来追加或移除一些任务。类似 only:changes.
  • exists 根据是否存在特定文件来追加或移除一些任务

if中可以使用CICD的所有预设变量,分支,来源,合并请求,commit,push web,schedule等。可以针对不用的情景配置不用的规则。 在看下这个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
job:
  script: echo "Hello, Rules!"
  rules:
    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
      when: manual
      allow_failure: true

解释起来并不复杂,一个判断语句,二句赋值语句。即如果当前分支是master,在任务的执行方式改为手动,并且运行失败。

写在最后

懂了以上这些关键词,那就不难写出一条规则复杂,易于扩展的流水线。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安装使用Jenkins-2.401.1更新版
接着上篇文章,先将项目上传至gitlab,其中包含编写ci文件,然后就会自动检测到并构建运行ci文件。
希里安
2023/10/30
3290
安装使用Jenkins-2.401.1更新版
.gitlab-ci.yml语法完整解析(三)
关于如何编写GitLab流水线,.gitlab-ci.yaml文件的关键词,已经写过两期了,gitlab-ci.yaml的关键词一共有28个,分别是 分别是, script, after_script, allow_failure, artifacts, before_script, cache, coverage, dependencies, environment, except, extends, image, include, interruptible, only, pages, parallel, release, resource_group, retry, rules, services, stage, tags, timeout, trigger, variables, when ,第一期 .gitlab-ci.yml关键词完整解析(一) 讲了最常用的9个关键词的用法, script, image,artifacts,tags,cache,stage,when,only/except, 第二期.gitlab-ci.yml关键词完整解析(二)讲了11个扩展性很强的关键词的用法 before_script, after_script, dependencies, environment, extends, include, interruptible ,parallel, rules ,trigger, services
拿我格子衫来
2022/01/23
1.8K0
.gitlab-ci.yml关键词完整解析(一)
使用GitLab自带的流水线,必须要定义流水线的内容,而定义内容的文件默认叫做.gitlab-ci.yml,使用yml的语法进行编写。 目前任务关键词有28个,全局的关键词有10个,两者重叠的有很多。今天我给大家先讲解一下常用的关键词,掌握了这些关键词的用法,你可以编写逻辑严谨,易于扩展的流水线。
拿我格子衫来
2022/01/23
1.1K0
Gitlab-CICD最简单明了的入门教程
由于目前公司使用的gitlab,大部分项目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段时间后感觉还不错,因此总结一下
全栈程序员站长
2022/09/07
6.2K0
Gitlab-CICD最简单明了的入门教程
【Git】GitLab CI/CD 的执行流程及实战
GitLab CI/CD 是一个简洁好用的的持续集成/持续交付的框架。通过为你的项目配置一个或者多个 GitLab Runner,然后撰写一个 .gitlab-ci.yml,你就可以很方便地利用 GitLab CI/CD 来为你的项目引入持续集成/交付的功能。
瑞新
2020/12/07
5.4K0
【Git】GitLab CI/CD 的执行流程及实战
通过 .gitlab-ci.yml配置任务
从7.12版本开始,GitLab CI使用YAML文件(.gitlab-ci.yml)来管理项目配置。该文件存放于项目仓库的根目录,它定义该项目如何构建。
leon公众号精选
2022/04/27
5.7K0
通过 .gitlab-ci.yml配置任务
GitLab CI/CD关键词解析系列
用过GitLab CI/CD的同学都知道,GitLab CI/CD流水线的编写离不开官方提供的关键词。所有业务逻辑的实现都离不开他们。比如要规定一个作业在develop分支下运行,就可以使用when关键词来是实现。如下
拿我格子衫来
2022/04/10
5390
GitLab CI / CD管道配置参考 .gitlab-ci.yml文件定义字段
使用在每个项目中调用的YAML文件配置GitLab CI / CD 管道.gitlab-ci.yml。
拿我格子衫来
2022/01/24
22.5K0
Gitlab CI 配置文件 .gitlab-ci.yaml 详解(上)
本文档用于描述 .gitlab-ci.yml 语法,.gitlab-ci.yml 文件被用来管理项目的 runner 任务。如果想要快速的了解GitLab CI ,可查看快速引导。 从 7.12 版本开始,GitLab CI 使用YAML文件 (.gitlab-ci.yml) 来管理项目配置。该文件存放于项目仓库的根目录,它定义该项目如何构建。
Debian中国
2018/12/21
24.4K0
Gitlab CI 配置文件 .gitlab-ci.yaml 详解(下)
本文档是描述 .gitlab-ci.yml 详细用法的下半部分,上半部分的内容请参考这里。.gitlab-ci.yml 文件被用来管理项目的 runner 任务。如果想要快速的了解GitLab CI ,可查看快速引导。 该文件存放于项目仓库的根目录,它定义该项目如何构建。
Debian中国
2018/12/21
7.6K0
【GitLab CI/CD】:Pipelines
Pipelines are the top-level component of continuous integration, delivery, and deployment.
WEBJ2EE
2021/01/18
8140
GitLabCI系列之流水线语法第五部分
用于指定在作业成功或者失败时应附加到作业的文件或目录的列表。作业完成后,工件将被发送到GitLab,并可在GitLab UI中下载。
DevOps云学堂
2020/05/22
3.6K0
GitLabCI系列之流水线语法第五部分
gitlab .gitlab-ci.yml 文件赏析
前端 ci https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml
拿我格子衫来
2022/01/24
7350
.gitlab-ci.yml 配置文件详解
git工具文档说明:https://docs.gitlab.com/ee/ci/yaml/gitlab_ci_yaml.html
程序媛夏天
2024/01/18
1.4K0
复制的官方GitLab 文档
stage: Verify group: Continuous Integration info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments type: reference
拿我格子衫来
2022/01/24
2.5K0
GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作 🦊
在日常工作中,经常会遇到这样一种场景:需要在 GItLab CI Job 中进行 Git Push 操作,将修改或构建好的代码推送到远端 Git 代码仓库当中。这是一个十分常见操作,本篇文章将会提供一个最简单且实用的方法来实现这个场景,希望对您有所帮助。
郭旭东
2022/12/05
5.6K0
GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作 🦊
用Gitlab CICD Pipeline Template部署应用
Gitlab的CI/CD[1]是通过Gitlab runner执行器实现的,它作为执行器运行我们在.gitlab-ci.yml中定义的一些逻辑行为。前面三篇讲述的是Gitlab的安装、通过一个flask web框架服务进行代码兼容性检查、编译、部署的整个pipeline.
公众号: 云原生生态圈
2020/06/15
2.4K0
用Gitlab CICD Pipeline Template部署应用
【GitLab CI/CD】:Cache vs artifacts
回顾一下:【GitLab CI/CD】:一些有用的基础知识,在默认Git strategy(fetch)下,每个 Job 执行之前,都会进行 git clean 操作,也就是说 job 执行过程中产生的中间结果,都会被清理,多数情况是没问题的。但总有一些例外情况,我们需要之前 job 执行过程中产生的中间结果,最具代表性的两类:
WEBJ2EE
2021/01/04
2.8K0
【GitLab CI/CD】:Cache vs artifacts
用 GitLab 做 CI/CD 是什么感觉,太强了!!
来源丨 www.cnblogs.com/cjsblog/p/12256843.html
xcbeyond
2020/08/21
10.3K0
用 GitLab 做 CI/CD 是什么感觉,太强了!!
使用GitLabCI模板库的流水线优化实践
作业分为Build、test、codeanalysis、artifactory、deploy部分,在每个作业中配置了rules功能开关,由变量控制最终作业的运行。
DevOps云学堂
2020/06/02
2.1K0
使用GitLabCI模板库的流水线优化实践
相关推荐
安装使用Jenkins-2.401.1更新版
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验