在 gitlab-ci
中有一个选项 .gitlab-ci.yml
在任何实际脚本运行之前执行命令的文件,称为 before_script
。 .gitlab-ci.yml
示例说明了在此处安装辅助程序。但是,我注意到的是,当使用 docker 执行器时,这些更改不会缓存在 Docker 中。我天真地假设在运行这些命令之后,docker 会缓存图像,因此在下一次运行或测试时,docker 只会加载 before_script
之后生成的缓存图像。这将大大加快构建速度。
举个例子,我的 .gitlab-ci.yml
有点像:
image: ubuntu
before_script:
- apt-get update -qq && apt-get install -yqq make ...
build:
script:
- cd project && make
一种可能的解决方案是转到运行器机器并创建一个 docker 镜像,该镜像可以构建我的软件而无需任何其他安装,然后在 yaml 文件的 image
部分中引用它。这样做的缺点是,每当我想添加依赖项时,我都需要登录到运行器机器并在构建成功之前更新镜像。如果我只需将依赖项添加到 apt-get install
的末尾并让 docker/gitlab-ci 处理适当的缓存,那就更好了。
.gitlab-ci.yml
中还有一个cache
命令,我试过设置成untracked: true
,我以为会缓存所有不是我项目副产品的东西,但它似乎没有任何效果。
有什么方法可以得到我想要的行为吗?
最佳答案
您可以首先添加一个阶段来构建图像。如果图像没有任何变化,这个阶段会很短,不到 1 秒。
您可以在以下阶段使用该图像,加快整个过程。
这是一个.gitlab-ci.yml
的例子:
stages:
- build_test_image
- test
build_test:
stage: build_test_image
script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile .
- docker push $CI_REGISTRY_IMAGE:test
tags:
- docker_build
test_syntax:
image: $CI_REGISTRY_IMAGE:test
stage: test
script:
- pip install flake8
- flake8 --ignore=E501,E265 app/
查看标签 docker_build
。该标签用于强制在具有该标签的运行器上执行阶段。该运行器的执行器是 shell
,它仅用于构建 Docker 镜像。所以,runner 所在的主机应该已经安装了 Docker Engine。我发现这个解决方案比 docker in docker 和 another solutions 更适合我的需求。 .
另外,我使用的是私有(private)注册表,这就是我使用 $CI_REGISTRY*
变量的原因,但您可以使用 DockerHub 而无需指定注册表。不过,问题在于在 DockerHub 上进行身份验证。
关于docker - Gitlab docker executor - 在 before_script 之后缓存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34820755/