Docker + Jenkins + travis.yml parser 作って Travis っぽいものを作った話

年末にDocker触ってて、これをうまく活かせば、副作用を無視した使い捨てのテスト環境が作れるんじゃねーかな、という意識が高まったのですが、手を付けられずにうにゃうにゃしてました。

そうこうする内に yahooのデベロッパーの方からJenkins with Dockerというタイトルの発表があり、ほぼ僕のやりたい事のベースができていたので、これをforkして、travis.yml parserや若干のバグフィックスを入れてもう少しだけTravisに近づけてみました。

ちなみにこれは 社内 Immutable Infrastructure ハッカソンした時の成果物です。

Immutable Infrastructure Hackathon at :D を開催したら、configspec の敷居が高いのでコミッタになっていました - sonots:blog

今回の成果物に関して、詳しくはここを見て下さい。
https://github.com/yosuke-furukawa/jenkins-with-docker-demo

社内のリポジトリやプライベートリポジトリでもtravisライクな言語のバージョンをまたいだテストが出来るようになるので、結構便利かと。

Getting Started

% vagrant plugin install --plugin-source https://rubygems.org/ --plugin-prerelease vagrant-vbguest
% git clone https://github.com/yosuke-furukawa/jenkins-with-docker-demo.git; cd jenkins-with-docker-demo
% vagrant up

で、起動したら、

http://localhost:8888 で Jenkinsが起動しているので、そこに対して、アクセスして、後は yosuke_furukawa_grunt_jsx_travis_yml_parseというjobを動かす。

f:id:yosuke_furukawa:20140122202213p:plain

するとこんな感じになるはず。

機能

  • travis.ymlをparseして、before install, before script, after script 等の事前事後処理を行うことができる。
  • npm install -g でインストールする時にユーザーフォルダにインストールするようにした、これでnpm install -g bower 等の処理が可能。

細かなバグ修正

  • fork元がテストに成功しても失敗してもJenkinsが成功になってたので、失敗したらJenkinsが失敗になるように修正
  • Vagrantfileで/vagrantからコピーする時に/vagrantがハングする時があったので、gitからcloneするように。
  • ずっと使っているとdocker コンテナが一杯になって、ディスクフルになるので、ここを参考にテスト実行後にいらないコンテナを削除するようにした。

未対応だけどやりたいこと

こんな感じですね。これらの未対応リストが消化されたら社内でも実験的に使っていこうかと。

ちなみにtravisは本当に高機能なので全機能をサポートしようとすると1日や2日のハッカソンじゃ無理。今回学んだこととしては、travisの機能たくさんあるってこと、ホントすごい。



おまけ

Dockerつらぽよリスト
  • たまにdocker logsが途中で止まる、、、これはJenkinsがいつまでたってもテストが終わらなくなるので辛い。
  • docker runの時に nodebrew install-binary みたいな大きなファイルをDLしようとすると止まる
  • Dockerfileのデバッグがつらぽよ、Dockerfileの中で、こういう感じのEntrypoint作って、runの時にコマンド流して確認するんだけど、もう少しどうにかしたい。docker runじゃなくて、できあがったイメージに対してsshとかでログインしたい(※たぶんそういうDockerfile書けばできる)。

というわけで、Dockerそんなに慣れているわけじゃないですが、使ってみました。こうした方がいいんじゃね?みたいな指摘があれば是非githubにコメントをお寄せ下さい。