我有一个用Rails编写的应用程序。为了对其进行测试,我构建了一个docker映像。一切正常。
但是,当我配置Jenkins运行这些测试时,就会出现问题。在构建步骤中,我要做的是:
docker-compose up rspec
其中rspec是在docker-compose.yml上定义的服务,其中包含以下命令:
command: "rspec spec/"
当rspec返回错误时,构建仍然成功。这里是输出示例:
... 21:42:24 [36mrspec_1 |[0m should save second profile 21:42:24 [36mrspec_1 |[0m 21:42:24 [36mrspec_1 |[0m Failures: 21:42:24 [36mrspec_1 |[0m 21:42:24 [36mrspec_1 |[0m 1) New profile Should persist new_profile_pricture 21:42:24 [36mrspec_1 |[0m Failure/Error: jump_to_four_phase_with(new_profile_picture) 21:42:24 [36mrspec_1 |[0m RuntimeError: 21:42:24 [36mrspec_1 |[0m Timeout for '#new_profile' (1) appearance reached! ... 21:42:25 [36mcomposes_rspec_1 exited with code 1 21:42:25 [0m[Profiler] $ /bin/sh -xe /tmp/hudson4606189750126491465.sh 21:42:25 Finished: SUCCESS
36mcomposes_rspec_1 返回1,构建仍然成功。
36mcomposes_rspec_1
如果我通过docker通过其ID检查容器,则会ps -a收到“ 2分钟前退出(1)”
ps -a
你们知道发生了什么吗?
有什么简单的方法可以在容器发生故障时使构建失败?
Jenkins使用流程的退出状态来判断成功或失败。
docker-compose up设计用于协调许多容器。当您处理多个服务/容器时,关于什么构成成功和失败,会有一些灰色区域。docker- compose退出时报告的所有内容是docker-compose命令已成功完成,而不是它运行的所有容器都可以。
docker-compose up
docker- compose
docker-compose
docker-compose run <service> <command> 将为服务运行单个命令并返回该命令的退出状态。
docker-compose run <service> <command>
如果您依赖多个服务/容器进行测试,则docker-compose up只需调出所需的服务即可。然后再运行docker-compose run rubyservice rspec以进行测试。
docker-compose run rubyservice rspec
如果要将测试与应用程序容器分开,请创建另一个docker-compose-test.yml文件,其中包含仅用于测试的服务定义。
docker-compose-test.yml
version: "2.1" tests: build: context: . dockerfile: Dockerfile.tests cmd: rspec
调出主要应用程序容器后,运行
docker-compose -f docker-compose-test.yml run tests