极狐GitLab include 语法减少 CI/CD Pipeline 代码冗余,提升构建效率

news2024/11/24 8:58:00

项目经理:我们有个 Java 的新项目要开始了,需要你帮忙设置调试一下 CI/CD Pipeline

DevOps 工程师:好的,没问题

ONE WEEK LATER...

项目经理:新项目的 CI/CD Pipeline 咋样了啊,我看研发还是手动人肉编译部署呢,严重影响了效率。CI/CD Pipeline 遇到什么问题了吗?

DevOps 工程师:已经写了50% 了,正在写其他的,然后调试,再一周能好。

项目经理:WHT,一个 CI/CD Pipeline 为啥这么久?而且前面有类似的 Java 项目,有可用的 CI/CD Pipeline,直接抽象成 template,然后用 include 语法在新项目中引入,再根据新项目的特性做微调即可。分分钟能搞定的啊。

DevOps 工程师:什么 template?什么 include?还能这么玩?

项目经理:我的乖乖……

封装和复用是软件编程设计中常用的特性,能够在很大程度上提高代码整体的可读性、可维护性。对于 CI/CD Pipeline 来讲也可以用封装和复用,来为新项目快速构建起一套合适的 CI/CD Pipeline,节约时间的同时,方便实现 Pipeline as Code,提升团队的端到端交付能力。

极狐GitLab include 语法


极狐GitLab CI/CD 是通过 YAML 语法来编写并存储到 YAML 文件中,可以将能够抽象出来的 CI/CD Pipeline(诸如单元测试、镜像构建、安全扫描等)代码存放到一个 YAML 文件,然后在其他项目的 .gitlab-ci.yml 中直接用 include 语法引入这个 YAML 文件即可。相当于用 include 一行代码实现了多行代码的功能,实现了 CI/CD Pipeline 的复用。这种做法有以下好处:

  • 减少代码冗余。通过复用减少相同代码的复制使用,能有效减少代码冗余。

  • 减小变更范围。如果有配置需要修改时,只要在 include 的文件中(upstream)进行修改,就可以将变更传递到使用此文件(downstream)的地方。一个变更,多处生效。

  • 提高可维护性。将一个配置文件拆分成多个配置文件,避免形成“巨型”配置文件,修改时候无从下手,维护起来耗时耗力。

极狐GitLab include 的用法有以下四种,以引用不同来源的 YAML 文件:

local

引用同一项目中的流水线配置文件:

include:
  - local: '/templates/.include-template.yml'

file

引入同一极狐GitLab 实例中的流水线配置文件:

include
  - project: xiaomage/templates
  - ref: main
    file: docker-image-build-tamplates.yml

上述写法引入了 xiaomage/templates 项目下的 docker-image-build-tamplates.yml 配置文件。

remote

引用位于其他远端仓库中的流水线配置文件:

include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build-tamplates.yml'

template

极狐GitLab 内置了很多开箱即用的 template,可以直接引入使用。所有的模版存储在 lib/gitlab/ci/templates 下面。也可以在项目中添加 .gitlab-ci.yml 文件的时候选择:

上图所示,引入了容器镜像扫描的功能。下面的 Demo 中会演示扫描效果。可以用同样的方法引入极狐GitLab DevSecOps 中的其他安全测试手段。

极狐GitLab include 中的 Override


用 include 引入的流水线配置是“共性”的内容,而实际使用的过程中是“个性”的,因此这时候需要用 Override 的方式,修改引入文件中的一些配置和参数。

比如,如果将镜像构建并推送至极狐GitLab 镜像仓库的流程定义为如下的流水线配置文件:

variables:
  IMAGE_TAG: 1.0.0
  
build:
  image: docker:latest
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG .
    - docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG

项目的 .gitlab-ci.yml 文件内容如下:

variables:
  IMAGE_TAG: 2.0.0
  
include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build-tamplates.yml'

则最终构建出来的镜像的 tag 是 2.0.0。因为 .gitlab-ci.yml 中 variables::IMAGE_TAG 的值,覆盖了引入的流水线配置中的 variables::IMAGE_TAG。这种方式成为了“合并”(merging)。

