4道数学题,求解极狐GitLab CI 流水线|第23题:父子流水线 + 多项目流水线

news2024/11/13 12:59:28

本文来自:

武让 极狐(GitLab) 高级解决方案架构师

💡 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins ,排在第二位。

极狐GitLab 流水线有 4 种不同类型,分别是:

有向无环图流水线

父子流水线

多项目流水线

合并列车

但仅靠这些流水线类型名称和官方描述,我们很难理解其意义和用途。因此,作者结合众多用户反馈和自身实践,简明扼要 “重新定义” 了这些流水线类型,并通过 3 篇连载文章为您解答,帮助您掌握极狐GitLab 流水线。

第 1 篇分享了🔗有向无环图流水线 。

本文是第 2 篇——父子流水线 + 多项目流水线 ,enjoy~

父子流水线 Parent-Child Pipelines


1. 官方定义

Parent-Child Pipelines 即父子流水线,它和 Multi-Project Pipelines 多项目流水线都属于下游流水线。所谓下游流水线:

由另一个流水线触发的任何极狐GitLab CI/CD 流水线。它可以是:

  • 一个父子流水线,是与第一个流水线在同一个项目(代码库)中触发的下游流水线;

  • 多项目流水线,是在与第一个流水线不同的项目(代码库)中触发的下游流水线。

父子流水线,官方定义和介绍如下:

父流水线是在同一项目(代码库)中触发下游流水线的流水线,下游流水线称为子流水线

  • 子流水线仍然根据阶段顺序执行他们的每个工作,但可以自由地继续他们的阶段,而无需等待父流水线中不相关的工作完成;

  • 该配置被拆分为更小的子流水线配置。每个子流水线只包含更容易理解的相关步骤,减少了理解整体配置的认知负担;

  • 导入在子流水线级别完成,减少了冲突的可能性。

这个解释比 DAG 流水线要容易理解一些,但是我们依然可以换一种比较接地气的方式进行重新描述。

2. 重新定义

父子流水线解决一个判断题+选择题

主要功能

  • (按条件触发并)执行同一个项目(代码库)中不同的流水线脚本。

3. 问题解答

接着第 1 篇 有向无环图有向无环图流水线有向无环图 中的问题 1 继续,还是那个跨平台项目。

问题 2

假如现在 iOS 平台应用有一些 Bug,开发人员仅对 iOS 部分代码进行了修改,然后希望编译打包 iOS 平台应用并发布上线。但不希望再次打包 PC 和 Android 平台,浪费时间和资源,怎么办?假如是个通用问题,在 3 个平台上都出现了,那么修改通用部分代码后还需要同时打包 3 个平台的应用,又该怎么办?这个跨平台项目文件目录如下:


- common
  - code_files...
  - .gitlab-ci.yaml #全部平台构建打包脚本
- android
  - code_files...
  - .gitlab-ci.yaml  #Android平台构建打包脚本
- ios
  - code_files...
  - .gitlab-ci.yaml #iOS平台构建打包脚本
- pc
  - code_files...
  - .gitlab-ci.yaml #pc平台构建打包脚本

为了解决这个问题,就需要使用到父子流水线,主要会使用到 rules:is:changes 和 trigger 关键字,用来实现按条件触发,然后执行不同流水线脚本,比如:

stages:
  - build
  - triggers

