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

のように記述します。

つまりaddonsaptの下に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

それでは、今回も最後までお読みいただきありがとうございました。

参考ページ