极狐GitLab include 的嵌套使用

include 语法可以实现配置文件的嵌套使用,比如在项目的 .gitlab-ci.yml 内容如下:

include:
  - local: /.gitlab-ci/another-config.yml

而 /.gitlab-ci/another-config.yml 内部又使用了 include 引入了另外一个配置文件:

include:
  - local: /.gitlab-ci/config-defaults.yml

最终 /.gitlab-ci/config-defaults.yml 的内容为:

default:
  after_script:
    - echo "Job complete."

上面的写法实现了 include 的 2 级嵌套。

关于极狐GitLab include 的其他用法,可以参考极狐GitLab 官网文档。

极狐GitLab include 实战


以 istio 中的 bookinfo 为例来演示 include 的强大功能。 bookinfo 中有 6 个服务:details、productpage、ratings、reviews、mysql、mongodb,每个都包含一个 Dockerfile:

├── details
│   ├── Dockerfile
├── mongodb
│   ├── Dockerfile
├── mysql
│   ├── Dockerfile
├── productpage
│   ├── Dockerfile
├── ratings
│   ├── Dockerfile
└── reviews
    ├── reviews-wlpcfg
    │   ├── Dockerfile

如果完整构建这几个镜像,就需要执行 6 次镜像构建命令,在极狐GitLab CI/CD 中,构建镜像的 Job 如下:


build:
  image: docker:latest
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
    - docker push $CI_REGISTRY_IMAGE:1.0.0

因此,可以重复写 6 次来完成整个镜像的构建,比如:

stages:
  - build
  
ratings_image_build:
  image: docker:latest
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
    - docker push $CI_REGISTRY_IMAGE:1.0.0

productpage_image_build:
  image: docker:latest
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
    - docker push $CI_REGISTRY_IMAGE:1.0.0
    
details_image_build:
  image: docker:latest
  stage: build
  script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:1.0.0 .
    - docker push $CI_REGISTRY_IMAGE:1.0.0

其他三个重复,不再赘述。

上述写法除了冗余、重复并没有太多价值。可以将镜像构建的代码写入一个 YAML 文件,并且存储到极狐GitLab(比如 SaaS 上),存储路径为:https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build-tamplates.yml。然后在项目的 .gitlab-ci.yml 文件中使用 include 引入此文件即可:

variables:
  IMAGE_TAG: "1.0.0"

stages:
  - build

include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build-tamplates.yml'

.image_build:
  image: docker:latest
  stage: build

ratings_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/ratings"
    IMAGE_NAME: "ratings"

productpage_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/productpage"
    IMAGE_NAME: "productpage"

details_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/details"
    IMAGE_NAME: "details"
其他三个重复,不再赘述。.

而且使用了 variables 来完成,对于 include 引入的 template 文件中的 variables 进行了覆盖,这样只需要修改一次即可完成 6 个镜像的 tag 修改。触发 CI/CD Pipeline 构建,可以查看构建结果:

再进一步,加一个镜像扫描。极狐GitLab 本身支持对于容器镜像的扫描,详情可以查看过往文章云原生时代,保证容器镜像安全分几步?

只需以下两行代码即可开启容器镜像扫描:

include:
  - template: Security/Container-Scanning.gitlab-ci.yml

Security/Container-Scanning.gitlab-ci.yml 是极狐GitLab 提供的众多开箱即用的 template 中的一个。

因此将镜像构建与扫描都用 include 引入:

variables:
  CS_ANALYZER_IMAGE: registry.gitlab.cn/security-products/container-scanning/trivy:4
  SECURE_ANALYZERS_PREFIX: "registry.gitlab.cn/security-products"
  IMAGE_TAG: "1.0.0"

stages:
  - build
  - test

include: 
  - remote: 'https://jihulab.com/xiaomage/teamplates/raw/main/docker-image-build-tamplates.yml'
  - template: Container-Scanning.gitlab-ci.yml


