【TravisCI】【まとめ】高速化のためにした8つの工夫

More than 3 years have passed since last update.


使用したOS


  • Ubuntu 12.04 LTS (Precise Pangolin)

  • デフォルトのOS


TravisCIで試みたこと


  • openCVのインストール


    • バージョンは2.4.5を使用

    • 画像処理をするために必要



  • Rails製アプリの起動


    • $ bundle install

    • $ bundle exec db:migrate

    • $ bundle exec rails start



  • 単体(rspec)/機能テスト(cucumber)/受け入れテスト(Selenium)


高速化のための工夫


第1条 〜aptのキャッシュを利用する〜


.travis.yml

cache:

apt:
true


第2条 〜bundle installを並行実行する〜


  • 以下はジョブ数を4にした例


.travis.yml

bundler_args: --jobs=4 --without production --deployment



第3条 〜bundlerのキャッシュを利用する〜


.travis.yml

cache:

bundler:
true


第4条 〜makeコマンドにはオプションを!!〜


.travis.yml

:before_install

- curl -sL https://github.com/Itseez/opencv/archive/2.4.5.zip > opencv.zip
- unzip -qq opencv.zip
- cd opencv-2.4.5
- mkdir build
- cd build/
- cmake -D BUILD_EXAMPLES=ON -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON -D WITH_1394=OFF -D ENABLE_OPENMP=ON ../
- make -j4 #<= オプション追加
- sudo make -j4 install #<= オプション追加
- sudo ldconfig


第5条 〜ディレクトリをキャッシュする〜


  • openCVのインストールを毎回make/make install等としているとビルドを実行するための前提作業だけでかなり時間がかかってしまいます

  • それを回避するのがまたもやキャッシュw

  • 以下の例はopenCVのインストール後に作った圧縮ファイルをzipディレクトリ内に置いておいてそれをキャッシュする例

  • キャッシュがない場合には、インストールして圧縮ファイルを作成

  • キャッシュがある場合には、取得した圧縮ファイルを解凍するとだけ.travis.ymlに書いておけばOKです

  • 注意点!!


    • ファイル単体をキャッシュすることはできません




.travis.yml

cache:

directories:
opencv-2.4.5/build/zip


第6条 〜かといってなんでもかんでもキャッシュ使うと危険〜


  • キャッシュするサイズが大きすぎると、取得/保存にすごく時間がかかります

  • 大きなファイルは圧縮することをおすすめ

  • 以下を実験してみたら、毎回git cloneすの方が早かった


    • ① .travis.yml内で軽めなリポジトリを毎回git clone

    • ② ①で取得したリポジトリをそれ以降はキャッシュ対象のディレクトリに追加し、毎回git cloneしない



  • 結論として、キャッシュの取得/保存にもそれなりの時間はかかるので、毎回するのは酷なヘビー系の手順だけを対象として圧縮したものをキャッシュするのがよさそう


第7条 〜リソースが余っているなら並行実行を〜


.travis.yml

env:

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


第8条 〜既にあるパッケージは除いておく〜


  • TravisCIにデフォルトで入っているパッケージが結構あった


  • $ dpkg -lでインストール済みパッケージを見てみると元から入っていたものがいくつかあった

  • 入っていないものだけ$ apt-get installを叩くようにする


第0条(だめだった) 〜apt用のミラーサーバー変える〜


  • デフォルトではUSになっているため、日本に変更する


    • が、403 Forbidden




  • ここ参考にしたら出来そうだったので試みたのですが...


.travis.yml

sudo sed -i -e 's/\/\/us.archive.ubuntu.com/\/\/ubuntutym.u-toyama.ac.jp/g' /etc/apt/sources.list



その他(高速化以外で)にやったこと


apt-getで取得したパッケージが古い


.travis.yml

:before_install

- sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ trusty main universe"
- sudo apt-get update -qq


SSHの設定


  • Gemfile内にプライベートリポジトリからgit cloneするようなコードを書いていたりすると、これをしないと取得できなくて怒られます

  • 以下のように書けばSSHの設定が出来ます

  • openssl〜の行のところは @kmats@github さんが書かれたTravisCIでファイルを(簡単に)暗号化して使用するが参考になると思います


    • RAILS_ROOT以下に.travisディレクトリを作って、その下に暗号化した鍵を置いています




.travis.yml

:before_install

- eval `ssh-agent -s`
- chmod 600 ~/.ssh/config
- openssl aes-256-cbc -K $encrypted_12345abcdef_key -iv $encrypted_12345abcdef_iv -in .travis/travis_key.enc -out travis_key -d
- cp travis_key ~/.ssh/
- chmod 600 ~/.ssh/travis_key
- ssh-add ~/.ssh/travis_key


指定したブランチだけビルドを実行させる


  • developブランチとfeatureブランチだけビルドを回す例

  • only以外にもexcept(指定したブランチ以外は回す)もある


.travis.yml

branches:

only:
- develop
- /^feature/


TravisCIに関する技術メモ


~ただの宣伝~


  • 全国のSeleniumer必読

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