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

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

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

.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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GraalVM编译器将会进入Java主线版本
Galahad项目将向OpenJDK社区提供与Java相关的GraalVM技术,以便于GraalVM中新的JIT和AOT编译器技术在Java中孵化。
老夫编程说
2023/02/10
9360
GraalVM编译器将会进入Java主线版本
过两年 JVM 可能就要被 GraalVM 替代了
GraalVM 是 Oracle 大力发展和想要推广的新一代 JVM ,目前很多框架都已经渐渐支持 GraalVM 了,比如我们在用的 Spring 也已经推出了对 GraalVM 兼容的工具包了。
古时的风筝
2022/12/18
10K0
过两年 JVM 可能就要被 GraalVM 替代了
Spring Boot3 新玩法,AOT 优化!
今天和小伙伴们来聊一聊 Spring6 中的一个新特性 AOT(Ahead of Time),这也是目前在学习 Spring6 源码视频的小伙伴的一个提问,其实还是挺有代表意义的,因此松哥整理一篇文章来和大家聊一聊这个话题。
江南一点雨
2024/01/17
2.5K1
Spring Boot3 新玩法,AOT 优化!
云原生时代的Spring Boot 3.0: GraalVM原生镜像,启动速度提升近30倍
Spring Boot 3.0 五天前(2022年11月24日)发布了,变化很大,基于spring6.0,spring6.0是Spring下一个未来十年的新开端。
后端云
2023/02/10
3.6K0
云原生时代的Spring Boot 3.0: GraalVM原生镜像,启动速度提升近30倍
《GraalVM:Java AI 应用性能与启动速度的优化利器》
在人工智能蓬勃发展的今天,Java 作为一种广泛应用的编程语言在 AI 领域也占据着重要地位。然而,Java 应用在性能和启动速度方面有时会面临挑战。GraalVM 的出现为优化 Java AI 应用带来了新的曙光。本文将深入探讨 GraalVM 如何在优化 Java AI 应用的性能和启动速度方面发挥关键作用,助力开发者打造更高效的 AI 解决方案。
程序员阿伟
2024/12/22
1360
《GraalVM:Java AI 应用性能与启动速度的优化利器》
云原生时代高性能Java框架—Quarkus(一)
Quarkus 是一个为 Java 虚拟机(JVM)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。
东溪陈姓少年
2020/08/06
6.7K0
GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
你可以嫌弃Java, 但是可以永远相信JVM! 在云原生如日中天、Serverless日渐成熟、新语言百花齐放的当下,跨语言、Native支持、高性能低资源占用的技术必定是其璀璨的明珠,而GraalVM正是这样一个承载了JVM未来,将Java带入下一波技术的弄潮儿。
sanshengshui
2023/05/01
1.1K0
GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
【Spring云原生】Spring官宣,干掉原生JVM,推出 Spring Native!整体提升性能!Native镜像技术在Spring中的应用
Native镜像技术是一种将Java应用程序编译成本地可执行文件的技术。它的原理是通过静态编译将整个Java应用程序及其依赖项转换为本地机器代码,从而实现更快的启动时间和较小的内存占用。
苏泽
2024/03/10
5320
Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单
  AOT是Spring6.0提供的一个新特性,Ahead of Time 提前编译。
用户4919348
2023/05/27
3.2K0
Spring6和SpringBoot3的新特性-你不得不了解的AOT原来这么简单
Java 革新之路:GraalVM 原生镜像
Java 主导着企业级应用。但在云计算领域,采用 Java 的成本比它的一些竞争对手更高。原生编译降低了在云端采用 Java 的成本:用它创建的应用程序启动速度更快,使用的内存更少。
xcbeyond
2022/09/07
1.5K0
Java 革新之路:GraalVM 原生镜像
【干货】云原生时代,阿里如何让Java冷启动提速两个数量级?
来源 | QCon全球软件开发大会    嘉宾 | 林子熠     整理 | 李慧文 Java 语言自从诞生以来就被打上了“慢”的标签。经过 25 年的发展,Java 程序的峰值性能在实时编译(JIT)技术的支持下已能超越 C/C++ 程序,但实时编译仍无法解决冷启动速度慢的问题。在云原生的场景下,往往需要快速拉起新的服务以响应用户持续增长的请求,此时服务的启动时间就显得至关重要。 阿里探索了两种不同维度上的冷启动加速技术,经过双 11 大促的检验都取得了良好的效果:AppCDS 技术在传统 Java 环
江南一点雨
2022/04/19
1.4K0
【干货】云原生时代,阿里如何让Java冷启动提速两个数量级?
Spring Native 中文文档
https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#getting-started-buildpacks
爱撸猫的杰
2022/01/05
10.6K0
王炸!!Spring 终于对 JVM 动手了…
Spring 在今年 3 月份推出了 Spring Native Beta 版本,我本来还想着等正式发布了再研究下,不用等了,现在我们就来尝尝鲜。
Java技术栈
2021/06/16
8840
Spring Native 项目,把 Spring 项目编译成原生程序!
Spring 发布了 Spring Native 的 beta 版本,该功能已经在 start.spring.io 上可用了。
Yano_nankai
2021/03/29
3.2K0
GraalVM:云原生时代的Java
前两天正好研究了一下GraalVM,偶然间看到昨天周大在华章的直播里也分享了一波GraalVM,顺便就蹭蹭这个热度吧。
麒思妙想
2020/07/10
1.3K0
借助 Spring Boot 和 GraalVM 实现原生 Java
作者 | Josh Long 译者 | 张卫滨 策划 | 丁晓昀 本文是“Native Compilations Boosts Java”系列文章的一部分。你可以通过 RSS 订阅接收新文章更新通知。 Java 在主导着企业级应用。但是在云中,采用 Java 的成本要比其竞争者更高。使用 GraalVM 进行原生编译降低了在云中 Java 的成本:它所创建的应用启动更快,使用的内存也更少。 原生编译为 Java 用户带来了很多的问题:原生 Java 会如何改变开发方式?我们在什么情况下该转向
深度学习与Python
2023/04/01
8860
借助 Spring Boot 和 GraalVM 实现原生 Java
Java在云原生的破局利器——AOT(JIT与AOT)
JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,与之相对的AOT(Ahead-of-Time,预编译)方式,似乎长久以来和Java语言都没有什么太大的关系。但是近年来随着Serverless、云原生等概念和技术的火爆,Java JVM和JIT的性能问题越来越多地被诟病,在Golang、Rust、NodeJS等新一代语言的包夹下,业界也不断出现“云原生时代,Java已死”的言论。那么,Java是否可以使用AOT方式进行编译,摆脱性能的桎梏,又是否能够在云原生时代焕发新的荣光?本文会带着这样的疑问,去探索Java AOT技术的历史和现状。
燃192
2023/02/28
3.8K0
Java在云原生的破局利器——AOT(JIT与AOT)
Quarkus经GraalVM native-image编译后启动只需0.07秒(9)
quarkus号称超音速亚原子JAVA为Graalvm量身定制的java堆栈,是否名副其实呢?下面就来看看真实情况如何。动手前先简单介绍下Graalvm,它是oracle出品的一个AOT编译器,可以将应用程序编译成本地映像,通俗的说可以将java编译成机器可直接执行的程序,可以参考go语言的编译输出产物。而且graalvm不仅仅支持java,对其他语言也有很好的支持。下面先看一张quarkus的java应用程序在传统的vm下面和graalvm下面的资源占用图。
kl博主
2023/11/18
4970
Quarkus经GraalVM native-image编译后启动只需0.07秒(9)
Oracle的JVM你知道,GraalVM你知道吗?
GraalVM是一种开源高性能的运行时环境,用于编写和执行各种编程语言的应用程序。它提供了一种灵活的、一致性的多语言运行时,支持Java、JavaScript、Ruby、Python、R和Scala等多种语言。GraalVM的目的是为开发人员提供一种统一的运行时环境,以简化应用程序的开发和部署。
DevOps持续交付
2023/12/21
6110
Oracle的JVM你知道,GraalVM你知道吗?
Graal VM:云原生时代的Java
文章为笔者原创,首发于:https://icyfenix.cn/tricks/graalvm/
周志明
2020/05/02
1.9K0
Graal VM:云原生时代的Java
推荐阅读
相关推荐
GraalVM编译器将会进入Java主线版本
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验