Travis CI のOS 仮想環境を手元のDocker で実行する

# travis-ci コンテナをlocal のDocker コンテナとして起動する 
travis-ci でテストを実施する場合、travis-ci のOS コマンドを発行したりファイルにデータを直に書き込むようなテストケースがあった場合、事前にtravis-ci の仮想環境にログインして用意されているコマンドやディレクトリ構成を調べたいと思ったことはないでしょうか？
Travis CI ではそういった時にTravis CI のテスト環境と同等な環境をDocker コンテナとして実行する方法が用意されています。

ここではtravis-ci 環境のdocker コンテナを手元で起動してnodejs のテストを実行するまでの手順をご紹介します。

# Docker イメージを選択する 
travis-ci ではDocker Hub にtravis-ci のコンテナをプログラミング言語毎に公開しています。
公開されているDocker イメージは以下のものがあります。

* travis-ci 公開イメージ一覧
<table><tbody>
  <tr>
    <th> プログラミング言語</th>
    <th> Docker Hub イメージ</th>
  </tr>
  <tr>
    <td> android</td>
    <td> travisci/ci-amethyst:packer-1512508255-986baf0</td>
  </tr>
  <tr>
    <td> erlang</td>
    <td> travisci/ci-amethyst:packer-1512508255-986baf0</td>
  </tr>
  <tr>
    <td> haskell</td>
    <td> travisci/ci-amethyst:packer-1512508255-986baf0</td>
  </tr>
  <tr>
    <td> perl</td>
    <td> travisci/ci-amethyst:packer-1512508255-986baf0</td>
  </tr>
  <tr>
    <td> default</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> go</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> jvm</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> node_js</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> php</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> python</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
  <tr>
    <td> ruby</td>
    <td> travisci/ci-garnet:packer-1512502276-986baf0</td>
  </tr>
</tbody></table>

最新の情報についてはtravis-ci のサイトにあるので、そちらを参考にしてください。
    - https://docs.travis-ci.com/user/common-build-problems/#Running-a-Container-Based-Docker-Image-Locally

今回はnode_js のイメージを使用してログイン、構築してテスト実行までを行ってみます。

# travis-ci のnodejs 用コンテナを起動する 
上記のリストからnodejs 用のイメージは`travisci/ci-garnet:packer-1512502276-986baf0` になります。
それをpull して構築していきます。


```console:travis-ciイメージのpullとコンテナの起動、ログイン
# IMAGE="travisci/ci-garnet:packer-1512502276-986baf0"
# docker run --name travis-debug -dit $IMAGE /sbin/init
# docker exec -it travis-debug bash -l
```


コンテナにログインしたらtravis ユーザに変更します。


```console:travisユーザへ変更
# su - travis
```


ひとまずはこれでtravis のOS 仮想環境の構築は完了で、一通りの環境変数やディレクトリ構成を確認することができるようになっています。
次はnodejs のテスト環境を構築して実際に実行するまでを行ってみます。

# nodejs テスト環境の構築 
テスト環境を構築するために現行ではruby 2.3.0 が必要みたいで、そのruby 環境を構築していきます。


```console:ruby環境の準備
$ ruby --version
$ rvm install 2.3.0
$ rvm use 2.3.0 --default
$ cd ~/builds
$ git clone https://github.com/travis-ci/travis-build.git
$ cd travis-build
$ mkdir -p ~/.travis
$ ln -s $(pwd) ~/.travis/travis-build
$ bundle install
$ bundler add travis
$ # cd ~/builds/travis-build
$ bundler binstubs travis
```


テスト対象リポジトリのclone とテスト用スクリプトを作成します。
今回はリポジトリ`https://github.com/TsutomuNakamura/rpncc.git` をclone してテスト実行してみます。


```console:テスト対象リポジトリのcloneとテストスクリプトの作成
$ cd ~/builds
$ git clone https://github.com/TsutomuNakamura/rpncc.git
$ cd rpncc
$ ~/.travis/travis-build/bin/travis compile --no-interactive > ci.sh
```


テストスクリプトを作成したら、テスト対象のブランチをci.sh に書き込みます。
今回は`master` ブランチをテストしてみます。


```console:masterブランチをテスト対象にする
$ sed -i "s/branch.*https/branch\\\=\\\'master\\\'\\\ https/g" ci.sh
```


ci.sh を実行してテストを走らせます。


```console:テスト実行
$ bash ci.sh
```

![TravisCI_LocalDockerContainerForTravis0000.png](https://qiita-image-store.s3.amazonaws.com/0/70152/b4a3f411-1748-80cf-245f-54531455064a.png)

テストが無事実行できました！

# 参考 
- How to Run TravisCI locally on Docker
    - https://medium.com/google-developers/how-to-run-travisci-locally-on-docker-822fc6b2db2e

- How to run travis-ci locally (stackoverflow)
    - https://stackoverflow.com/questions/21053657/how-to-run-travis-ci-locally

- Troubleshooting Locally in a Docker Image (Travis CI)
    - https://docs.travis-ci.com/user/common-build-problems/#Troubleshooting-Locally-in-a-Docker-Image