在我团队的 CI/CD 管道中,我们有以下制作秘诀:
test-some-service:
echo "Running some tests...." && \
docker-compose up service-target-test && \
status=$$?; \
# ...
exit $$status
尽管收集了 docker-compose 退出状态,但当失败时,CI 管道仍然通过,但出现误报。
服务目标测试1 |失败(错误=1)
服务目标测试1 | make: *** [Makefile:2: 测试] 错误 1 退出并显示代码 2
...
...
成功了!
这导致开发人员在不知道变更集未通过我们的质量检查的情况下推送破坏代码。我们已多次尝试重构此配方,但仍然遇到相同的问题。我们在这里做错了什么?
docker compose run
代替docker compose up
:
test-clearcast-orm:
set -e && \
echo "Running some tests...." && \
# ...
docker-compose run --rm service-target-test
run 命令的作用类似于 docker run -ti,它打开容器的交互式终端,并返回与容器中进程的退出状态匹配的退出状态。
docker compose run
命令更适合运行“一次性”或“临时”任务。
参见: