Travis CI 上で docker build/run を実行し、起動したコンテナを Serverspec でテストする

  • 13
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

こんな感じになりました

https://github.com/gongo/travisci-docker-serverspec-boilerplate

経緯

  1. Dockerfile の CI ってみんなどうしてるのだろう
  2. CI って思い浮かぶのは Travis CI かな
  3. Travis CI で Docker って使えるんだろうか
  4. before_scriptで自力で Docker インストールしてる人がいた
  5. 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. 準備完了

以上の準備をもって:

  1. services: docker によって
    • Docker Host 環境が整えられ、docker build/run が使用可能に
    • Docker Host に対応した環境変数がセットされる ($DOCKER_HOST みたいなやつ)
  2. script 実行前に
    1. リポジトリルートにある Dockerfile でイメージビルド
    2. 指定したコンテナIDでコンテナ起動
  3. ↑ で指定したコンテナIDを持つコンテナに向けて RSpec (Serverspec) を実行

となります

Build #1 - gongo/travisci-docker-serverspec-boilerplate - Travis CI

まとめ

_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> どんなファイルでもテストして Travis CI の badge を貼りたい!!!! <
 ̄YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY人人 ̄

みたいな人の欲求を満たす方法として、「Dockerfile の CI」を実現してみました。

そんな私も「Emacs 環境を Heroku 上で構築するための Dockerfile」を書いているので、勢いで試してみました。

参考