gitlab高级功能之CI/CD组件 - 原理介绍(一)

文章目录

    • 1. 介绍
    • 2. 组件存储库
    • 3. 创建组件存储库
      • 3.1 目录结构
    • 4. 发布组件
    • 5. 在 CI/CD 配置中使用组件
      • 5.1 避免使用全局关键字
      • 5.2 用输入替换硬编码值
      • 5.3 用输入替换自定义 CI/CD 变量
    • 6. 将 CI/CD 模板转换为组件

参考文档:https://docs.gitlab.com/ee/ci/components/

1. 介绍

引入16.0,16.6正式使用

  • CI/CD 组件是可重用的单管道配置单元,使用它们来组成整个管道配置或较大管道的一小部分;
  • CI/CD组件可以选择接受输入参数;
  • CI/CD 组件与使用 include 关键字添加的其他类型的配置类似,但具有以下几个优点:
    • 组件可以以特定版本发布和使用;
    • 多个组件可以组合在同一个项目中并使用单个标签发布;
    • 组件可以在 CI/CD 目录中找到。

2. 组件存储库

  • 组件存储库是一个 GitLab 项目,其中包含托管一个或多个管道组件的存储库。项目中的所有组件都进行版本控制并一起发布。
  • 如果某个组件需要与其他组件不同的版本控制,则应将该组件迁移到其自己的组件存储库。
  • 一个组件存储库最多可以有 10 个组件。

3. 创建组件存储库

创建一个组件仓库,你必须:

  1. 创建一个项目并且有RADME.md文件

  2. 为每个组件添加yaml配置文件,并按照如下的目录结构。
    ​ 如:

    ```
    spec:inputs:stage:default: test
    ---
    component-job:script: echo job 1stage: $[[ inputs.stage ]]```
    

3.1 目录结构

  • 组件存储库可以托管一个或多个组件,并且必须遵循强制文件结构。
  • 组件配置可以通过以下目录结构保存,包含:
    • 组件存储库顶层的模板目录,所有组件配置文件都应保存在该目录下;
    • 以 .yml 结尾的文件包含组件配置,每个组件一个文件;
    • Markdown README.md 文件解释了存储库中所有组件的详细信息。

示例1: 如果项目包含单个组件和用于测试该组件的管道,则文件结构应类似于:

├── templates/
│   └── secret-detection.yml
├── README.md
└── .gitlab-ci.yml

该示例组件可以通过类似于以下的路径引用: gitlab.com/my-namespace/my-project/secret-detection@<version>,其中:

  • gitlab.com 项目访问的域名
  • my-namespace 项目的所在群组
  • my-project 项目的名称

引用的路径中应排除模板目录配置文件的后缀
示例2: 如果项目包含多个组件,则文件结构应类似于:

├── README.md
├── .gitlab-ci.yml
└── templates/├── all-scans.yml└── secret-detection.yml

该示例组件将通过以下路径引用:

  • gitlab.com/my-namespace/my-project/all-scans@<version>
  • gitlab.com/my-namespace/my-project/secret-detection@<version>

示例3: 如果您想将多个相关文件捆绑在一起,您还可以将组件定义为目录。在这种情况下,GitLab 期望存在 template.yml 文件:

├── README.md
├── .gitlab-ci.yml
└── templates/└── dast├── docs.md├── Dockerfile└── template.yml

在此示例中,可以使用 gitlab.com/my-namespace/my-project/dast@<version> 引用该组件。

4. 发布组件

要为 CI/CD 组件创建版本,请在 CI/CD 管道中使用 release 关键字。

例如:

create-release:stage: deployimage: registry.gitlab.com/gitlab-org/release-cli:latestrules:- if: $CI_COMMIT_TAG =~ /^v\d+/script: echo "Creating release $CI_COMMIT_TAG"release:tag_name: $CI_COMMIT_TAGdescription: "Release $CI_COMMIT_TAG of components repository $CI_PROJECT_PATH"

在此示例中,作业仅针对格式为 v + 版本号的标签运行。如果之前的所有作业均成功,则将创建版本。

