首页 文章

Gitlab docker executor - 在before_script之后缓存图像

提问于
浏览
8

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 ,我认为它会缓存所有没有任何效果的东西 .

有没有办法得到我想要的行为?

2 回答

  • 7

    您可以添加一个阶段来首先构建图像 . 如果图像没有任何变化,则舞台将非常短,不到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镜像 . 所以,跑步者居住的主机应该安装了Docker Engine . 我发现这个解决方案比docker中的docker和another solutions更适合我的需求 .

    另外,我'm using a private registry, that'为什么我使用 $CI_REGISTRY* 变量,但您可以使用DockerHub而无需指定注册表 . 但问题是在DockerHub上进行身份验证 .

  • 2

    我处理这个的方式是我在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
    

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

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

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

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

    我个人认为这比尝试在跑步者的图像中缓存任何内容要好得多 . 当您创建新分支以在较新版本的依赖项上测试代码时尤其如此 . 如果您有缓存,那么您的稳定和开发分支将面临具有不同测试环境的问题 . 在我看来,测试应该在尽可能干净的环境中运行,这种设置可以实现 .

相关问题