【问题标题】:Gitlab CI runner configuration with cache on dockerGitlab CI 运行器配置与 docker 上的缓存
【发布时间】:2016-03-23 18:23:28
【问题描述】:

我似乎无法在 gitlab CI 的作业之间获取缓存或工件。我怀疑这与我的配置有关,但我不确定是什么。我正在使用以下 docker-compose 配置在 docker 中运行 gitlab 和 gitlab-ci-multirunner。为简洁起见,我省略了数据库配置和一些环境变量:

version: '2'

services:
  gitlab:
    image: sameersbn/gitlab:8.5.1
    links:
      - redis:redisio
      - postgresql:postgresql
    ports:
      - "10080:80"
      - "10022:22"
    environment:
      ...
    volumes:
      - gitlab_data:/home/git/data

  gitlab-ci-runner:
    restart: always
    image: gitlab/gitlab-runner
    volumes:
      - gitlab_runner_config_data:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/nginx/ssl/gitlab.crt:/etc/gitlab-runner/certs/ca.crt
      - /etc/ssh:/ssh
    links:
      - gitlab:gitlab

  redis:
    ...
  postgresql:
    ...


volumes:
  postgresql_data:
  redis_data:
  gitlab_data:
  gitlab_runner_config_data:

运行器配置(config.toml)为:

concurrent = 1

[[runners]]
  name = "docker"
  url = <public gitlab url>/ci 
  token = <gitlab token>
  tls-ca-file = "/etc/gitlab-runner/certs/ca.crt"
  executor = "docker"
  [runners.docker]
    image = "docker-bash"
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]

所指的docker-bash 图像只是安装了bash 的官方docker:1.10 图像。

我的构建过程包括 3 个步骤:

  1. 运行npm install 和官方node:5 镜像中的测试。目前,为了测试部署,我已经省略了这一步。
  2. 构建包含代码的 docker 镜像
  3. 使用 ansible,通过自定义构建的 ansible docker 镜像将构建的镜像部署到生产服务器。

.gitlab-ci.yml 文件如下所示:

variables:
  FULL_IMAGE_TAG: deploy-$CI_BUILD_REF_NAME:$CI_BUILD_ID-$CI_BUILD_REF
  IMAGE_FILE: deploy-$CI_BUILD_REF_NAME.tar.gz

cache:
  paths:
    - $IMAGE_FILE

build:
  stage: build
  script:
    - docker build -t $FULL_IMAGE_TAG .
    - docker save $FULL_IMAGE_TAG | gzip -cf - > $IMAGE_FILE
  artifacts:
    paths:
      - $IMAGE_FILE

deploy:
  stage: deploy
  image: ansible-ssh
  script:
    - ls
    - ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml
  only:
    - develop
    - master

如您所见,压缩后的 docker 映像在此处的缓存和工件部分都被引用,但实际上在部署步骤中不可用,其中 ansible 应该将其复制到远程计算机。我试过包含一个ls 命令,所以检查文件夹内容,文件显然不存在,但它肯定是构建的,我可以从 gitlab UI 下载它。这是部署作业的日志:

gitlab-ci-multi-runner 1.0.4 (014aa8c)
Using Docker executor with image ansible-ssh ...
Pulling docker image ansible-ssh ...
WARNING: Cannot pull the latest version of image ansible-ssh : Error: image library/ansible-ssh not found
WARNING: Locally found image will be used instead.

Running on runner-59d43cf3-project-8-concurrent-0 via 381c2ea97744...
Fetching changes...
Removing artifacts.zip
Removing deploy-develop.tar.gz
HEAD is now at 6009bd0 test
Checking out 6009bd0f as develop...
HEAD is now at 6009bd0... test

$ ls
Dockerfile
deploy-playbook.yml
server
$ ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml
Using /etc/ansible/ansible.cfg as config file
1 plays in deploy-playbook.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [deploy-host]

TASK [copy docker image] *******************************************************
task path: /builds/test/test/deploy-playbook.yml:44
fatal: [deploy-host]: FAILED! => {"changed": false, "failed": true, "msg": "could not find src=/builds/test/test/deploy-develop.tar.gz"}

NO MORE HOSTS LEFT *************************************************************
    to retry, use: --limit @deploy-playbook.retry

PLAY RECAP *********************************************************************
deploy-host            : ok=1    changed=0    unreachable=0    failed=1   


ERROR: Build failed with: exit code 1

我怀疑我没有正确设置或使用跑步者,但除了非常简单的案例之外,我在文档中找不到太多内容,而且我对该工具的了解不够充分,无法知道它是如何组合在一起的在引擎盖下。

【问题讨论】:

  • 为确保步骤一个接一个地执行,您是否尝试添加阶段:-构建-部署
  • 我做了,但我可以看到它们运行的​​顺序,这很好。
  • 如果将步骤artifacts 添加到deploy 作业会怎样?还是将其移至cache 下方,这样会影响所有工作?另一个问题是,你确定cacheartifacts 都可以指向同一个路径吗?我不知道,我只是想帮助您解决逻辑问题。 ;)
  • 谢谢,不过 gitlab 似乎还不支持这个。这真的很奇怪,因为我看不到任何一个功能的价值,你不能像这样使用它们,但现在我手动将我需要的内容缓存到共享卷中。

标签: docker gitlab gitlab-ci gitlab-ci-runner


【解决方案1】:

缓存并非旨在在构建阶段之间传递文件。

来自doc

cache :定义应在后续之间缓存的文件列表 运行

我认为您需要的实际上正在进行中:WIP: Download build artifacts from previous stages and restore them in context of the build (Technology Preview)

【讨论】:

  • 是的,这就是我想要的,也是我想要做的,但它不起作用。我已经阅读了这两个链接,并且只添加了缓存以查看它是否会有所作为。尽管文档说了什么,但工件并没有在第二个工作中恢复。
  • 好吧,也许语义是有争议的,但那又怎样?有区别吗?
【解决方案2】:

您是否启用了您的工件gitlab.rb

gitlab_rails['artifacts_enabled'] = false

Build Artifacts documentation中所述?

【讨论】:

    【解决方案3】:

    首先,更新 gitlab 和 gitlab runner,尤其是 1.0.4 runner 是安静的实验。

    其次在缓存定义中,你应该添加一个键见https://docs.gitlab.com/ce/ci/yaml/README.html#cache-key

    cache:
      key: "$CI_BUILD_REF_NAME"
      paths:
      - ..
    

    https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runners-section,你应该修改config.toml并添加一个缓存目录

    缓存目录:

    构建缓存将存储在所选执行程序(本地、Docker、SSH)的上下文中的目录。 如果使用 docker 执行器,这个目录需要包含在它的 volumes 参数中。

    【讨论】:

      【解决方案4】:

      缓存有点奇怪,但本质上是:

      缓存下的&lt;dir path&gt; 在构建作业之间可用,而&lt;dir path&gt; 工件将允许您在同一个作业中使用它。

      所以:

      cache:
        untracked: true
        key: "$CI_BUILD_REF_NAME"
        paths:
          - cache-dir/
      
      setup:
        stage: setup
        [snip]
        artifacts:
          paths:
           - cache-dir/ #notice that the path above is the same
      

      这将允许您在每个构建作业之间缓存文件,同时允许您在同一作业内部使用相同的缓存。

      不要忘记在每个构建步骤中将您需要的文件添加到工件中。

      【讨论】:

        猜你喜欢
        • 2019-07-15
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 2022-07-27
        • 2020-02-02
        • 1970-01-01
        • 2020-06-28
        相关资源
        最近更新 更多