2

最近、mi CI サーバー (Teamcity) を、同じ構成でかなり似た OS を持つ別の強力なマシンに移動しました。

それ以来、私の統合仕様のいくつかが失敗し始めました。私のセットアップはかなり標準的で、Rails 3 + カピバラ + ポルターガイスト + ファントム js です。

失敗は決定論的であり、常に発生し、DOM で欠落しているノードに常に関連しています。また、同様の設定の異なるプロジェクト間で失敗が発生するため、プロジェクトの構成に関連するものではありません。これは、カピバラ 1.x とカピバラ 2 の両方で発生しています。

これは最も単純な失敗仕様です。この仕様は JavaScript を必要とせずに実行されるため、この問題はラックのみの仕様にも存在することに注意してください。

scenario 'require an unsubscription' do
  visit unsubscribe_index_path
  within main_content do
    choose list.description
    fill_in 'Email', :with => subscriber.email
    click_button 'Unsubscribe'
  end
  save_page # <--- Added to debug output
  # !!! HERE is the first failing assertion
  page.should have_content('You should have received a confirmation message')
  # Analytics event recorded
  # !!! this also is failing
  page.should have_event('Unsubscription', 'Sent', list_name)
  # If I comment previous two lines the spec passes on CI machine
  # this means that the form is submitted with success since email is triggered
  # from controller code
  last_email_sent.should have_subject 'Unsubscribe request received'
  last_email_sent.should deliver_to subscriber.email
end

私が試したこと:

  • 異なるマシンで仕様を実行すると、すべての開発マシンとステージング サーバーで動作します。CI環境外でもCIマシンでしか障害を再現できません(つまり、コマンドラインからスペックを実行することによって)
  • Capybara.default_wait_timeばかげたことに増加20
  • page.should have_content列の前に残忍な睡眠を試みた
  • RVM、ruby、capybara、poltergeist を CI マシンの最新バージョンにアップグレードします。
  • teamcity を最新バージョンにアップグレードする

私が見つけた最も奇妙なことはsave_page、失敗した行の直前に呼び出しを追加したときです。自分のマシンで仕様を実行し、次にサーバーが失敗している CI でこれら 2 つのファイルを比較すると、結果は次のようになります。

$ diff capybara-201309071*.html
26a27,29
> <script type='text/javascript'>
> _gaq.push(["_trackEvent","Unsubscription","Sent","listname"]);
> </script>
90a94,96
>             <div class="alert-message message notice">
>               <p>You should have received a confirmation message</p>
>             </div>

どちらが仕様を失敗させる 2 つの欠落部分であり、フォームが送信され、コントローラー アクションが正常に実行されますが、dom の欠落部分が 2 つあります。それはどのように可能ですか?そして、なぜこれが1台のマシンでのみ起こっているのですか?

記録のために、これら 2 つの DOM は、標準の Rails ツールで追加されます。

redirect_to unsubscribe_index_path, notice: ...

もう1つは分析宝石を使用

4

1 に答える 1

0

dalli_store をセッション ストアとして使用している 2 つの失敗したプロジェクトの問題が見つかりconfig.cache_store = :dalli_storeましconfig/application.rbconfig/environments/production.rb

古い CI サーバーでは memcached デーモンが実行されていたため、すべての仕様が正常に動作していました。

新しいサーバーは単なる CI サーバーであり、運用コードやステージング コードを実行しないため、memcached は存在しないため、セッション書き込み (フラッシュ メッセージなど) は黙って破棄されました。失敗。

適切な環境ファイルに行を入れることで解決しましたconfig.cacheが、memcached が利用できない場合に dalli gem が警告を出さないのはなぜなのか疑問に思っています。アプリケーションはキャッシュされたデータなしで動作するはずなので、欠落しているキャッシュ デーモンで失敗しないという選択は合理的ですが、実稼働コードではパフォーマンス キラーになる可能性があり、警告が表示されない場合は気付かれない可能性があります。

于 2013-09-09T11:30:16.667 に答える