与组件测试示例一样,您可以将组件设置为在新标签的所有测试通过管道后自动发布。

组件存储库的所有已发布版本都显示在 CI/CD 目录中,为用户提供有关正式版本的信息。

通过使用提交 SHA 或引用,组件可以在不被释放的情况下使用。但是,~latest version 关键字只能与已发布的标签一起使用。

~latest 关键字始终返回最新版本,而不是具有最新语义版本的版本。例如,如果您首先发布 v2.0.0,然后发布 v1.5.1 等补丁修复,则 ~latest 将返回 v1.5.1 版本。

5. 在 CI/CD 配置中使用组件

你可以使用 include: component 关键字将组件添加到 CI/CD 配置中。例如:

include:- component: gitlab.example.com/my-namespace/my-project@1.0inputs:stage: build

该组件由唯一地址标识,格式为 /@,其中:

  • <fully-qualified-domain-name> 与 GitLab 主机匹配;
  • <component-path> 是组件项目的完整路径和组件YAML文件所在的目录;
  • <specific-version> 是组件的版本,按照优先级最高的顺序,版本可以是:
    • 分支名称,例如 main;
    • 提交 SHA,例如 e3262fdd0914fa823210cdb79a8c421e2cef79d8;
    • 一个标签,例如:1.0。如果标签和分支存在同名,则标签优先于分支。如果标签和提交 SHA 存在同名,则提交 SHA 优先于标签。
    • ~latest,这是一个特殊版本,始终指向最新发布的标签。仅当组件已发布时才可用。

例如,对于位于 gitlab.com 上的 gitlab-org/dast 的组件存储库,路径:

  • gitlab.com/gitlab-org/dast@main 的目标是主分支根目录中的 template.yml 。
  • gitlab.com/gitlab-org/dast@e3262fdd0914fa823210cdb79a8c421e2cef79d8 针对指定提交 SHA 的目标文件相同。
  • gitlab.com/gitlab-org/dast@1.0 针对 1.0 标签的相同文件。
  • gitlab.com/gitlab-org/dast@~latest针对最新版本的相同文件。
  • gitlab.com/gitlab-org/dast/api-scan@main 针对主分支的不同文件,即组件存储库中 /api-scan 目录中的 template.yml 。

5.1 避免使用全局关键字

避免在组件中使用全局关键字。在组件中使用这些关键字会影响管道中的所有作业,包括直接在主 .gitlab-ci.yml 或其他包含的组件中定义的作业。

作为全局关键字的替代方案,可以:

  • 将配置直接添加到每个作业中,即使它会在组件配置中产生一些重复。
  • 在组件中使用 extends 关键字。

例如,不建议使用default关键字:

# Not recommended
default:image: ruby:3.0rspec-1:script: bundle exec rspec dir1/rspec-2:script: bundle exec rspec dir2/

相反,你可以:

  • 为每个作业添加配置:
rspec-1:image: ruby:3.0script: bundle exec rspec dir1/rspec-2:image: ruby:3.0script: bundle exec rspec dir2/
  • 使用extend来重用配置:
.rspec-image:image: ruby:3.0rspec-1:extends:- .rspec-imagescript: bundle exec rspec dir1/rspec-2:extends:- .rspec-imagescript: bundle exec rspec dir2/

5.2 用输入替换硬编码值

避免在 CI/CD 组件中硬编码值。硬编码值可能会迫使组件用户需要检查组件的内部细节并调整其管道以与组件配合使用。

stage 是具有有问题的硬编码值的常见关键字。如果组件作业的阶段设置为特定值,则使用该组件的管道必须定义完全相同的阶段。此外,如果组件用户想要使用不同的阶段,他们必须覆盖配置。

首选方法是使用输入关键字。组件用户可以指定他们需要的确切值。

例如:

  • 在组件配置中:
spec:inputs:stage:default: test
---
unit-test:stage: $[[ inputs.stage ]]script: echo unit testsintegration-test:stage: $[[ inputs.stage ]]script: echo integration tests
  • 在项目中使用该组件:
include:- component: gitlab.com/gitlab-org/ruby-test@1.0inputs:stage: verifystages: [verify, deploy]

