Eri*_*rik 9 gitlab docker gitlab-ci gitlab-ci-runner
在文件中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
Run Code Online (Sandbox Code Playgroud)
一个可能的解决方案是转到跑步机并创建一个docker镜像,可以构建我的软件而无需任何其他安装,然后image在yaml文件的部分中引用它.这样做的缺点是,无论何时我想添加依赖项,我都需要登录到转轮计算机并在构建成功之前更新映像.如果我只是必须将依赖项添加到结尾apt-get install并且让docker/gitlab-ci处理适当的缓存,那将会更好.
还有一个cache命令.gitlab-ci.yml,我尝试设置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/
Run Code Online (Sandbox Code Playgroud)
看看标签docker_build.该标签用于强制在具有该标签的跑步者上执行舞台.该跑步者的执行者是shell,它仅用于构建Docker镜像.所以,跑步者居住的主机应该安装了Docker Engine.我发现这个解决方案比Docker中的docker和其他解决方案更适合我的需求.
此外,我正在使用私有注册表,这就是我使用$CI_REGISTRY*变量的原因,但您可以使用DockerHub而无需指定注册表.但问题是在DockerHub上进行身份验证.
我处理这个问题的方法是,我在 Docker Hub 上为每个项目都有自定义映像,并从.gitlab-ci.yml. 如果我需要新的依赖项,我会编辑用于创建初始映像的 Dockerfile,重新构建映像,并使用特定标签对其进行标记,然后推送到 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
Run Code Online (Sandbox Code Playgroud)
然后我更新.gitlab-ci.yml文件以指向该图像的特定版本。
image: ACCOUNT/gitlab_ci_image:gcc
build:
script:
- cd project && make
Run Code Online (Sandbox Code Playgroud)
这允许我根据我尝试测试的提交拥有不同的依赖项(因为gitlab-ci.yml该提交中的文件告诉运行程序要使用哪个)。它还避免了每次在特定运行器上运行测试时都需要安装依赖项,因为运行器将重复使用相同的图像,只要它不发生更改。
另一件好事是,使用 Docker Hub 上托管的镜像,如果运行程序需要本地没有的特定标签,它将自动获取正确的标签,这样你就可以拥有 10 个运行程序而只维护一个镜像并且这种维护可以在您自己的工作站或任何机器上完成。
我个人认为,这是一个比尝试在跑步者图像中缓存任何内容更好的解决方案。当您创建新分支以在较新版本的依赖项上测试代码时尤其如此。如果您有缓存,那么您的稳定分支和开发分支会遇到不同的测试环境的问题。另外,在我看来,测试应该在尽可能干净的环境中运行,而这个设置可以实现这一点。
| 归档时间: |
|
| 查看次数: |
3104 次 |
| 最近记录: |