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

# 使用した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)

# 高速化のための工夫

## 第１条　〜aptのキャッシュを利用する〜
* 詳細は[【TravisCI高速化】aptのキャッシュを利用する](http://qiita.com/oh_rusty_nail/items/ffffeef8fb92b458a2b6)

```rb:.travis.yml
cache:
  apt: true
```

## 第２条　〜bundle installを並行実行する〜
* 以下はジョブ数を４にした例

```rb:.travis.yml
bundler_args: --jobs=4 --without production --deployment
```

## 第３条　〜bundlerのキャッシュを利用する〜
* 詳細は[【TravisCI高速化】bundle installを毎回走らせないようにキャッシュする](http://qiita.com/oh_rusty_nail/items/374c30ecc5aa9997d1f3)

```rb:.travis.yml
cache:
  bundler: true
```

## 第４条　〜makeコマンドにはオプションを！！〜
* 詳細は[【TravisCI高速化】make時にオプションを付けたら超絶高速になった](http://qiita.com/oh_rusty_nail/items/6a97bf6587508d4b4be8)
* openCVのインストールの例ですが、並行ジョブ数に4を指定しています

```rb:.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
```

## 第５条　〜ディレクトリをキャッシュする〜
* openCVのインストールを毎回make/make install等としているとビルドを実行するための前提作業だけでかなり時間がかかってしまいます
* それを回避するのがまたもやキャッシュw
* 以下の例はopenCVのインストール後に作った圧縮ファイルをzipディレクトリ内に置いておいてそれをキャッシュする例
* キャッシュがない場合には、インストールして圧縮ファイルを作成
* キャッシュがある場合には、取得した圧縮ファイルを解凍するとだけ.travis.ymlに書いておけばOKです
* 注意点！！
 * ファイル単体をキャッシュすることはできません

```rb:.travis.yml
cache:
  directories: opencv-2.4.5/build/zip
```

## 第６条　〜かといってなんでもかんでもキャッシュ使うと危険〜
* キャッシュするサイズが大きすぎると、取得/保存にすごく時間がかかります
* 大きなファイルは圧縮することをおすすめ
* 以下を実験してみたら、毎回git cloneすの方が早かった
 * ① .travis.yml内で軽めなリポジトリを毎回git clone
 * ② ①で取得したリポジトリをそれ以降はキャッシュ対象のディレクトリに追加し、毎回git cloneしない
* 結論として、キャッシュの取得/保存にもそれなりの時間はかかるので、**毎回するのは酷なヘビー系の手順だけ**を対象として**圧縮したもの**をキャッシュするのがよさそう

## 第７条　〜リソースが余っているなら並行実行を〜
* 詳細は[【TravisCI高速化】並列実行で実行時間を短縮する](http://qiita.com/oh_rusty_nail/items/d345e9612a9dc12d0382)
* 実行するビルド内容によっては、直列で実行していたものを並列にしただけで実行時間が半分になる！ケースも

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

## 第８条　〜既にあるパッケージは除いておく〜
* TravisCIにデフォルトで入っているパッケージが結構あった
* ```$ dpkg -l```でインストール済みパッケージを見てみると元から入っていたものがいくつかあった
* 入っていないものだけ```$ apt-get install```を叩くようにする


## 第０条(だめだった)　〜apt用のミラーサーバー変える〜 
* デフォルトではUSになっているため、日本に変更する
 * が、403 Forbidden
* [ここ](http://pc.casey.jp/archives/153900744)参考にしたら出来そうだったので試みたのですが...

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


# その他(高速化以外で)にやったこと
## apt-getで取得したパッケージが古い
* 詳細は[TravisCIでubuntu14.04向けのパッケージをインストールする方法](http://qiita.com/oh_rusty_nail/items/66020bd1ba42860d9351)
* バージョン指定しても見つかりませんと言われる
* Ubuntu 14.04 LTS (Trusty Tahr)ではとれたのに、なんでかなと思っていたら、apt-get-repositoryを更新したら解決した

```rb:.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でファイルを(簡単に)暗号化して使用する](http://qiita.com/kmats@github/items/d22fd856883e6c16d7ea)が参考になると思います
 * RAILS_ROOT以下に.travisディレクトリを作って、その下に暗号化した鍵を置いています

```rb:.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(指定したブランチ以外は回す)もある

```rb:.travis.yml
branches:
  only: 
    - develop
    - /^feature/
```

# TravisCIに関する技術メモ
* [Travisコマンドのまとめ](http://qiita.com/oh_rusty_nail/items/7b024e9e0108c20fb819)
* [【TravisCI】travis.ymlに書くあれこれ](http://qiita.com/oh_rusty_nail/items/157241b6cb5a304462fe)
* [TravisCIのコンソール出力上限は10000行まで](http://qiita.com/oh_rusty_nail/items/052efbe68fd2f45899e3)
* [TravisCIは10分間何もコンソール出力がなければビルド失敗と扱われる](http://qiita.com/oh_rusty_nail/items/220dd656c53e2199357b)


# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください