Travis CIのContainer-based Infrastructureを使ってみる
こんにちはtatsyです。
最近Travis CIの仕様が新しくなりまして、Container-based Infrastructureというものが導入されました。
詳しい内部使用は分からないのですが、これまでのTravis CIはユーザからのリクエストが来た際に、そのリクエストをスタックに積んでおいて、サーバーに空きが出た順に仮想サーバーを割り当てて処理するという手順を取っていたみたいです。
ですが、そうすると、サーバーに空きがない場合にテストが始まるのが遅くなってしまうという問題がありました。
実際、日本時間の昼間は割とすぐにテストが走るのに、夜になるとテストが走るのが遅くなる(おそらくUSのユーザが多いためだと思う)と感じることがありました。
今回導入されたContainer-based Infrastructureは、その名前の通り(?)、今流行りのDockerを使ったコンテナ型仮想化を用いたものです。
こちらも詳しい内部使用は分からないのですが、これによりプロジェクトごとにDockerのコンテナが割り当てるようになり、サーバーの空きを待つ必要がなくなったほか、プロジェクトごとにライブラリ等をキャッシュしておくことが可能になりました。
とはいえ、現在のところセキュリティ上の問題からsudo
コマンドが使えない、Dockerを使ったビルドができないなどの制限はあります。
Travis CIの一つの利点はこのsudo
コマンドが使えることでもあったので、まぁ、今のところは我慢という感じでしょうか?
Container-baseへの切り替え方法
将来的にはContainer-baseでもsudo
が使えるようになりそうな雰囲気?なので後々変わる可能性がありますが、現在のところContainer-baseへ切り替えるには
sudo: false
という一行を付け加えるだけです。これでsudo
は使えなくなりますが、その代わりにContainer-baseに切り替わります。
依存ライブラリのダウンロード
sudo
が使えなくなりましたので例えばPPAなどを追加してライブラリをインストールということができません。
現在のところは、Travis CI側がプリビルドしたライブラリのみを使用可能にしています。例えばg++4.9
などを使いたい場合には、
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- gcc4.9
- g++4.9
のように記述します。
つまりaddons
、apt
の下にsources
で取り込むソースを追加、packages
に入れたいパッケージを追加するという感じになります。
まだまだ数は少ないですが、sources
に使用可能なソースのリストはこちらから確認できます。
https://github.com/travis-ci/apt-source-whitelist
ここにあるubuntu.json
の中に使えるソースが書かれています。
ないもので使いたいのがある場合はissueを投げてね、といっていますが、今のところ対応速度はかなり遅めです。
ライブラリをキャッシュする
Container-baseになってプロジェクトごと(?)にスペースが割り当てられるようになったことで、ライブラリをビルドの度にインストールする必要がなくなりました。
もちろん初回はインストールしないといけませんが、そのあとはインストールを省略できます。
ここでは一例としてcmake3.2.2
をキャッシュしてみます。
まず初めにインストール・スクリプトをcmake_install.sh
という名前で追加します。内容はこんな感じです。
#!/bin/sh
set -e
if [ ! -d "$HOME/cmake/bin" ]; then
wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz -O /tmp/cmake-3.2.2.tar.gz;
tar -xf /tmp/cmake-3.2.2.tar.gz;
cd cmake-3.2.2;
mkdir build;
cd build;
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$HOME/cmake && make -j4 && make install;
cd ../..;
else
echo 'Using cached directory.';
fi
やっていることは、
- CMakeを
wget
でダウンロードしてくる。 - 現在入っている
cmake
でビルドする。 sudo
を使わず、$HOME
下のディレクトリにインストールする。
という感じになります。
上記のスクリプトでは$HOME/cmake
にインストールしていますので、キャッシュすべきはこのディレクトリになります。
キャッシュするためには.travis.yml
に次の行を付け加えます。
cache:
directories:
- $HOME/cmake
これで次の実行からはcmakeのインストールが省略されるようになります(実際には上記のシェルスクリプトでディレクトリがあるかをチェックしているだけです)。
まとめ
今回は簡単に例を交えながらTravis CIのContainer-based Infrastructureについて解説しました。
今回つかったテストプロジェクトは僕のGitHubにまとめてありますので、よろしければご覧ください。
https://github.com/tatsy/travis-container.git
それでは、今回も最後までお読みいただきありがとうございました。