如何让 GitLab Windows 共享运行器构建速度更快?

Rod*_*aes 6 c++ windows gitlab gitlab-ci conan

背景

我有一个用于我一直在开发的 C++ 库的 CI 管道。到目前为止,我可以将该库分发到Linux和Windows系统。由于我使用 GitLab 来构建、测试和打包我的库,因此我希望 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
Run Code Online (Sandbox Code Playgroud)

问题

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

理想的解决方案

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

附加信息

我在构建中使用以下工具:

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

Ada*_*all 2

像这样安装软件包(无论是通过 apt-get install... 或 pip 或其他任何方式安装操作系统软件包)通常不符合 CI/CD 作业的最佳实践,因为每个运行的作业都必须做同样的事情,成本很高正如您已经看到的,随着您运行更多管道,时间会减少。

一些替代方法是搜索包含您需要的一切的现有映像(可能但不太可能有更多依赖项),将您的工作分成可能由仅具有一两个依赖项的映像来解决的部分,或者创建一个自定义 docker在您的工作中使用的图像。几周前,我在这里用一个例子回答了类似的问题:“Unable to located 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
...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您必须查看文档中有关告诉 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
...
Run Code Online (Sandbox Code Playgroud)