Gitlab CI 同时在多个平台上运行

2024-03-17

我有一个针对多个操作系统(Linux、Windows、MacOS)以及多个 CPU 架构(i386、x86_64、arm、Aarch64)编译和打包的 C++ 项目 为此,我使用 Jenkins 获取源代码并在每个系统上并行运行构建脚本。这是一个简单的工作解决方案,因为我的构建脚本处理系统差异。

现在我正在研究 Gitlab CI/CD,它有很多吸引我的地方(能够将构建脚本作为存储库的一部分,与 git 存储库和票务系统很好地集成,自然使用 Docker 容器,等),但我找不到任何方法可以在多个体系结构/系统中彼此并行地运行相同的管道。

所以,假设我的构建脚本是:

build:
  stage: build
  script: 
    - uname -m > arch.txt
  artifacts:
    paths:
      - arch.txt

我如何告诉 Gitlab 我想同时在多个运行器/Docker 容器/系统中运行此作业?到目前为止我读过的所有文档都涉及在一个构建上运行多个测试 https://docs.gitlab.com/ee/ci/pipelines.html#types-of-pipelines, 整合多个项目 https://docs.gitlab.com/ee/ci/multi_project_pipelines.html or 根据分支部署在不同的环境中 https://docs.gitlab.com/ee/ci/environments.html。到目前为止,我读过的任何内容都没有尝试进行许多单独的构建、单独测试和打包它们并报告它们的独立结果。这在 Gitlab CI/CD 上可行吗?


GitLab 使用“runners”来执行 CI 作业。运行器安装在您想要运行 CI 作业的任何位置,因此如果您想在多个架构上运行,那么您需要在每个架构的系统上安装运行器。可以在此处找到运行器安装文档:

https://docs.gitlab.com/runner/install/index.html https://docs.gitlab.com/runner/install/index.html

对于基于 Linux 的作业,通常使用 Docker 来执行作业 - 这并没有提供架构灵活性,但它确实允许您使用容器化来测试不同风格和不同软件。对于其他架构,您可能需要自己安装运行器,或使用其他人的共享运行器。

在安装运行器软件时,有一些关键步骤:

  • 您有机会将每个运行程序链接到您的 GitLab 项目,这意味着它将显示在项目 > 设置 > CI/CD 下的运行程序列表中。

  • 您将有机会为跑步者分配“标签”。标签可用于帮助通过任意名称识别一个运行程序或一组运行程序(例如,您可以添加“Windows x86_64”作为标签,或“Windows”和“x86_64”标签)。这些标签可以在作业中使用来选择跑步者。

安装跑步者后,您可以编辑您的跑步者.gitlab-ci.yml file.

GitLab CI 文件被分为“阶段”。每个阶段的作业可以并行运行。阶段名称在文件顶部定义。

stages:
  - build
  - deploy

每个 CI 作业都可以使用以下方法附加到一个阶段:stage: entry:

build job:
  stage: build
  script:
    - echo "I am a build stage job"

在您的情况下,您将需要为您想要构建的每个架构创建多个作业。将它们连接到同一阶段将允许它们并行运行。

要控制每个作业的运行位置,您有两种主要机制:

  1. 标签 - 标签允许您将作业固定到跑步者标签。您可以使用指定多个标签tags:形成 AND 列表的条目(例如win标记与x86_64标签)。当该作业运行时,GitLab 将找到一个具有所有必需标签的运行程序,并在那里运行该作业。

  2. 镜像 - 在 Docker / Kubernetes 上运行时,您可以指定用于运行程序的 docker 镜像。要使用 docker 镜像,您首先需要指定一个可以运行 docker 镜像的运行程序(例如 docker-in-docker 或 kubernetes 运行程序),例如,它可能被标记为docker or kubernetes。然后你使用image:指定 docker 镜像的条目。

这是显示标签和图像的示例:

build win x86_64:
  stage: build
  tags:
    - win
    - x86_64
  script:
    - echo "I am a build stage job for win x86_64"

build win 32:
  stage: build
  tags:
    - win
    - 32-bit
  script:
    - echo "I am a build stage job for win 32"

build debian:
  stage: build
  tags:
    - docker
  image: debian:stretch
  script:
    - echo "I am a build stage job for debian, running on docker using debian:stretch image"

目前不支持动态作业,或在多个运行器/架构上运行一个作业,因此这需要一些手动工作。从积极的一面来看,它使 GitLab CI 文件易于阅读,并且易于查看 CI 执行期间将运行的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gitlab CI 同时在多个平台上运行 的相关文章

