使用Docker和Jenkins运行testing – testing结果

我有一个用Rails编写的应用程序。 为了testing它,我构build了一个docker镜像。 一切工作正常。

但是,当我configurationJenkins运行这些testing时出现这个问题。 以下是我在做的步骤:

docker-compose up rspec 

其中rspec是在docker-compose.yml中定义的服务,包含以下命令:

 command: "rspec spec/" 

当rspec返回错误时,构build仍然成功。 这里输出的一个例子:

  ... 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,构build仍然成功。

如果我通过docker ps -a检查容器的id,我会得到“已退出(1)2分钟前”

你们知道发生了什么事吗?

容器出现故障时是否有一种简单的方法可以使构build失败?

Jenkins使用过程的退出状态来判断成功或失败。

docker-compose up被devise来编排许多容器。 当你处理多个服务/容器时,关于什么是成功和失败有一些灰色地带。 所有docker-compose报告退出的是docker-compose命令成功完成,而不是它运行的所有容器都可以。

docker-compose run <service> <command>将运行一个服务的单个命令并返回该命令的退出状态。

如果你依赖多个服务/容器进行testing,那么docker-compose up只会提出所需的服务。 然后运行docker-compose run rubyservice rspec然后运行docker-compose run rubyservice rspec进行testing。

撰写分离

如果要保持应用程序容器的testing不同,请创build第二docker-compose-test.yml文件,其中包含仅用于testing的服务定义。

 version: "2.1" tests: build: context: . dockerfile: Dockerfile.tests cmd: rspec 

在您的主应用程序容器已经提出后,运行

 docker-compose run -f docker-compose-test.yml tests