所以我们使用Gitlab CI。问题是每次我们想要测试我们的构建管道是否配置正确时都必须提交的痛苦。不幸的是,当我们的容器/管道工作不正常时,没有办法轻松地在本地测试Gitlab CI。
我们的解决方案,使用docker-compose.yml
作为CI管道运行器,用于容器化构建步骤的本地测试,为什么你不知道...基本上Gitlab CI,和大多数其他的,让每个部分产生一个容器来运行命令,并且直到前面的步骤完成才继续,也就是说,第一步必须完全完成,然后下一步才发生。
下面是我们使用的一个简单的.gitlab-ci.yml
文件:
stages:
- install
- test
cache:
untracked: true
key: "$CI_COMMIT_REF_SLUG"
paths:
- node_modules/
install:
image: node:10.15.3
stage: install
script: npm install
test:
image: node:10.15.3
stage: test
script:
- npm run test
dependencies:
- install
下面是我们将其转换为的docker-compose.yml
文件:
version: "3.7"
services:
install:
image: node:10.15.3
working_dir: /home/node
user: node
entrypoint: npm
command:
- install
volumes:
- .:/home/node:Z
test:
image: node:10.15.3
working_dir: /home/node
user: node
entrypoint: npm
command:
- run
- test
volumes:
- .:/home/node:Z
depends_on:
- install
好了,现在来看看真正的问题。合成文件的depends_on
部分不等待install
容器完成,它只等待npm命令运行。因此,一旦npm命令正式加载并运行,test
容器将开始运行并报告还没有node_modules
。这是因为npm正在运行并不意味着npm命令实际上已经完成。
任何人都知道一些技巧来更好地控制docker认为是done
的东西,我研究的所有解决方案都是使用某种 Package 器脚本来监视内部docker网络上的一些端口,以等待一个服务,比如一个db,完全打开并准备好。
当使用k8s时,我可以设置一个准备探测器,这是超级涂料,似乎不是Docker组合的一个功能,虽然。我错了吗?如果只是写一个命令,Docker使用它来确定done
的意思会很好。
现在,我们必须手动运行每一步,然后在上一步完成后运行下一步,如下所示:
docker-compose up install
等等......
docker-compose up test
我们只想说:
docker-compose up
并且通过等待前面的步骤以正确的顺序完成所有步骤。
1条答案
按热度按时间k4aesqcs1#
我经历了同样的问题,这是一个权限相关的事情,当你从你的本地机器Map到docker。
在容器中创建一个文件,并检查同一文件在本地计算机中的权限,如果您看到root用户或任何其他用户是所有者,而不是您的当前用户,则必须首先运行
且改变了
作者
PS:我假设你可以运行docker而不必使用sudo,只是提到这个bc这是我的场景。