Itamae の plugin 書いててそろそろ test 欲しいなあとおもって2年くらいたちましたが、 ようやく Docker 使って test 書きました。

方向性

ここでテストを実施するとして何に対しておこなうのかというのを考えましたが、E2Eのテストだけで良いだろうという方向でテストを書くようにしています。 VMを立てて実行することにはチョット大袈裟だろうということでもっと簡単に、楽にということで docker を選択しています。

itamae で E2E のテストなのでここでは serverspec を利用してテストを行います。 E2E のテスト準備として docker 内で最初に目的のレシピを実施し、そのレシピが正しく動作しているかをテストしています。

準備とテスト実施

準備として以下の gem を追加しますが、 docker-api.gem の方はなくてもとくに問題ないです。 serverspec の対象バックエンドで docker指定できるようになりますが、 docker 内 (docker run -t hoge bundle exec serverspec など) で serverspec を実施すれば実行できますので、好みで追加しましょう。

spec.add_development_dependency "docker-api"
spec.add_development_dependency "serverspec"

次に Dockerfile を作成します。ここでは単純に必要な準備を実施、テストしたいディレクトリの追加、 bundler を利用して gem のインストールを実施してから、対象のディレクトリで itamaelocal を指定して対象の docker にレシピ適用します。そのあと docker runserverspec を実施することでテストをすることが可能となります。

FROM ruby
RUN echo "gem: --no-rdoc --no-ri" >> /.gemrc
RUN gem install bundler
ADD . /app
WORKDIR /app
RUN bundle install
RUN bundle exec itamae local samples/recipe.rb
CMD bundle exec rake

itamae-plugin-resource-pip

itamae-plugin-resource-pip でできるようになってます。 とくに docker.io とかで公開していませんので、以下に例を

cd /path/to/itamae-plugin-resource-pip
docker build -t katsyoshi/itamae-plugin-resource-pip .
docker run -t katsyoshi/itamae-plugin-resource-pip bundle exec rake

おわり

これやろうと思って調べてたらみつからずに Dockerfile 書き終えて、travis を追加しようとしたときに、@sue445 さんがやってたのをみつけてしまった。。。