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应该在尽可能干净的环境中运行,并且这种设置可以实现这一点。
- 使用eirslett:frontend-maven-plugin在gitlab.com上运行maven
- Docker在GitLab CI runner容器中不可用
- gitlab-runner和docker executor找不到官方的图片,比如maven:3.3.9-jdk-8
- GitlabCI运行docker审查应用程序
- Gitlab CI编译失败,“准备失败:无法连接到Docker端点”
- 如何正确部署到主机从gitlab-ci(+ docker)?
- 保持构build之后运行gitlab
- GitLab CI – 无法从映像中连接到Docker守护进程
- 为什么我的Arquillian无人机functiontesting不适用于GitLab CI?