のんびりSEの議事録

プログラミング系のポストからアプリに関してのポストなどをしていきます。まれにアニメ・マンガなど

【Docker】Serverspecを用いたDockerのテスト

Dockerfileもある程度かけてきて、次のステップとしてちゃんとイメージが構成されているのか、をテストする方法を実際に構築したDockerfileを用いて記載したいと思います。

Dockerfile

まずはDockerfileに構築したい環境を記述していきます。
下記のDockerfileはCentOSにserverspecとansibleの環境を構築したサンプルです。
そのうちwerckerのイメージで使えるか試そうかと構築したものです。

FROM centos:6
MAINTAINER hogehoge
RUN yum update -y

# install dependency
RUN yum install -y git tar gcc openssl-devel epel-release \
  libyaml-devel readline-devel zlib-devel \
  libffi-devel libxml2-devel libxslt-devel

# install ruby
RUN curl -O http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz
RUN tar xvzf ruby-2.2.2.tar.gz -C /usr/local/share
RUN cd /usr/local/share/ruby-2.2.2 && ./configure && make && make install
RUN echo "gem: --no-rdoc --no-ri" >> $HOME/.gemrc

# install rake & serverspec
RUN gem install bundler && gem install serverspec

# install ansible
RUN yum install -y ansible

Dockerfileビルド

とりあえず、Dockerfileが完成したので、ビルドしてイメージを作成します。

$ docker build -t serverspec-ansible:0.0.1 .
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
serverspec-ansible          0.0.1               f67f629b5d81        36 minutes ago      872.2 MB
$ docker run serverspec-ansible:0.0.1
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS                     PORTS               NAMES
32666c60522e        serverspec-ansible:0.0.1   "/bin/bash"         5 seconds ago       Exited (0) 5 seconds ago                       mad_bell

これで一旦準備完了。

serverspecでテスト記述

必要モジュールのインストール

serverspecは最低限必要として、dockerを扱う場合、docker-apiが必要なのでインストールします。

docker-api | RubyGems.org | your community gem host

$ gem install serverspec
$ gem install docker-api

※ モジュール名はdocker-apiだが、requireするときにはdockerなので注意が必要

spec_helper

serverspec&dockerを使用するための記述を行います。

# coding : utf-8
require 'serverspec'
require 'docker'

# backendを :dockerで指定
set :backend, :docker
# docker_urlに`DOCKER_HOST`を指定
set :docker_url, ENV["DOCKER_HOST"]

# sslを無効にしておく
Excon.defaults[:ssl_verify_peer] = false

とりあえず上記で一旦はOKです。

テストの記述

では実際にテストを記述していきます。といっても、ここからはserverspecの書き方に合わせるだけなので、詳しい説明は省略します。↓こちらでいちおう触れてますcarefree-se.hatenablog.com

ポイントとしてはテスト実行前にdocker関連の設定を記述する必要があります。(spec_helperでもよかったかもしれん...)

# coding : utf-8
require 'spec_helper'

describe "Dockerfile" do

  before(:all) do
  # Dockerfileがあるカレントディレクトリを指定
    image = Docker::Image.build_from_dir('.')
    # テスト対象のOSタイプを指定 -> これはserverspecの設定か
    set :os, family: :redhat
    # docker imageの指定
    set :docker_image, image.id
  end


  def os_version
    command('cat /etc/issue').stdout
  end

  # osのバージョン確認
  it 'installs the right version of CentOS' do
    expect(os_version).to match(/CentOS/)
  end

  # packegeを落としてきてるので、展開時にディレクトリが存在するかのテスト
  it 'package exists' do
    expect(file('/usr/local/share/ruby-2.2.2')).to be_directory
  end

  # rubyがインストールされているかをテスト
  it 'install check ruby' do
    expect(command('ls -la /usr/local/bin').stdout).to match(/ruby/)
    expect(file('/usr/local/bin/ruby')).to be_executable
    expect(command('ruby --version').stdout).to_not be nil
  end

  # serverspec及びrakeがインストールされているかテスト
  it 'install check serverspec' do
    expect(command('ls -la /usr/local/bin').stdout).to match(/serverspec/)
    expect(file('/usr/local/bin/gem')).to be_executable
    expect(file('/usr/local/bin/rake')).to be_executable
    expect(file('/usr/local/bin/serverspec-init')).to be_executable
    expect(command('gem list').stdout).to match(/serverspec/)
    expect(command('gem list').stdout).to match(/rake/)
  end

  # ansibleがインストールされているかテスト
  it 'install check ansible' do
    expect(file('/usr/bin/ansible')).to be_executable
    expect(command('ls -la /usr/bin').stdout).to match(/ansible/)
    expect(command('ansible --version').stdout).to_not be nil
  end

end

所感

serverspecがどうというよりは、docker-apiをもう少し深追いしてみようかなと。思っていた以上にいろいろ出来そう。

今回作成したものをgithubにあげてますので、参考までに

github.com

参考

ServerspecのDockerバックエンドでコンテナをテストする。 - タチコマ好きなエンジニアのブログ

このシリーズ好きだな〜w