3

レガシ テスト/ユニット (ミニテスト) テストと RSpec の両方を含む Rails 3.2.8 プロジェクトがあります。Jenkins で継続的インテグレーションを実行していますが、しばらくの間、障害に気づいていません。その理由は、何かがテストの失敗時に終了コードをオーバーライドし、失敗したテストまたは仕様があるかどうかに関係なく、終了コード 0 を返しているように見えるためです。

私はいくつか掘り下げましたが、Kernel#at_exit スタックを掘り下げて、どの gem/plugins が proc を登録しているかを確認したいと思います。Cで実装された言語機能であることは知っています。

だから、私はこのヤクを剃る助けを探しています:

  • 失敗したテストで終了コード 0 が返されるのはなぜですか?
  • 何かが proc/callback を at_exit に追加していると仮定すると、コールバックが何であるかを確認するにはどうすればよいですか?
    • 私はそれが C で書かれていることを知っており、ソースを見てきました。ルビーフックは見当たりません。追加できるサードパーティの拡張機能はありますか、またはそこにある程度の可視性を与える Ruby へのパッチを知っている人はいますか?
    • dtrace はそこに入って見るために機能しますか?

私がやったことのいくつか:

  • gem とインストールされているライブラリを grep しましたat_exitが、あまり疑わしいものは見つかりませんでした。
  • Rails アプリで同じ gemset を使用して、単一の仕様で新しいアプリを作成して実行すると、期待どおりに動作します (テストに合格すると終了コード 0 が返され、失敗すると 1 が返されます)。
  • ルビーへの可視性を提供するのに役立つパッチ/拡張機能を見つけようとしましたat_exit

私がまだ行っていないいくつかのこと:

  • DTrace を学習しようとしました (私は Mac を使用しています) - 使用方法を示すプレゼンテーションを見たことがありますが、まだ試していません。
  • プロジェクトからすべての宝石を削除して、何が原因であるかを確認してください。プロジェクト固有のようです。

事前にご協力いただきありがとうございます。

PS: このプロジェクトの Gemfile の gem は次のとおりです。

gem 'rails', '~> 3.2.8'
gem 'acts-as-taggable-on', '~> 2.3.1'
gem "akamai_api", :path => "vendor/git/akamai_api"
gem 'dalli'
gem "gabba"
gem "googlecharts", :require => "gchart"
gem "hpricot"
gem 'jquery-rails'
gem 'linkscape'
gem "logging", "1.4.3"
gem 'machinist', '>= 2.0.0.beta2'
gem "mysql2"
gem 'newrelic_rpm'
gem "premailer-rails3"
gem 'rack-cache'
gem "rack-ssl-enforcer"
gem 'sendgrid'
gem "tokyocabinet", "1.29"
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git'
gem "useragent"
gem "yajl-ruby", :require => "yajl"

group :assets do
  gem 'coffee-rails'
  gem 'sass-rails'
  gem 'uglifier'
end

group :no_rake do
  gem "vanity"
end

group :development, :test do
  gem 'debugger'
  gem 'thin'
  gem 'rspec-rails'
end

group :test do
  gem 'vanity'
  gem 'minitest-rails'
  gem 'mocha'
end

更新として、テストが適切に失敗するまで、Gemfile でバイナリ ツリー検索を実行しました (半分をオフにして、テストを実行し、残りの半分をオフにして.. を繰り返します)。logging gem が原因で rspec がゼロ以外を返し、googlecharts gem が test/unit を台無しにしていました。現時点では、理由はわかりません。

ライブラリ (またはアプリ内の依存コード) のどの動作がテストに影響を与えているかを確認するために、これ以上掘り下げていません。Kernel#at_exit を使用して簡単な grep を実行しても何も返されず、それぞれのソースをざっと見ても何も表示されませんでした。私は掘り続けますが、それは私がこれまでに見つけたものです.

何が問題なのかまだわからないので、バグレポートは提出していません。

4

1 に答える 1

2

あなたはルビーを愛さなければなりません:)

alias original_at_exit at_exit
def at_exit(*args, &block)
  puts "registered at exit: #{caller * "\n"}"
  original_at_exit *args, &block
end
于 2012-10-30T12:58:29.550 に答える