LoginSignup
31
30

More than 5 years have passed since last update.

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

Posted at

使用した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に関するノウハウ書いているのでよかったら参考にしてみてください
31
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
30