.image_build:
  image: docker:latest
  stage: build

ratings_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/ratings"
    IMAGE_NAME: "ratings"

productpage_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/productpage"
    IMAGE_NAME: "productpage"

details_image_build:
  extends: .image_build
  variables:
    BASIC_PATH: "samples/bookinfo/src/details"
    IMAGE_NAME: "details"
其他三个重复,不再赘述。


container_scanning:
  image: "$CS_ANALYZER_IMAGE"
  stage: test
  variables:
    DOCKER_IMAGE: "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
    GIT_STRATEGY: fetch
    DOCKER_USER: "$CI_REGISTRY_USER"
    DOCKER_PASSWORD: "$CI_REGISTRY_PASSWORD"


container_scanning_ratings:
  extends: container_scanning
  variables:
    IMAGE_NAME: "ratings"


container_scanning_productpage:
  extends: container_scanning
  variables:
    IMAGE_NAME: "productpage"

container_scanning_details:
  extends: container_scanning
  variables:
    IMAGE_NAME: "details"
其他三个重复,不再赘述。

可以查看构建结果:

在极狐GitLab 镜像仓库查看推送的镜像:

在极狐GitLab 安全仪表盘查看镜像扫描结果:

极狐GitLab CI/CD include 语法能够很好的解决 CI/CD Pipeline 代码的封装和复用,可以将共性的流程抽象出来封装成 template,存储在极狐GitLab 上。

当有新项目需要设置 CI/CD Pipeline,只需要用 include 语法引入,再根据新项目的实际情况做一些变动,即可完成新项目的 CI/CD Pipeline 设置,能够节省大量时间,而且便于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Vue+SpringBoot的在线考试系统,支持多种题型,含数据库文件

spring-boot-online-exam 完整代码下载地址:基于VueSpringBoot的在线考试系统 快速体验 在安装了docker的机器上执行如下命令: 安装mysql: docker run --name exam-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDaA111111 -d mysql:5.7.15然后用doc/sql…

freeswitch的gateway实现出中继的主备方案

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 某些呼叫场景中,我们有2条出中继线路可选,2条出中继需要按照主备模式来配置,优先使用主中继呼叫,当主中继出现问题时,呼叫自动转移到备用中继呼叫。 本节中&a…

正大国际期货:恒指操作技巧之交易中五种绝佳的开仓思路分析

很多人总是亏损,其实最重要的原因之一是没有一个优势的概率系统,正大IxxxuanI经过了解之后,对目前市面上概率系统进行总结,现将以下几种优势的概率系统归纳罗列如下,有缘者定可举一反三,或可为你细化和改良…

Android中GRPC的使用-拦截器

在构建GRPC应用程序时,无论是客户端应用程序,还是服务端应用程序,在远程方法执行之前后之后,都可能需要执行一些通用逻辑。在GRPC中可以拦截RPC的执行,来满足特定的需求,如日志、认证、性能度量指标等&…

基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离

一、篇头 本文介绍Platform平台驱动框架,使用此框架,将可以用上DTS设备树文件,实现设备的静态枚举,实现设备与驱动的分离。 本文基于Amlogic T972 , Android 9.0, 内核版本 4.9.113 二、系列文章 第1篇&a…

【Docker基础篇】一文完成快速使用

Docker基础篇前言Docker是什么?Docker与传统虚拟机技术区别Docker作用、为什么用docker原理Docker常用命令案例展示redis各种软件安装打包到本地、上传到远程仓库打包到本地推送到远程仓库前言 所有的权威均来自与官方,如有疑问请参考官网文献。人非圣贤…

网络厂商 Aruba 2022 年业绩成倍增长的经验是什么

转眼,2022 年马上就要结束了。 在多重不确定的经济环境之下,网络厂商 Aruba 中国在 2022 年的业绩,与上一财年相比仍然实现了成倍的增长。今年初,CSDN 曾采访过 Aruba 中国区的管理者 Aruba 中国区总经理谢建国与 Aruba 北中国区大…

alpine的介绍与使用

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl …

【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

