如何让GitLab Windows共享运行程序更快地构建



背景

我有一个我一直在开发的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:ChocolateyInstallhelperschocolateyProfile.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工具:编译库这已经在烹饪书中了

安装这样的软件包(无论是操作系统软件包,还是apt-get-install…或pip,或其他任何软件包)通常都不符合CI/CD作业的最佳实践,因为运行的每个作业都必须做同样的事情,在运行更多管道时会花费大量时间,正如您已经看到的那样。

一些替代方案是搜索一个拥有您所需一切的现有图像(可能但不太可能有更多的依赖项),将您的工作拆分为可能由一个或两个依赖项的图像解决的部分,或者创建一个自定义的docker图像用于您的工作。几周前,我在这里用一个例子回答了一个类似的问题:;无法定位包git";运行GitLab CI/CD管道时

但这里有一个带有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上的Public或你使用Gitlab容器注册表)https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-来自私人容器注册的图像

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

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

相关内容

最新更新