android_trigger:
  stage: triggers
  # 当android目录下的文件发生变化时触发
  rules:
    - if: 
      changes:
        - android/*
  # 触发执行android/.gitlab-ci.yml脚本
  trigger:
    include: android/.gitlab-ci.yml
    strategy: depend
  

ios_trigger:
  stage: triggers
  # 当ios目录下的文件发生变化时触发
  rules:
    - if: 
      changes:
        - ios/*
  # 触发执行ios/.gitlab-ci.yml脚本
  trigger:
    include: ios/.gitlab-ci.yml
    strategy: depend
  

pc_trigger:
  stage: triggers
  # 当pc目录下的文件发生变化时触发
  rules:
    - if:
      changes:
        - pc/*
  # 触发执行pc/.gitlab-ci.yml脚本
  trigger:
    include: pc/.gitlab-ci.yml
    strategy: depend

common_build:
  stage: build
  script:
      - echo "common build"
  # 当common目录下的文件发生变化时触发,执行默认的根目录.gitlab-ci.yml脚本
  rules:
    - changes:
      - common/*

当修改 iOS 目录文件后,只触发了 ios/.gitlab-ci.yml 脚本的执行。

当修改 common 目录文件或直接手动执行流水线后,触发执行根目录的 .gitlab-ci.yml 脚本,也就是触发所有构建。

当然这个判断题不是必要的,可以在一个正常的 Job 中直接做选择题,比如:


microservice_a:
  trigger:
    include: path/to/microservice_a.yml

也可以修改判断题的条件,比如使用极狐GitLab 的变量来进行条件控制:

pc_trigger:
  stage: triggers
  # 当PLATFORM变量的值为PC时触发
  rules:
    - if: $PLATFORM == "PC"
  # 触发执行pc/.gitlab-ci.yml脚本
  trigger:
    include: pc/.gitlab-ci.yml
    strategy: depend

这样就实现了按照条件触发不同的流水线脚本,这也就是说为什么父子流水线是解决一个判断题 + 选择题,以及它是如何(按条件触发并)执行同一个项目中不同的流水线脚本的。

4. 总结父子流水线使用场景

1.  按条件灵活触发并执行一个项目中不同的流水线脚本:比如在一个项目中,将一个复杂的流水线脚本拆分成多个简单的流水线脚本,通过 tigger 关键字组合,实现解耦和降低复杂度。或类似上文中提到的按条件单独执行 Monorepo 中部分模块的构建、测试、打包。

2.  父子流水线 + DAG 流水线:可以将父子流水线与 DAG 流水线结合使用,比如 pc/.gitlab-ci.yml 中依然使用 DAG 流水线使得 test_pc 依赖 build_pc 和 build_pc_dll

多项目流水线 Multi-Project Pipelines


1. 官方定义

Multi-Project Pipelines 多项目流水线,它和父子流水线都属于下游流水线,官方定义和介绍如下:

可以跨多个项目(代码库)设置极狐GitLab CI/CD,以便一个项目(代码库)中的流水线可以触发另一个项目(代码库)中的流水线。您可以在一个地方可视化整个流水线,包括所有跨项目的相互依赖关系。

熟悉了父子流水线后,再看多项目流水线就比较简单了。它们都是触发下游不同的流水线,只是面向的对象不同,父子流水线面向的是同一个项目(代码库),而多项目流水线是面向不同的项目(代码库),这也决定了它们使用的场景不同。

2. 重新定义

继续用通俗的语言来解释:

多项目流水线解决的是排列组合题

主要功能

  • 编排并执行不同的项目(代码库)中的流水线脚本。

回顾上文中的 DAG 流水线和父子流水线,使用的场景大多都是在 Monorepo 模式下,对一个项目内的流水线或者 Job 进行编排。而现在架构设计领域的主流思想还是模块化和微服务,所以不少企业或开发人员还是习惯对项目进行拆分,用多个代码库进行管理。在这样的模式下,DAG 和父子流水线使用的机会就相对较少了,而多项目流水线就派上了用场。举例如下:

3. 问题解答

问题 3

假设有个 Web 项目,在极狐GitLab 中建立了一个群组 MyProject 来管理这个项目。前端代码放在代码库 MyProject/Frontend 中,后台代码放在代码库 MyProject/Server 中。测试团队对前端代码编写的UI自动化测试脚本放在代码库 MyProject/Frontend-UI-Testing 中,对后台代码编写的 API 自动化测试脚本放在代码库 MyProject/Server-API-Testing 中。要求部署时先部署后台代码,再部署前端代码,并同步进行后台的 API 测试,最后再进行前端的 UI 测试。

使用多项目流水线来解决这个问题,依然要使用 trigger 关键字。由于该问题中,后台代码的流水线是整个业务链条的起点,所以先看代码库 MyProject/Server 的流水线:

stages:          
  - build
  - test
  - deploy
  - downstream
# 编译构建
build-job:      
  stage: build
  script:
    - echo "Compiling code..."
    - echo "Compile complete."
# 单元测试
unit-test-job:   
  stage: test    
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 6
    - echo "Code coverage is 90%"
# 格式校验
lint-test-job:   
  stage: test    
  script:
    - echo "Linting code... This will take about 10 seconds."
    - sleep 1
    - echo "No lint issues found."
# 部署任务
deploy-job:      
  stage: deploy  
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."
# API测试
api-test-job:
  stage: downstream
  # 触发下游流水线
  trigger:
    project: MyProject/Server-API-Testing
    strategy: depend
# 部署前端
deploy-frontend-job:
  stage: downstream
  # 触发下游流水线
  trigger:
    project: MyProject/Frontend
    strategy: depend

当前端项目部署成功后需要执行前端的 UI 测试,所以代码库 MyProject/Frontend 的流水线如下:


stages:          
  - build
  - test
  - deploy
  - downstream
  
# 省略build、test、deploy脚本  

# UI测试
ui-test-job:
  stage: downstream
  # 触发下游流水线
  trigger:
    project: MyProject/Frontend-UI-Testing
    strategy: depend

流水线运行效果如下,也就是官方定义中所说的 “您可以在一个地方可视化整个流水线,包括所有跨项目的相互依赖关系”,但这个功能是属于极狐GitLab 专业版及以上版本,免费版无法看到这个效果。

正因为多项目流水线能够编排多个项目(代码库)流水线,所以说它解决的是一个排列组合题

4. 总结多项目流水线使用场景

按顺序触发并执行不同项目的流水线脚本:比如部署后运行自动化测试,或按照一定的顺序部署不同的模块、服务等。

🌟 极狐GitLab 4 种流水线之 “父子流水线 & 多项目流水线” 暂且搁笔,希望以上内容对您有帮助!接下来我们的连载内容是:

  • 合并列车

欢迎关注极狐GitLab,及时 “追番” 不迷路!

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

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

相关文章

如何解决错误“已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)“

解决 Microsoft SQL Server 的错误: 1222 使用存储过程 sp_who2设置 LOCK_TIMEOUT在Microsoft SQL Server Management Studio中,有时会在对象资源管理器中查看树、表或过程时收到错误。当查询等待的时间超过锁定超时设置时,通常会发生此错误。锁定超时以毫秒为单位,等待后端…

LeetCode 382. 链表随机节点

原题链接 难度:middle\color{orange}{middle}middle 题目描述 给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。 实现 SolutionSolutionSolution 类: Solution(ListNodehead)Solution…

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据…

Amazon S3简介

前言: 这段时间来到了某大数据平台,做平台技术底座封装和一些架构等等,有结构化数据也有非结构数据,涉及到很多技术,自己也私下花时间去研究了很多,有很多纯技术类的还是需要梳理并记录,巩固以及…

保姆级教程:Win10远程连接MACBook、MACBook远程连接Win10。

本篇给大家展示Windows远程连接连接MACBook、MACBook远程连接Windows的方法。需要明确的是,这种通过TCP远程连接的远程很稳定,基本比向日葵等软件流畅很多,但是缺点是需要保证在同一网域下,也就是同一局域网下,部分情况…

中国协同办公的终局是什么?

换言之,工具一体化是基本要求,但基于全链路集成的生态则是因地制宜、于当下的产业探索。 作者|斗斗 编辑|皮爷 出品|产业家 “计划裁员1300人,占到全球员工的15%。”美国东部时间2月7日,Zoom CEO袁征在官网博客发布公开信…

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同…

Python机器学习入门笔记(2)—— 分类算法

目录 转换器(transformer)和估计器(estimator) K-近邻(K-Nearest Neighbors,简称KNN)算法 模型选择与调优 交叉验证(Cross-validation) GridSearchCV API 朴素贝叶…

UE4 渲染学习笔记(未完)

原文链接:虚幻4渲染管线入门 - 知乎 从原文摘抄一下: 渲染框架 1,一套是传统的以RHICmdList为核心构建RenderPass,从RHICmdList.BeginRenderPass(...)开始,以RHICmdList.EndRenderPass()结束的框架。 2.一套是以新的Gr…

【面向对象语言三大特性之 “继承”】

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟…

linux(全志)初始环境到移植lvgl

一、 格式化TF卡 1. linux命令行格式化 1.1 找到U盘位置(已挂载) sudo fdisk -l 如图,我的在/dev/sdb 1.2 格式化U盘 sudo mkfs -t vfat /dev/sdb-t 后面是格式化为哪种文件系统格式,vfat就是fat32格式,最后…

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时,查看第19条》 结论 1、链表长度大于8时(插入第9条时),会触发树化(treeifyBin)方法,但是不一定会树化,若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统,Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢,还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉,那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆,从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间,老年代默认占2/3堆内存空间,永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…

Node.js安装与配置

Node.js安装与配置 前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤,旨在为将来再次配置Node.js时提供指导方法。 另外:Node.js版本请根据自身系统选择,安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node…

spring(四)——————从spring源码角度去解释前面的疑问

前面两篇文章,我们从mybatis-spring的插件包出发,探究如何将第三方框架集成到spring中,也知道了mybatis中使用了FactoryBeanImportBeanDefifinitionRegistrarImport对mapper进行注入。 不过我们在前两篇文章中仍然遗留很多疑点,例…

Revit导出PDF格式图纸流程及“批量导出图纸”

一、Revit导出PDF格式图纸流程 1、点击左上方“应用程序菜单”即“R”图标,进择“打印”选项。 2、在弹出的对话框中,需要设置图纸“打印范围”,选择“所选的视图/图纸选项”,点击“选择”,按钮,选择我们需…

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树,把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的,最终的目标也都是一致的,最后将其结果来平均…

Xline v0.2.0: 一个用于元数据管理的分布式KV存储

Xline是什么?我们为什么要做Xline? Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低&a…