CryptoJS加密解密

1.CryptoJS CryptoJS库是前端js写的一个加密解密的工具,使用场景就是对于像账户密码等重要信息要显示在页面上时,需要加密,这样才能保证安全,CryptoJS提供了许多加密的方法, 请参考: cryptojs-JavaScrip…

OSPF的汇总实验

目录 1.拓扑图 2.实验要求 3.实验思路 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.实验要求 R4为ISP,其上只能配置ip,R4与其他所有直连设备间使用公有ip;解决ospf不规则区域;整个ospf环境ip地址为172.16.0.0/16,…

pure pursuit纯跟踪

Pure Pursuit是一种几何追踪方法,速度越小,performance越好; :汽车前轮转角 L:前后轮轴距(车长) R:转弯半径 将车辆模型简化为自行车模型(这里默认左轮和右轮的旋转是一致的)!!! bicycle model: pure pursuit建立于自行车模型和阿克曼小车模型的基础上,goal point为距离后…

2022年用于Web开发的15种最佳编程语言

Web 开发是一个常青的领域,机会总是很多。自 90 年代初出现以来,开发行业在各种方式和领域中发展并蓬勃发展。今天,在 21 世纪,Web 开发仍然是最受欢迎的技能之一。要在这个领域开始职业生涯,掌握Web 开发语言是必不可…

UDS-10.4 SecurityAccess (27) service

10.4 安全访问(27)服务 来自:ISO 14229-1-2020.pdf 10.4.1 服务描述 本服务的目的是提供一种访问数据和/或诊断服务的方法,这些数据和/或诊断服务由于安全、排放或安全原因而被限制访问。用于将例程或数据下载/上传到服务器以及从服务器读取特定内存位置…

spring 基础知识-- IOC 和 DI 的配置和使用。

目录 一、基本概念 二、Spring 核心概念 1、问题分析 2、IOC、IOC容器、Bean、DI 3、IOC 入门案例 4、DI 入门案例 三、IOC 详解 1、bean 基础配置 2、bean 实例化 3、bean 生命周期 四、DI 详解 1、setter 注入 2、构造器注入 3、自动配置 4、集合注入 一、基…

go调度和性能分析利器之trace

trace的使用示例 import ("fmt""log""os""runtime/trace""sync" )func main() {//runtime.GOMAXPROCS(1)// 1. 创建trace持久化的文件句柄f, err : os.Create("trace.out")if err ! nil {log.Fatalf("failed…

再次学习make

目录 1.Makefile的重要性 2.MakeFile的概念 3.Makefile的优点 4.Makefile的基本语法 5.变量 5.1 自定义变量 5.2 变量的赋值 5.3自动变量 5.4 Makefile的隐含变量 6.Makefile的函数 6.1意义: 6.2 基本语法: 6.3 部分常用函数 6.4 自定义函…

ECS-弹性容器服务 - Part 1

67-ECS-弹性容器服务 - Part 1 Hello大家好,我们今天的课时内容是ECS-AWS的弹性容器服务。 ECS-AWS的弹性容器服务 ECS是高度可扩展的、快速的容器管理和编排服务。 使用ECS,能够将您的Docker容器运行在AWS EC2或者 Fargate管理的无服务器架构上。 将容…

磨金石教育摄影技能干货分享|什么是序列摄影?它让摄影更加深刻

著名摄影师肖尔曾这样表达过自己的摄影理念。 他说:“吸引我的总是平淡无奇的瞬间”。 他与著名的纪实摄影师布列松不同,他不喜欢去游荡在生活之外,去抓拍他人的精彩瞬间。 他也不喜欢报道式的摄影,不去过多关注社会话题。 而是将…

第二证券|首批浮动费率基金三年成绩出炉 规模虽小收益可观

2019年12月18日至12月26日,6家基金公司试点建立了职业第一批逐笔比例提取成绩酬劳的起浮办理费率基金(下称“起浮费率基金”)。如今,这6只起浮费率基金运作均已满三年,到2022年12月26日,6只产品建立以来均匀…