Дженкинс преуспевает, когда unit test терпит неудачу (Rails)

Я едва начал использовать Дженкинса, и это первая проблема, которая у меня была до сих пор. В основном моя работа jenkins всегда преуспевает, даже когда в некоторых тестах произошла ошибка. Это то, что я запускаю в конфигурации оболочки:

bundle install 
rake db:migrate:reset
rake test:units
rake spec:models

Дело в том, что Дженкинс только сообщает об ошибке, когда неудавшаяся задача является последней. Например, если я поставил "rake test: units" на последнюю задачу, она сообщит об ошибке, если что-то пойдет не так. Используя эту конфигурацию, я получаю отчеты об ошибках для тестов rspec, но не для модульных тестов.

Любое интересно, почему я не только использую rspec или unit test, мы в настоящее время переходим к rspec, но эта проблема по-прежнему болезненна.

Это часть журнала от Jenkinsm, так как вы видите, что один из unit test не работает, но jenkins все еще заканчивается с успехом.

314 tests, 1781 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [/var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p1...]

Tasks: TOP => test:units
(See full trace by running task with --trace)
Lot of rspec tests here....
Finished in 3.84 seconds
88 examples, 0 failures, 42 pending
Pushing HEAD to branch master of origin repository
Pushing HEAD to branch master at repo origin
Finished: SUCCESS

Ответ 1

Jenkins выполняет команды, которые вы вводите, в поле Build Step, записывая их во временный файл, а затем запуская script с помощью /bin/sh -xe.

Обычно это дает желаемый эффект: Команды выполняются в последовательности (и распечатываются), а script прерывается сразу же после сбоя команды, то есть выходит с ненулевым кодом выхода.

Если это не происходит с вами, единственной причиной может быть то, что вы переопределили это поведение. Вы можете переопределить его, запустив первую строку вашего этапа сборки с этими двумя символами: #!.

Например, если ваш шаг сборки выглядит следующим образом:

#!/bin/bash
bundle install
rake db:migrate:reset
rake test:units
rake spec:models

Тогда это означает, что Дженкинс напишет script во временный файл, и он будет выполнен с помощью /bin/bash. При вызове такого типа bash будет выполнять команды один за другим и не заботится о том, удастся ли им преуспеть. Код завершения процесса bash будет кодом выхода последней команды в script, и это будет видно Дженкинсу, когда заканчивается script.

Итак, позаботьтесь о том, что вы положили в первую строку этапа сборки. Если вы не знаете, как работает оболочка, не помещайте хэш-бэнг вообще, и пусть Дженкинс решит, как должен работать script.

Если вам требуется больше контроля над тем, как выполняется шаг сборки, вы должны изучить справочную страницу оболочки, которую вы используете, чтобы узнать, как заставить ее вести себя так, как вы хотите. Дженкинс не имеет здесь большой роли. Он просто выполняет оболочку, которую вы хотели, как хотите.

Ответ 2

Дженкинс может видеть только код результата последнего запуска команды, поэтому он не знает, что такое результат rake test:units.

Простейшая вещь, вероятно, состоит в том, чтобы каждая команда этих команд была отдельным шагом сборки jenkins.