はじめに
- .travis.ymlに
sudo: false
と書けばコンテナベースの環境を利用できるようになり、ビルド時間が短縮されるということをご存知でしょうか? - 関連する記事はたくさんあり、ググると
sudo: false
と書くだけですと - ところが何でも書けちゃう.travis.ymlには sudo を既にたくさん書いているなんてことはないでしょうか
- sudo廃止のためにやったことをここに書いていきます
- 記事を書いていて気付いたのですが、TravisCIの公式ドキュメントを隅から隅まで読んでいれば、そもそもこの問題にぶち当たることもないと思われますw
- なぜなら、ほとんど正解はそこにあるから!というよりそこに書いていなければ「それはデキナイ」ことかもしれない
- ですが、隅から隅まで読むなんて・・・という方は参考にしてみてください
- そして、他にもこんなこと対応しました!などあれば編集リクエストなりコメントください。お待ちしております^^
何でコンテナベースを利用したいのか
- ここの記事をみるのがわかりやすいかとおもいます
- TravisCIの公式ドキュメントにも 起動時間がはやくなる が最大のメリットかと思います
[ 対応1 ] sudoを使わずにapt-get install
変更前
- TravisCIの公式ドキュメント http://docs.travis-ci.com/user/customizing-the-build/#Installing-Packages-Using-apt にsudoを使った例が書いてある
.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が使えないから以下のようにして書いてね!と
.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さんのコメントを見つけた
- ここでとる対応はすごく簡単で、配置先を変更するだけなのです
- 以下のように--userオプションを追加することで、~/.local/以下に配置されるためsudoを要求されなくなります
.travis.yml
install: pip install --user [package]
[ 対応3 ] sudoを使わずに/etc/hostsを設定する
変更前
- 以下のように/etc/hostsを直接変更していたので、当然sudoがないと ぱーみっしょんでぃないど! と怒られる
.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が有効となる
.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必読
- Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください