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可以缓存或存储为图像。我只需要一些关于如何正确执行此操作的提示。
我在构建中使用以下工具:
before_script;中删除这个额外的安装步骤。像这样安装软件包(无论是通过 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)