随机推荐

  • 如何从 8 位字节转换为 7 位字节(Base 256 到 Base 128)

    如何从 8 位字节转换为 7 位字节 Base 256 到 Base 128 我想做这样的事情 public string BytesToString byte in public byte StringToBytes string in
  • Angular Ag-Grid 无法正确显示

    我正在尝试使用角度Ag Grid https www ag grid com 在我的网络应用程序中 我已经遵循了这些教程 角网格 开始使用 ag Grid https www ag grid com angular getting star
  • Powershell 默认下拉值

    我有一个脚本 用户可以从下拉列表中选择选项 但如果用户没有选择任何内容 我就会收到错误 即使用户未输入值 如何设置返回的默认值 这是脚本 Edit This item to change the DropDown Values array
  • xquery 中的 SUM 和 GROUP BY 以及 1 个 xml 文件

    我有一个 SQL 查询 SELECT ShipVia SUM Freight FROM Orders GROUP BY ShipVia 它从访问数据库返回以下值 Ship Via TotalFreight 1 16 185 33 2 28
  • android - 如何创建可重用的函数?

    在我的 Android 项目中 我有很多活动 其中一些活动已经扩展了其他内容 例如地图活动或 BroadcastReceiver 如何创建一个可以从任何活动调用的函数 因为我不想在多个活动中重复任何代码 thanks 如果我有一些有用的函数
  • Scala 集合已排序、sortWith 和 sortBy 性能

    Scala在标准库中包含了几种用于对列表进行排序的方法 例如对列表进行排序list 可以使用 list sorted list sortWith lt list sortBy x gt x 虽然这些可能是对列表进行排序的最简单方法 但我发现
  • 用于分组 UITableView 的半透明 UITableViewCell?

    我想创建一个半透明分组表视图单元格 换句话说 我想看到分组的表格视图背景图案 但我不想要完全清晰的单元格 我见过很多关于透明单元的问题 但没有一个解决制作半透明 仅部分透明 单元的问题 这就是我正在尝试的 void tableView UI
  • 如何检测内存不足的段错误?

    如何检测段错误是否是由内存不足情况引起的 我有一个段错误 无法通过 valgrind 和 duma efence 进行诊断 因为它似乎使这些工具本身崩溃 Valgrind 不可能的事情发生了 duma mprotect 失败 无法分配内存
  • .sql 文件的存储过程

    SQL 2005 中是否有一个简单的过程可以将我的所有存储过程吐出到单独的 sql 文件中 我想将它们转移到 VSS 中 但我对单击每个文件获取源代码 将其转储到文本文件等的前景感到不太兴奋 在 SQL Management Studio
  • DocuSign 嵌入签名 returnUrl 长度限制?

    在处理 DocuSign 嵌入式签名流程 过去曾有效 时 我注意到在签署文档后 我被发送回的 returnUrl 中缺少 event 参数 returnUrl 看起来像 http www example com index php para
  • 什么是 Android 的 Smali 代码

    我将学习一些有关 Dalvik VM dex 和 Smali 的知识 我已经阅读过有关 smali 的内容 但仍然无法清楚地了解它在编译器链中的位置 以及它的目的是什么 这里有一些问题 据我所知 dalvik 与其他虚拟机一样运行字节码 对
  • Neo4J - 存储到关系与节点中

    我想知道将数据存储到关系或节点中是否有任何优点或缺点 例如 如果我要将与讨论相关的评论存储到数据库中 我应该将评论数据存储在 评论 关系中 还是通过单独的关系存储在与讨论相关的 评论 节点中 正确的数据模型取决于您需要进行的查询类型 您应该
  • 设计时和运行时的 WPF 数据上下文

    我正在学习 WPF MVVM Light 和 ViewModelLocator 模式 但在主窗口的数据上下文方面遇到了困难 public class ViewModelLocator public ViewModelLocator var
  • 将 C++ 类的定义放入头文件中是一个好习惯吗?

    当我们用 Java Vala 或 C 设计类时 我们将定义和声明放在同一个源文件中 但在 C 中 传统上首选将定义和声明分开在两个或多个文件中 如果我只使用一个头文件并将所有内容都放入其中 就像 Java 一样 会发生什么 是否有性能损失或
  • OS X:如何获取 macOS 上桌面目录的路径?

    如何在 macOS 上以字符串形式获取桌面目录的文件路径 我需要用纯 C 或一些 C 级框架来完成它 这是一个简短的函数 它适用于更多基于 Unix 的系统 而不仅仅是 macOS 并返回current用户的桌面文件夹 include
  • create-react-app 显示了我在生产中的所有代码,如何隐藏它?

    在我的 chrome 源选项卡中 我可以按确切的文件夹位置查看所有文件 我怎样才能隐藏它们 这些不是我之前项目中的问题 该项目是在没有使用 create react app 的情况下制作的 根据create react app 这似乎是正确
  • 下拉菜单推开下面的 div

    当鼠标悬停在菜单上时 子菜单会 拒绝 下一个 div 如何将 div 固定在下面的位置 这是我的代码 box sizing border box body font family Helvetica Neue Helvetica Arial
  • 根据 MySQL 中的半径合并边界框内的长/纬度点

    这是我基本上想要实现的目标的图片 因此 正如标题所说 我想合并长 纬度点 它们的半径 例如 25 公里 触摸长 纬度点的边界框内 这是我非常简单的数据库结构 id long lat 1 90 27137 50 00702 2 92 2713
  • 字段初始化中未处理的异常

    Java 是否有任何语法来管理声明和初始化类的成员变量时可能引发的异常 public class MyClass Doesn t compile because constructor can throw IOException priva
  • Gitlab CI 同时在多个平台上运行

    我有一个针对多个操作系统 Linux Windows MacOS 以及多个 CPU 架构 i386 x86 64 arm Aarch64 编译和打包的 C 项目 为此 我使用 Jenkins 获取源代码并在每个系统上并行运行构建脚本 这是一