こんな感じになりました
経緯
- Dockerfile の CI ってみんなどうしてるのだろう
- CI って思い浮かぶのは Travis CI かな
- Travis CI で Docker って使えるんだろうか
-
before_script
で自力で Docker インストールしてる人がいた - README にこんなページ貼ってある
8月に Docker 標準サポートされてるということなので試してみました。
試しに書いてみた
1. Dockerfile
PHP 5.6 + Apache 環境に Emacs をインストールするという環境を作成するとします。
Dockerfile
FROM php:5.6-apache
RUN apt-get -qqy update \
&& apt-get -qqy install emacs \
&& rm -rf /var/lib/apt/lists/*
COPY ./index.php /var/www/html/index.php
2. テストファイル
タイトルの通り Serverspec
でコンテナのテストを行います。
spec/spec_helper.rb
require 'serverspec'
set :backend, :docker
set :docker_url, ENV['DOCKER_HOST'] # こいつは Travis CI 上で定義してくれています
set :docker_container, ENV['TARGET_CONTAINER_ID'] # これは後で使います
Dockerfile に書いた部分をコードに落としていきます。
spec/container_spec.rb
require 'spec_helper'
describe package('emacs') do
it { should be_installed }
end
describe file('/var/www/html/index.php') do
it { should exist }
end
# php:5.6-apache が CMD で apache 起動しています
describe service('apache2') do
it { should be_running }
end
3. Travis CI の設定
Travis CI で docker を実行する為に最低限必要なことはこちら:
-
sudo: required
とする -
services:
にdocker
を追加する
あとは Serverspec 用にコンテナIDを環境変数にセットしてあります。
.travis.yml
sudo: required
language: ruby
services:
- docker
env:
- TARGET_CONTAINER_ID=container-php-emacs
before_script:
- docker build -t php-emacs .
- docker run -d --name $TARGET_CONTAINER_ID php-emacs
script:
- bundle exec rspec
4. 準備完了
以上の準備をもって:
-
services: docker
によって- Docker Host 環境が整えられ、docker build/run が使用可能に
- Docker Host に対応した環境変数がセットされる (
$DOCKER_HOST
みたいなやつ)
-
script
実行前に- リポジトリルートにある Dockerfile でイメージビルド
- 指定したコンテナIDでコンテナ起動
- ↑ で指定したコンテナIDを持つコンテナに向けて RSpec (Serverspec) を実行
となります
Build #1 - gongo/travisci-docker-serverspec-boilerplate - Travis CI
まとめ
_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> どんなファイルでもテストして Travis CI の badge を貼りたい!!!! <
 ̄YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY人人 ̄
みたいな人の欲求を満たす方法として、「Dockerfile の CI」を実現してみました。
そんな私も「Emacs 環境を Heroku 上で構築するための Dockerfile」を書いているので、勢いで試してみました。