仮想化技術Dockerの登場でお手軽に仮想マシンを作成、配布できるようになりました。Circle CIとかもDockerに対応したわけだし、積極的にJenkinsでもDockerを利用してビルドやテストを行った方が良いのではないかなというお話。
なぜDockerを利用するのか
環境を汚さないですむ
場合にもよりますが、Jenkinsが実行しビルドをする環境は結構汚れます。同じ言語やフレームワークでも様々なバージョンがインストールされていたりで管理が難しくなります。その結果、意図しない変更によってビルドやテストに失敗し、原因特定に時間がかかったりするとなんかもう無駄です。Dockerを利用して作成した仮想マシンの中にビルドのためのコンパイラやフレームワークをインストールしておけば環境が汚れることはありません。
開発環境と同じ環境でビルドやテストができる
自分のマシンではテストが通ったのに、Jenkinsでは落ちた。みたいなことが減ります。Jenkinsの場合、ビルドに失敗するとコードに問題があるのか設定に問題があるのかはたまたJenkinsが動いているマシンに問題があるのか、たまにハマります。そういうのがなくなります。
また、Windows,MacあるいはLinuxがバラバラの環境でもみんなで同じDockerfileを利用することで、これまたみんなで同じ環境が利用できます。
という訳でやってみた
今回はSphinxでドキュメントを作る環境を整えます。「テストがー」とか言っておきながら、いきなりテスト関係ないっていうね。
開発するマシンにインストールするのは
- Docker あるいは boot2docker
- Make
- Sphinx
ただしSphinxが必要になるのは最初のSphinxプロジェクトを作る場合のみで、プロジェクトの作成を行わない環境ではインストールは不要です。
とりあえず、Sphinxでプロジェクトを作ります。
$sphinx-quickstart
プロジェクトができたら、プロジェクトのルートディレクトリにDockerfileを作ります。
FROM ubuntu
RUN sudo apt-get -y update && \
sudo apt-get -y upgrade && \
sudo apt-get -y install python-sphinx make
ADD . /usr/local/etc/doc
WORKDIR /usr/local/etc/doc
CMD make html
UbuntuにSphinxのインスールを行いました。さて次にDockerMakefileを用意します。
date=$(shell date +%s)
doc:
docker build -t doc .
docker run --name="doc$(date)" doc
docker cp doc$(date):/usr/local/etc/doc/build/html .
ここまでで準備は終わりです。あとはドキュメントを編集して
make -f DockerMakefile doc
とすれば./html
に成果物としてファイルが出来上がります。
そしてJenkinsへ
Jenkinsがビルドを行うホストにDockerをインストールし、JenkinsユーザーからDokcerが利用できる状態にしておきます。その後、SCMの設定とかをやってビルドタスクの「シェルの実行」で
make -f DockerMakefile doc
を指定するだけです。Jenkinsの設定も楽になりました。
課題
さて、今回作ったMakefileではビルドの度にImageの作成とContainerの作成を行っています。適当なタイミングで利用し終わったImageやContainerを削除した方がいいかもしれません。
まとめ
Docker便利