Gitlab docker执行程序 – 在before_script之后caching图像

gitlab-ci中, .gitlab-ci.yml文件中有一个选项可以在任何实际脚本运行之前执行命令,称为before_script.gitlab-ci.yml示例说明在这里安装辅助程序。 不过,我注意到,在使用Docker执行程序时,这些更改不会caching在Docker中。 我曾经天真地认为运行这些命令后,docker会caching图像,所以对于下一次运行或testing,docker只会加载before_script之后生成的caching图像。 这将大大加快构build。

作为一个例子,我的.gitlab-ci.yml看起来有点像:

 image: ubuntu before_script: - apt-get update -qq && apt-get install -yqq make ... build: script: - cd project && make 

一个可能的解决scheme是去亚军机器和创build一个docker的形象,可以build立我的软件没有任何其他的安装,然后在yaml文件的image部分引用它。 不利的一面是,无论何时我想添加一个依赖项,我都需要login到亚军机器,并在构build成功之前更新镜像。 如果我只需要将依赖关系添加到apt-get install的末尾,并使用docker / gitlab-ci来处理相应的caching,那将会更好。

.gitlab-ci.yml还有一个cache命令,我尝试设置为.gitlab-ci.yml untracked: true ,我认为这会caching一切不是我的项目的副产品,但它似乎没有任何效果。

有没有什么办法可以得到我想要的行为?

您可以添加一个舞台来build立图像的第一位。 如果图像没有任何变化,舞台将会很短,不到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 ,仅用于构buildDocker镜像。 所以,跑步者所在的主机应该安装了Docker Engine。 我发现这个解决scheme比docker中的docker和其他解决scheme更适合我的需求。

此外,我正在使用私人registry,这就是为什么我使用$CI_REGISTRY*variables,但您可以使用DockerHub而无需指定registry。 但是,问题将是在DockerHub上进行身份validation。

我处理这个问题的方式是在Docker Hub上为每个项目定制图像,并从.gitlab-ci.yml引用它们。 如果我需要一个新的依赖关系,我编辑用于创build初始图像的Dockerfile,重新构build图像,并使用特定标记对其进行标记,然后推送到Docker Hub。

 cat "RUN apt-get install gcc" >> Dockerfile ID=$(docker build) docker tag $ID ACCOUNT/gitlab_ci_image:gcc docker push ACCOUNT/gitlab_ci_image 

然后我更新.gitlab-ci.yml文件以指向图像的特定版本。

 image: ACCOUNT/gitlab_ci_image:gcc build: script: - cd project && make 

这允许我有不同的依赖关系,这取决于我试图testing哪个提交(因为提交中的gitlab-ci.yml文件告诉runner使用哪个)。 它还可以防止每次在特定运行器上运行testing时都需要安装依赖项,因为只要运行器没有改变,运行器就会重新使用相同的图像。

另一件好事是,在Docker Hub上托pipe的图片上,如果跑步者需要一个本地没有的特定标签,它将会自动抓取正确的标签,这样你就可以拥有10个跑步者,只保留一个图片这个维护可以在你自己的工作站或任何机器上完成。

我个人认为,这是一个比尝试caching跑步者图像内容更好的解决scheme。 当你创build一个新的分支来在一个新版本的依赖项上testing你的代码时尤其如此。 如果你有caching,你的稳定和开发分支会有不同的testing环境。 同样在我看来,testing应该在尽可能干净的环境中运行,并且这种设置可以实现这一点。