Как можно получить мое задание по рейку, чтобы Дженкинс знал, что сборка не удалась? - PullRequest
4 голосов
/ 13 января 2012

Мы только что настроили сервер Jenkins CI для нашего приложения, HiringThing

Все работает хорошо, сборки запускаются автоматически при проверке кода в нашем репозитории Github.

Проблема заключается в обнаружении сбоев сборки. У меня есть следующая задача rake, запускаемая из командной строки Дженкинсом.

rake test:browser

выполняет следующее

desc "Run browser tests."
task :browser => :environment do
    start = Time.now()
    puts "Stopping apache if running"
    system 'sudo apache2ctl stop'
    puts "Running selenium tests"
    Dir.glob('./test/browser/*.rb').each { |r|
        puts r
        system 'rvmsudo ruby ' +  r
    }
    system 'echo -e "\a"'
    puts "All browser tests, elapsed: " + (Time.now() - start).to_s + " seconds"
end

Я подтвердил, что тесты работают правильно (с использованием Firefox без головы с Xvfb). Проблема в том, что Jenkins не обнаруживает никаких ошибок сборки в тестах браузера. Похоже, что он работает с обычными модульными, функциональными и интеграционными тестами Rails (перед этой задачей я запускаю "rake test" в Jenkins.)

Насколько я могу судить, этот скрипт выше не передает код неудачного завершения задач ruby ​​Дженкинсу, не знаю почему. Прямо сейчас единственный обходной путь, который я могу придумать, - это перенаправить весь тестовый вывод в буфер и использовать grep для поиска ключевых слов сбоя и передачи кода сбоя, если он найден, но мне это кажется хакерским.

Что мне нужно изменить, чтобы Дженкинс обнаружил, когда команды "system 'rvmsudo ruby' + r" возвращают ошибочный код выхода?

UPDATE

robertodecurnex правильно, система всегда возвращает успех. Однако команда rake 'sh' позволяет вам записывать точные коды. Поэтому я изменил это:

system 'rvmsudo ruby ' +  r

на это:

 sh 'rvmsudo ruby ' +  r do |ok, res|
     raise "Failed test." if !ok
 end

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

1 Ответ

5 голосов
/ 13 января 2012

Даже если вызов system не удался, ваша задача возвращает нормальный статус выполнения.

Чтобы вы получили уведомление от CI-сервера о том, что что-то не так, процесс должен возвращать код выполнения ошибки.

Обратите внимание, что, например, cucumber и rspec сгорят, если в каком-либо из случаев возникнет ошибка.

Вам следует либо проверить возвращаемое значение вызова system, и вернуть свою задачуто же самое или запустите тесты внутри того же процесса ruby, а не как system вызов другого сценария ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...