5.3 用输入替换自定义 CI/CD 变量

在组件中使用 CI/CD 变量时,请评估是否应改用 input 关键字。避免要求用户定义自定义变量来更改组件的行为。您应该尝试使用输入进行任何组件自定义.

输入在组件的规范中明确定义,并且比变量得到更好的验证。例如,如果所需的输入未传递给组件,GitLab 将返回管道错误。相反,如果变量未定义,则其值为空,并且不会出现错误。

例如,使用输入而不是变量来让用户更改扫描仪的输出格式:

  • 在组件配置中:
spec:inputs:scanner-output:default: json
---
my-scanner:script: my-scan --output $[[ inputs.scanner-output ]]
  • 在项目中使用该组件:
include:- component: gitlab.example.com/my-scanner@1.0inputs:scanner-output: yaml

在其他情况下,CI/CD 变量仍然是首选,包括:

  • 使用预定义变量自动配置组件以匹配用户的项目。
  • 要求将令牌或其他敏感值存储为项目设置中的屏蔽或受保护变量。

6. 将 CI/CD 模板转换为组件

您通过使用 include: 语法在项目中使用的任何现有 CI/CD 模板都可以转换为 CI/CD 组件:

  1. 决定是否希望该组件成为现有组件存储库的一部分并与其他组件分组,或者创建并设置新的组件存储库。
  2. 根据预期的目录结构在组件存储库中创建 YAML 文件。
  3. 将原始模板 YAML 文件的内容复制到新组件 YAML 文件中。
  4. 将新组件的配置重构为:
    • 遵循组件的最佳实践。
    • 改进配置,例如启用合并请求管道或提高其效率。
  5. 利用组件存储库中的 .gitlab-ci.yml 来测试对组件的更改。
  6. 标记并释放组件。

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

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

相关文章

NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的…

L1-006:连续因子

题目描述 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输入在一行…

文献速递:人工智能在健康和医学中

人工智能在健康和医学中 01 文献速递介绍 这篇文章详细探讨了人工智能&#xff08;AI&#xff09;在医学领域的最新进展、挑战和未来发展的机遇。 1.医学AI算法的最新进展&#xff1a; **AI在医疗实践中的应用&#xff1a;**虽然AI系统在多项回顾性医学研究中表现出色&…

软件测试面试最全八股文

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 3276…

Grub编译与调试

Grub编译与调试 文章目录 Grub编译与调试1. Grub编译2. Grub文件生成2.1 grub.efi2.2 grub.cfg2.3 将grub安装至UEFI引导界面 3. GRUB界面4. 编辑GRUB选项5. 手动找grub.cfg6. 没有grub.cfg的情况下引导内核7. Grub增加串口7.1 使能串口7.2 使能串口输入 8. Grub打开debug 1. G…

springboot启动项目自动动态加载数据库的groovy脚本

将groovy脚本保存在数据库中&#xff0c;页面支持动态增删改查&#xff0c;启动springboot项目时&#xff0c;从数据库中读取groovy配置表&#xff0c;然后编译脚本&#xff0c;项目中就可以直接调用使用脚本。 开发环境&#xff1a;springbootMybatisPlus 脚本实体类&#x…

c++ 的几种用法

1. 声明引用&#xff1a;别名 改变ref a 都修改源数据 源地址数值 int a 10; int& ref a; // 声明一个引用变量ref&#xff0c;它引用了变量a 为什么要用别名: 1 给变量起一个更容易理解的名子 2 给函数/方法 传参 取这个参数的地址的值 修改的是源数据值 更高效 不多用…

TD-LTE通信

TD-LTE 目录 1 TD-LTE的发展历程 2 1.1 第一代移动通信系统 2 1.2 第二代移动通信系统 2 1.3 第三代移动通信系统 2 1.4 第四代移动通信系统 3 2 TD-LTE简析概述 3 2.1 TD-LTE概念 3 2.2 TD-LTE的特点 3 2.3 TD-LTE的优缺点 4 2.3.1 优点 4 2.3.2 缺点 4 2.4 TD-LTE规模试验需…

mysql-binlog,redolog 和 undolog区别

