在Docker上使用caching的Gitlab CI runnerconfiguration

我似乎无法得到caching或工件之间的工作之间的gitlab CI。 我怀疑这是与我的configuration有关,但我不知道是什么。 我正在使用以下docker-composeconfiguration在docker中运行gitlab和gitlab-ci-multirunner。 为了简洁,我省略了数据库configuration和一些环境variables:

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: 

运行器configuration( 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图片就是官方的docker:安装了bash的1.10图片。

我的构build过程包含3个步骤:

  1. 在官方节点运行npm install和testing:5镜像。 现在,我已经离开了这一步,以testing部署。
  2. 构build一个包含代码的docker镜像
  3. 使用可靠的,通过自定义的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镜像在caching和工件部分中都被引用,但是在部署步骤中并不是真正可用的,其中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 

我怀疑我没有正确设置或使用跑步者,但是除了非常简单的情况之外,在文档中找不到任何东西,我不知道这个工具是否足够好,无法知道它们是如何组合在一起的。 。

caching不是为了在构build阶段之间传递文件而devise的。

从文档

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

我认为你需要的是实际上正在进行中: WIP:从以前的阶段下载构build工件,并在构build的上下文中恢复它们(技术预览版)

你有没有在你的gitlab.rb启用工件

 gitlab_rails['artifacts_enabled'] = false 

如构build工件文档中所述 ?

首先,更新gitlab和gitlab亚军,特别是1.0.4亚军是安静的实验。

其次,在caching定义中,您应该添加一个键,请参阅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和添加一个caching目录

的cache_dir:

目录在哪里构buildcaching将存储在选定的执行程序(本地,Docker,SSH)的上下文中。 如果使用docker执行程序,则需要将此目录包含在其卷参数中。

caching有点奇怪,但本质上:

在caching之下的<dir path>在构build作业之间可用,而<dir path>构件将允许您在同一作业中使用它。

所以:

 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 

这将允许您在每个构build作业之间caching文件,同时允许您在同一个作业中使用相同的caching。

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