【问题标题】:How to make GitLab Windows shared runners to build faster?如何让 GitLab Windows 共享运行器构建速度更快?
【发布时间】:2021-02-15 16:28:53
【问题描述】:

背景

我有一个用于我一直在开发的 C++ 库的 CI 管道。到目前为止,我可以将此库分发到 Linux 和 Windows 系统。由于我使用 GitLab 构建、测试和打包我的 lib,我希望我的 Windows 构建运行得更快,但我不知道如何做到这一点。

目前,我在 Windows 构建中使用以下脚本:

.windows_template:
tags:
    - windows
before_script:
    - choco install cmake.install -y --installargs '"ADD_CMAKE_TO_PATH=System"'
    - choco install python --pre -y
    - choco install git -y
    - $env:ChocolateyInstall = Convert-Path "$((Get-Command choco).Path)\..\.."; Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"; refreshenv
    - python -m pip install --upgrade pip
    - pip install conan monotonic

问题

使用上述脚本进行的任何构建最多可能需要 10 分钟;更糟糕的是:我有两个阶段,每个阶段都花费相同的时间。这意味着我的整个 CI 管道将需要 20 分钟 才能完成,因为 Windows 构建速度很慢。

理想的解决方案

before_script 中的所有内容都可以缓存或存储为图像。我只需要一些关于如何正确操作的提示。

附加信息

我使用以下工具进行构建:

  • CMake:支持我的构建过程;
  • Python3:测试和构建包;
  • Conan(需要 Python3):支持创建具有多种功能的包并分发它们;
  • Git:在 CMake 配置步骤中下载 Googletest 这已在食谱中提供 - 我可能会在我的 before_script 中删除这个额外的安装步骤;
  • Googletest(需要 Python3):测试库;
  • Visual Studio DEV 工具:编译库 这已经在食谱中

【问题讨论】:

  • 或者,您可以使用预先安装好的 Docker 映像,并能够在任何地方重现相同的构建环境。 Conan Docker Tools 提供了Docker recipe,但由于 Visual Studio 的分发许可限制,没有可用的 Docker 映像。您可以分叉该项目并更新您需要的内容。
  • @uilianries 我认为在 GitLab CI 上运行基于 Windows 的图像是不可能的。我认为唯一的选择是使用 Packer,如 documentation 中所述(老实说,我没有进一步尝试此选项)。他们的Docker images 文档也没有提到任何关于 Windows 容器的内容。如果可能的话,我可以考虑您的评论作为答案。

标签: c++ windows gitlab gitlab-ci conan


【解决方案1】:

像这样安装包(无论是通过 apt-get install... 还是 pip 或其他任何方式安装的 OS 包)通常违反 CI/CD 作业的最佳实践,因为运行的每个作业都必须执行相同的操作,正如您已经看到的那样,随着您运行更多管道会花费大量时间。

一些替代方法是搜索具有您需要的一切的现有图像(可能但不太可能具有更多依赖项),将您的工作分成可能由仅具有一两个依赖项的图像解决的部分,或者创建在您的工作中使用的自定义 docker 映像。几周前我在这里用一个例子回答了一个类似的问题:"Unable to locate package git" when running GitLab CI/CD pipeline

但这里有一个使用 Windows 的 Dockerfile 示例:

# Dockerfile
FROM mcr.microsoft.com/windows
RUN ./install_chocolatey.sh
RUN choco install cmake.install -y --installargs '"ADD_CMAKE_TO_PATH=System"'
RUN choco install python --pre -y
RUN choco install git -y
...

FROM 行表示我们的新映像扩展了 mcr.microsoft.com/windows 基本映像。您可以扩展您有权访问的任何图像,即使它已经扩展了另一个图像(事实上,这就是大多数图像的工作方式:它们从一些小的东西开始,例如基本操作系统安装,然后添加该包所需的东西。例如 PHP在 Ubuntu 映像上启动,然后安装必要的 PHP 包)。

第一行RUN 只是一个示例。我不是 Windows 用户,也没有安装 Chocolatey 的经验,但是您可以在这里执行通常在本地安装它的任何操作。其余的用于安装您需要的任何其他东西。

然后运行

docker build /path/to/dockerfile-dir -t mygroup/mytag:version

您提供的路径必须是包含 Dockerfile 的目录,而不是 Dockerfile 本身。 -t 标志在图像构建后设置图像的标签(尽管您也可以使用单独的命令 docker tag 来实现)。

接下来,您必须登录您使用的任何注册表(Docker Hub (https://docs.docker.com/docker-hub/repos/)、Gitlab 容器注册表 (https://docs.gitlab.com/ee/user/packages/container_registry/)、您的雇主可能支持的私有注册表或任何其他选项。

docker login my.docker.hub.com

现在您可以将图像推送到注册表:

docker push my.docker.hub.com/mygroup/mytag:version

您必须查看文档中有关告诉您的 Gitlab 运行器或管道如何使用注册表进行身份验证的信息(除非它在 ​​Docker Hub 上是公共的,或者您使用 Gitlab 容器注册表)https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-an-image-from-a-private-container-registry

所有这些都完成后,您就可以在 CI 作业中使用您的新图像,我们放入图像中的所有内容都可以使用了:

.windows_template:
image: my.docker.hub.com/mygroup/mytag:version
tags:
    - windows
...

【讨论】:

  • 嗨@Adam!从GitLab docs 我可以看到Windows 共享运行器没有启用imageservices。这就是我想采用一些缓存策略而不是创建自己的映像的主要原因,尽管这是最好的解决方案(顺便说一下,这就是我为我的 Linux 构建所做的)。请问您知道其他一些解决方案吗?
  • 根据the docs 有一个docker-windows 执行器,您可以使用它来容器化您的管道作业,但如果您由于某种原因不能使用它,您是否使用@987654342 @执行者?如果是这样,您可以直接在运行 gitlab-runner 的主机上安装您需要的任何东西。
  • 我使用 GitLab CI 共享运行器,这意味着我没有专门的运行器。我已经完成了所有设置:我的image 和我的工作。但似乎 GitLab CI 无法提取 Windows 映像并在执行程序中使用它......至少不是以我知道该怎么做的方式。为什么Windows开发这么难?我真的希望我能在今天之前完成这项工作,但这似乎不太可能:(。
  • 嗨@Adam。我刚刚发现这篇文章有一个解决方法:stackoverflow.com/questions/65199082/… 我也想这样做,但老实说,如果可能的话,我宁愿让事情变得更复杂一些。有什么想法吗?
  • @magjac 我也尝试过使用它,但是,正如您所提到的,它没有从中获得任何价值。在另一件事上,最近我注意到在不同的构建中使用choco install 变得更快了。我没有机会验证这一点,但也许他们创建了某种程度的缓存?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
相关资源
最近更新 更多