binlog MySQL的binlog&#xff08;二进制日志 或 归档日志&#xff09;是一种记录数据库的更改操作的日志。它包含了对数据库进行的插入、更新和删除操作的详细信息。binlog是以二进制格式存储&#xff0c;可以用于恢复数据库、数据复制和数据同步等操作。具体来说&#xff0c…

工业机器视觉megauging(向光有光)使用说明书(五,轻量级的visionpro)

这个说明主要介绍抓线功能。 第一步&#xff0c;添加线工具&#xff0c;鼠标双击工具箱“抓线”&#xff0c;出现如下界面&#xff1a; 第二步&#xff0c;我们拉一条&#xff0c;“九点标定”到“抓线1”的线&#xff0c;和visionpro操作一样&#xff1a; 第三步&#xff0c;…

torch中的随机数种子

如何在torch生成随机数时&#xff0c;设置随机种子&#xff0c;要求每次调用生成的随机数都一样 在 PyTorch 中&#xff0c;可以使用 torch.manual_seed(seed) 函数设置随机种子&#xff0c;以确保每次运行代码时生成的随机数都一样。 以下是一个示例代码&#xff0c;展示了如…

vue循环v-for遍历图表

循环遍历图表 index.vue主页面 <view v-if"powerPage"><view v-for"(item, index) in powerDetailsData.addMap" :key"index"><PowerEChartsCity:echartData"powerDetailsData.addMap[index]"></PowerEChartsC…

LeetCode 1094. 拼车:优先队列

【LetMeFly】1094.拼车&#xff1a;优先队列 力扣题目链接&#xff1a;https://leetcode.cn/problems/car-pooling/ 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组…

【JavaSE学习专栏】第03篇 数组

文章目录 1 数组的定义2 数组声明创建3 数组的初始化4 数组的四个基本特点5 数组边界6 数组的使用7 多维数组8 Arrays类9 冒泡排序9.1 原理9.2 代码实现 10 数组插入算法10.1 问题10.2 分析10.3 代码 11 稀疏矩阵11.1 稀疏数组介绍 1 数组的定义 数组是相同类型数据的有序集合。…

备战春招——12.1 算法

动态规划 动态规划的核心思想就是 本次只由上一次决定。 爬楼梯 第3阶由&#xff08;第1节2&#xff09;和&#xff08;第二节1&#xff09;&#xff0c;不要想着往下迭代&#xff0c;不然那是个无穷底。所以f(x)f(x-1)f(x-2) (x>2)。所以就是当前只与上个操作相关。 cla…

Jmeter组件执行顺序与作用域

一、Jmeter重要组件 1&#xff09;配置元件---Config Element&#xff1a; 用于初始化默认值和变量&#xff0c;以便后续采样器使用。配置元件大其作用域的初始阶段处理&#xff0c;配置元件仅对其所在的测试树分支有效&#xff0c;如&#xff0c;在同一个作用域的任何采样器…

肖sir__mysql之单表练习题2__(2)

mysql之单表练习题 一.建表语句 create table grade(class int(4),chinese int(8),english int(4),math int(8),name varchar(20),age int(8),sid int(4)primary key auto_increment) DEFAULT charsetutf8; insert into grade(class,chinese,english,math,name,age)values(1833…

012 OpenCV sobel边缘检测

目录 一、环境 二、soble原理介绍 三、源码实验 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、soble原理介绍 Sobel边缘检测是一种广泛应用于图像处理领域的边缘检测算法&#xff0c;它通过计算图像灰度函数在水平方向和垂直…

微服务--03--OpenFeign 实现远程调用 (负载均衡组件SpringCloudLoadBalancer)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OpenFeign其作用就是基于SpringMVC的常见注解&#xff0c;帮我们优雅的实现http请求的发送。 RestTemplate实现了服务的远程调用 OpenFeign快速入门负载均衡组件Spr…

Java医院综合绩效考核系统支持主流绩效方案

医院绩效考核管理系统是采用B/S架构模式设计、使用JAVA语言开发、后台使用MySql数据库进行管理的一整套计算机应用软件。系统和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作…