Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2013-08-14

なぜかときどき落ちるテストをリカバリーする undead

| 19:26 | なぜかときどき落ちるテストをリカバリーする undead - NaN days を含むブックマーク はてなブックマーク - なぜかときどき落ちるテストをリカバリーする undead - NaN days

動的にポートを確保しているとか PhantomJS を使っているテストが、手元では大丈夫なのに Jenkinsなぜか(!)ときどき(!)落ちるという現象に際し、毎回ログを見て「ああこのエラーなら問題ないからやり直そう……」というのも馬鹿らしいので、標準(エラー)出力を監視しつつ Perl を実行し、特定の出力を吐いて異常終了していたらもう一度やり直すラッパーを書きました。

https://github.com/motemen/undead

使い方

.undeadrc.pl に以下のような内容を記述して、

{
    pattern => {
        stderr => [
            qr/^PhantomJS has crashed\./,
        ]
    },
    count => 20,
};

起動します。

% undead perl -le 'die "PhantomJS has crashed." if rand() < 0.9; print "alive!"'

指定された出力に引っかかって死んだ時に、指定した回数までコマンドの実行をやり直してくれます。

# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (19 remains)
# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (18 remains)
# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (17 remains)
# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (16 remains)
# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (15 remains)
# [undead] err - PhantomJS has crashed. at -e line 1.
# [undead] Retry 'perl -le die "PhantomJS has crashed." if rand() < 0.9; print "alive!"' (14 remains)
alive!

undeadperl

"undead command args" として起動する以外に、実行スクリプトの名前を "uneadprog" (例えば undeadperl)に変えれば、prog を起動するようになります。

% undeadperl -le '…'

prove で使うときは HARNESS_PERL を指定すると便利です。

% HARNESS_PERL=./script/undeadperl prove …

これで(だいぶ雑に)CI を安定化させられますね!