いけむランド

はてダからやってきました

AppVeyor で cygwin での chkbuild 環境をつくってみた

最近は cygwin 環境で新しい Ruby を動かす遊びをしてるのですが、どうにも CI 環境がないみたいので、AppVeyor につくってみることにしました。

And there is no CI for cygwin. Contribution is welcome.
Bug #15465: Tests failed on i386-cygwin - Ruby trunk - Ruby Issue Tracking System

(ちなみに RubyCI の存在はこの issue で初めて知りました。)

rubyci.org

RubyCI では chkbuild というスクリプトで svn checkout から make test-all までをやっていて、それのログを revision 毎に保存しておけるようです。

github.com

これを fork して、AppVeyor 上で動くようにいじってみました。

いじった箇所をまとめると以下になります。

Comparing master...feature/appveyor-cygwin · fd00/ruby-chkbuild · GitHub

  • appveyor.yml
    • 32 bit 環境と 64 bit 環境でそれぞれ動かしてみる。
    • setup はデフォルトだと GUI が立ち上がってしまうのでオプションで CLI で済ませるようにする。
    • appveyor.sh を動かす。
  • appveyor.sh
    • start-build でバッチを起動するが、これは標準出力には何も出さないので、一旦 background で動かし、AppVeyor のコンソールにはログファイルを tail -f で流すようにする。
    • tail -f は終わってくれないので timeout を設定しておく。AppVeyor のビルドは 60m までしか動かせないようなので、Job 2 つのためにその半分くらいの時間で終わるようにしておく。
  • sample/build-ruby
    • フェーズごとの時間を延ばしておく。試した時だとビルドの途中でタイムアウトになってしまう場合があったため。
    • (今は) テストはしない。これはスレッドやネットワークまわりのテストでハングしてしまうものがいくつか見られたため。
  • chkbuild/ruby.rb
    • (今はテストは動かさないけど) テスト実行前に rebase をする。これは cygwin だとよくある address space is already occupied を回避するため。

実際に動いている AppVeyor プロジェクト↓

ci.appveyor.com

構築した後に気づいたのですが、これって ruby/ruby を fork してみればよかったのでは...。

あと、これは ruby ソース側の修正がトリガーではないので cron で適当に叩く必要がありますね。