因此,我们使用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
的任何技巧。我研究了所有解决方案,都在使用某种包装器脚本在哪里查看了内部docker网络上的某些端口,以等待诸如db的服务完全打开并准备就绪。
当使用k8s时,我可以设置一个超级掺杂的就绪探针,但是它似乎并不是Docker Compose的功能。我在这里错了吗?仅编写docker用于确定done
含义的命令会很好。
目前,我们必须手动运行每个步骤,然后在完成上一步后运行下一个步骤,如下所示:
docker-compose up install
等待...。
docker-compose up test
我们真的只想说:
docker-compose up
,并通过等待前面的步骤来按正确的顺序完成所有步骤。