TravisCIでコンテナベースの環境を利用するまでにやったsudo廃止作業

# はじめに
* .travis.ymlに```sudo: false```と書けばコンテナベースの環境を利用できるようになり、ビルド時間が短縮されるということをご存知でしょうか？
* 関連する記事はたくさんあり、ググると```sudo: false```と書くだけですと
* ところが何でも書けちゃう.travis.ymlには **sudo** を既にたくさん書いているなんてことはないでしょうか
 * sudo廃止のためにやったことをここに書いていきます
* 記事を書いていて気付いたのですが、TravisCIの公式ドキュメントを隅から隅まで読んでいれば、そもそもこの問題にぶち当たることもないと思われますw
 * なぜなら、ほとんど正解はそこにあるから！というよりそこに書いていなければ「それはデキナイ」ことかもしれない
* ですが、隅から隅まで読むなんて・・・という方は参考にしてみてください
* そして、他にもこんなこと対応しました！などあれば編集リクエストなりコメントください。お待ちしております^^

# 何でコンテナベースを利用したいのか
* ここの記事をみるのがわかりやすいかとおもいます
 * [Travis CIでコンテナベースのインフラストラクチャとDockerでより高速なビルドを](http://postd.cc/faster-builds-with-container-based-infrastructure/)
* TravisCIの公式ドキュメントにも **起動時間がはやくなる** が最大のメリットかと思います
 * http://docs.travis-ci.com/user/ci-environment/#Virtualization-environments

# [ 対応1 ] sudoを使わずにapt-get install
### 変更前
* TravisCIの公式ドキュメント http://docs.travis-ci.com/user/customizing-the-build/#Installing-Packages-Using-apt にsudoを使った例が書いてある

```yaml:.travis.yml
before_install:
	- sudo apt-get update -qq
	- sudo apt-get install -qq [packages list]
```

### 変更後

* だが、使わない方法もちゃんと http://docs.travis-ci.com/user/apt/#Adding-APT-Packages に書いてある
 * コンテナベースを使いたいならsudoが使えないから以下のようにして書いてね！と

```yaml:.travis.yml
addons:
  apt:
    packages:
    - [package1]
    - [package2]
```

# [ 対応2 ] sudoを使わずにpip installする
### 変更前
* まずは、単純に付けていたsudoを取ってみる。すると以下のように怒られる

```
$ pip install [package]
  Exception:
  Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/basecommand.py", line 232, in main
      status = self.run(options, args)
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/commands/install.py", line 347, in run
      root=options.root_path,
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/req/req_set.py", line 549, in install
      **kwargs
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/req/req_install.py", line 740, in install
      self.move_wheel_files(self.source_dir, root=root)
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/req/req_install.py", line 949, in move_wheel_files
      isolated=self.isolated,
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/wheel.py", line 234, in move_wheel_files
      clobber(source, lib_dir, True)
    File "/usr/local/lib/python2.7/dist-packages/pip-6.0.7-py2.7.egg/pip/wheel.py", line 212, in clobber
      shutil.copyfile(srcfile, destfile)
    File "/usr/lib/python2.7/shutil.py", line 83, in copyfile
      with open(dst, 'wb') as fdst:
  IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/six.pyc'
The command "pip install [package]" failed and exited with 2 during .
```

### 変更後
* TravisCIのAsariさんの[コメント](https://github.com/travis-ci/travis-ci/issues/3139)を見つけた
* ここでとる対応はすごく簡単で、配置先を変更するだけなのです
* 以下のように--userオプションを追加することで、~/.local/以下に配置されるためsudoを要求されなくなります

```yaml:.travis.yml
install: pip install --user [package]
``` 

# [ 対応3 ] sudoを使わずに/etc/hostsを設定する
### 変更前
* 以下のように/etc/hostsを直接変更していたので、当然sudoがないと **ぱーみっしょんでぃないど！** と怒られる

```yaml:.travis.yml
before_install: sudo sh -c 'echo "127.0.0.1 travis.dev joshkalderimis.com" >> /etc/hosts'
```

### 変更後
* またもやTravisCIの公式ドキュメント http://docs.travis-ci.com/user/hosts/ に丁寧に書いてある
 * このように書くと、/etc/hostsが期待通り更新されている
 * IPv4/IPv6どちらの設定にも追加され、IPv6が有効となる

```yaml:.travis.yml
addons:
  hosts:
    - travis.dev
    - joshkalderimis.com
```

# 確認
* TravisCIのコンソールログに以下があればコンテナベースの環境が使えています！という証拠です

```
This job is running on container-based infrastructure, which does not allow use of 'sudo', setuid and setguid executables.
If you require sudo, add 'sudo: required' to your .travis.yml
See http://docs.travis-ci.com/user/workers/container-based-infrastructure/ for details.
```

----


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