ようへいの日々精進XP

よかろうもん

docker + altria でカジュアル CI 環境を構築してみる(準備)

はじめに

  • dockerCI ツールを使ったテスト環境構築事例が色々と出てきていてとにかく楽しそう
  • dockerjenkins を使った構築事例はあるので altria で試してみることにした
  • 特定の環境に特化したテスト環境ではなく、色々なテストに利用出来るような環境構築を目指す
  • 今回はワンボタンで CI で使うコンテナを作成するところまでを作ってみることにする

参考


altria について

  • altria
  • Rails で実装された CI ツールでバックエンドには redis 等を使っている
  • プラグインの数や見た目はシンプルだが個人的には必要充分

準備の準備

altria について

  • こちらに導入手順は記載されている
  • 過去に導入したこともある

docker について

Ubuntu 環境であれば下記のようにとても簡単に docker を導入することが出来る。

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
apt-get install lxc-docker

必須ぢゃないけど

今回、root ユーザー以外で全て(altriadocker)動作させることを前提としている為(altria ユーザーで動作させる)、ホストの /etc/sudoers に以下を追加した。

altria  ALL=(ALL) NOPASSWD:/usr/bin/docker*

また、後々に docker inspect でコンテナの情報を取得する際に JSON で返ってくる結果をよろしくやってくれる jq もインストールしておくと便利。(jk ではありません)

sudo apt-get install jq

準備

Dockerfile

altria が動作させるホスト上に altria というユーザーを作り、$HOME 以下に適当にディレクトリを作成(任意)し、以下のような Dockerfile を置く。

FROM inokappa/wheezy-7.2-basic
#
ENV DEBIAN_FRONTEND noninteractive
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -sf /bin/true /sbin/initctl
RUN apt-get update
RUN apt-get install -y sudo openssh-server curl lsb-release build-essential
RUN mkdir -p /var/run/sshd
RUN useradd -d /home/altria -m -s /bin/bash altria
RUN echo altria:altria | chpasswd
RUN echo 'altria ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

Dockerfile の細かい説明はおググり頂ければと思うが、ざっくり書くと...

  • FROM でコンテナの元となるコンテナイメージを指定
  • ENV環境変数を指定(今回は DEBIAN_FRONTENDnoninteractive を指定することでパッケージのインストール時に発生する質問を抑制する)
  • RUN で実行するコマンドを書く

という感じ。ん、Dockerfile を使えば chef とか要らなくね?と思ってしまう。そもそもコンテナなのでべき等性もあまり気にする必要がない(コケたら捨てれば良い)のでお気軽に仮想環境を作っては捨て、作っては捨てが出来てしまうのが良いな。

試しに altria からコンテナを立ち上げる

早速、altria にコンテナを起動するジョブを追加してみる。

f:id:inokara:20131222094504p:plain

altria にアクセスして New ボタンをクリックして新しいジョブを追加する。

f:id:inokara:20131222094513p:plain

上記のように Script 欄に以下のようなスクリプトを記述して Create Job をクリックして作成を完了する(画像では Update job となっているが適宜、読み替えて頂ければ幸いです)。

cd ~/docker
sudo docker build -t test .
sudo docker run -t -d -p 22 test /usr/sbin/sshd -D

そして...いよいよ..

f:id:inokara:20131222095211p:plain

Run ボタンをポチっとなでしばらくすると...

f:id:inokara:20131222095435p:plain

はい。コンテナいっちょあがり。ちなみに、初めてコンテナを作成する際には Dockerfile に記述された各コマンド等が実行される為、その分の時間が発生するが、初回以降はサクッと一瞬でコンテナが起動する。ココが docker の良いところ!

確認

念の為、コマンドラインからコンテナが正常に起動しているかを確認する為に alltria のジョブの最後の部分からコンテナの ID を確認する。

f:id:inokara:20131222100136p:plain

赤枠で囲まれたコンテナの ID を使って docker inspect コマンドでコンテナの情報(ホスト名と IP アドレス)を取得してみる。

docker inspect 69382d43a22ca9babc184223675817b5fdb1b7e2f09dcdcebeeaaeb99c3a4b28 | jq '.[].Config.Hostname, .[].NetworkSettings.IPAddress'

以下のように出力される。

"69382d43a22c"
"172.17.0.3"

この情報を基にしてコンテナに ssh を使ってアクセスしてみる。既に docker run の際に sshd を起動した状態なので、以下のように普通に ssh コマンドでアクセスする。

ssh altria@172.17.0.3

以下のようにログインすることが出来た。

Linux tpX1-Carbon 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
altria@69382d43a22c:~$ cat /etc/debian_version
7.2
altria@69382d43a22c:~$

おお、とっても簡単。


さいごに

  • Dockerfile を上手く使うことで簡単に CI 環境からコンテナをワンクリックで作ることが出来た
  • docker inspect を使えばコンテナの情報を簡単に取得することが出来る
  • 取得したコンテナの情報をうまく使いまわすことで、コンテナ構築後アクションを柔軟に定義することが出来る!(と思う)
  • カジュアル、カジュアル!