【问题标题】:How can get my rake task to let Jenkins know that the build has failed?如何让我的 rake 任务让 Jenkins 知道构建失败?
【发布时间】:2012-01-13 18:03:04
【问题描述】:

我们刚刚为我们的应用设置了一个 Jenkins CI 服务器,HiringThing

一切正常,当代码签入我们的 Github 存储库时,构建会自动启动。

问题在于检测构建失败。我有以下 rake 任务正在由 Jenkins 从命令行运行。

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

我已经确认测试运行正常(使用带有 Xvfb 的无头 Firefox)问题是 Jenkins 在浏览器测试中没有检测到任何构建失败。它似乎适用于通常的 Rails 单元、功能和集成测试(我在执行此任务之前在 Jenkins 中运行“rake 测试”。)

据我所知,上面的这个脚本没有将 ruby​​ 任务的失败退出代码传递给 Jenkins,不知道为什么。现在我能想到的唯一解决方法是将所有测试输出重定向到缓冲区并使用 grep 查找失败关键字并在找到时传递失败的退出代码,但这对我来说感觉很糟糕。

我需要进行哪些更改才能让 Jenkins 检测“system 'rvmsudo ruby​​' + r”命令何时返回失败的退出代码?

更新

robertodecurnex 是正确的,系统总是返回成功。但是,rake 命令“sh”允许您捕获准确的代码。所以我改变了这个:

system 'rvmsudo ruby ' +  r

到这里:

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

这似乎是通过使用失败代码退出 Rake 并提醒 Jenkins 构建没有成功来达到目的。

【问题讨论】:

    标签: ruby-on-rails ruby rake jenkins


    【解决方案1】:

    即使system 调用失败,您的任务也会返回正常执行状态。

    为了让 CI 服务器通知您有问题,进程应该返回错误执行代码。

    请注意,例如,如果在任何情况下出现错误,cucumber 和 rspec 都会崩溃。

    您应该检查system 调用返回值并使您的任务返回相同或在同一个ruby 进程中运行测试,而不是作为system 调用另一个ruby 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2020-03-29
      • 2011-07-17
      • 2012-07-20
      相关资源
      最近更新 更多