【TravisCI高速化】並列実行で実行時間を短縮する

More than 3 years have passed since last update.


はじめに


効果


  • 並列で回す分だけ早くなる


    • 例えば、単体テスト群と受け入れテスト群を分けて並列にするなど




やること


書き方


  • .travis.ymlにmatrixの記述を追加するだけ



  • .travis.ymlの例を載せます。というかこれが全てです


.travis.yml

...

env:
matrix:
- TEST_TARGET=spec
- TEST_TARGET=cucumber
script:
- "bundle exec rake $TEST_TARGET"
...


実行結果



  • このように書くと、以下のように並列でビルドが走る


    • 以下の例だと73.1と73.2



  • travis.png


  • ビルド一覧からみると2つのビルドの合計時間が書かれているが実際にかかった時間はビルド時間が長い方


  • ビルド一覧に出る時間

    travis2.png



分割したビルドでそれぞれ別の処理(before_scriptなど)をさせたい場合


  • .travis.ymlに書いている処理がビルドを分割することで片方では必要だがもう一方では必要ないということもあるでしょう

  • そんなときは以下のようにscriptを外に出しちゃえばいいのです


    • 後はコマンド叩く部分をmethod化するのもよし




.travis.yml

...

script:
- 'ruby .travis/travis.rb'
...


.travis/travis.rb

...

commands = [
'sudo cp -p /etc/localtime /etc/localtime.bak',
'sudo rm /etc/localtime',
'sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime'
]
if ENV['TEST_TARGET'].include?('cucumber')
commnads.each do |command|
system("#{command} > /dev/null 2>&1")
end
end
...


  • $TEST_TARGETがcucumberのときのみタイムゾーンを変更する例


~ただの宣伝~


  • 全国のSeleniumer必読

  • Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください