fbpx

CookbookをTravis CIでテストする #opschef_ja

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

Travis CIとは、SaaS型の継続的インテグレーションサービスで、GitHub上のプロジェクトのビルド・テストを行えます。

Travis CIはRubyにも対応しているため、これを利用してCookbookのテストを行うことができます。

Travis CIへの登録

Travis CIへの登録は、GitHubのアカウントを利用して行います。

詳細はTravis CI:Documentationを参照してください。

CookbookのテストをTravis CIで実施する

Travis CI上でビルド・テストを行うには、対象のプロジェクトのトップディレクトリに.travis.ymlというYAMLファイルを設置し、設定を記載します。

ここではMVT: Knife Test and Travis CIを参考に進めます。

まず、.travis.ymlを用意します。

rubyの環境はrvmを使って1.9.3を用意し、rakeコマンドからChefSpecを呼び出して実行するとします。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi .travis.yml
language: ruby
gemfile:
- test/support/Gemfile
rvm:
- 1.9.3
script:
- bundle exec rake rspec
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

テストに必要なgemをインストールするためのGemfileを準備します。

なお、monetaは2013年4月23日現在、0.7系がインストールされますが、「cannot load such file -- moneta/memory」というエラーでChefSpecが動作しないため、ヴァージョンを0.6系に固定しています。

また、以前インストールできるChefSpec 0.9.0はChef 11には対応していませんでした。2013年4月23日以降はChef 11に対応したChefSpec 1.0.0がリリースされているため、そちらを使うようにヴァージョンを指定しています。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ mkdir -p test/support
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi test/support/Gemfile
source 'https://rubygems.org'
gem 'rake'
gem 'moneta', '~> 0.6.0'
gem 'chefspec', '> 0.9.0'
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

Rakefileを準備します。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi Rakefile
#!/usr/bin/env rake


desc 'chefspec'
task :rspec do |t|
if Gem::Version.new( '1.9.2' ) <= Gem::Version.new( RUBY_VERSION.dup )
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new( :rspec ) do |t|
spec_files_path = './spec/*_spec.rb'
t.pattern = spec_files_path
t.rspec_opts = ['-c']
end
end
end

task :default => [ :rspec ]
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

これでrakeによってChefSpecを呼び出して実行可能です。

ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ rake rspec
/usr/bin/ruby -S rspec ./spec/default_spec.rb -c
.............

Finished in 0.09303 seconds
13 examples, 0 failures
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

以上をGitHubにpushすることで、Travis CIへ投入され、テストが行われます。

Cookbookのテストの追加

さらにknife cookbook testfoodcriticによるテストを追加します。

.travis.ymlに実行するコマンドを追加します。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi .travis.yml
language: ruby
gemfile:
- test/support/Gemfile
rvm:
- 1.9.3
script:
- bundle exec rake rspec
- bundle exec rake knife
- bundle exec rake foodcritic
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

test/support/Gemfileに必要なgemを追加します。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi test/support/Gemfile
source 'https://rubygems.org'
gem 'rake'
gem 'moneta', '~> 0.6.0'
gem 'chefspec', '> 0.9.0'
gem 'chef'
gem 'foodcritic'
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

Rakefileにタスクを追加します。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi Rakefile
#!/usr/bin/env rake


desc 'chefspec'
task :rspec do |t|
if Gem::Version.new( '1.9.2' ) <= Gem::Version.new( RUBY_VERSION.dup )
require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new( :rspec ) do |t|
spec_files_path = './spec/*_spec.rb'
t.pattern = spec_files_path
t.rspec_opts = ['-c']
end
end
end

desc 'foodcritic'
task :foodcritic do |t|
if Gem::Version.new( '1.9.2' ) <= Gem::Version.new( RUBY_VERSION.dup )
# "FC008: Generated cookbook metadata needs updating" is for handson
sh "foodcritic -f any #{File.dirname( __FILE__ )}"
else
puts "WARN: foodcritic run is skipped as Ruby #{RUBY_VERSION} is < 1.9.2."
end
end

desc 'knife cookbook test'
task :knife do
Rake::Task[ :prepare_sandbox ].execute
sh "bundle exec knife cookbook test cookbook -c test/.chef/knife.rb -o #{sandbox_path}/../"
end
task :prepare_sandbox do
files = %w{*.md *.rb attributes definitions files libraries providers recipes resources templates}

rm_rf sandbox_path
mkdir_p sandbox_path
cp_r Dir.glob("{#{files.join(',')}}"), sandbox_path
end

private
def sandbox_path
File.join(File.dirname(__FILE__), %w(tmp cookbooks cookbook))
end

task :default => [ :rspec, :knife, :foodcritic ]
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

knife cookbook testはtemplateのテストにキャッシュファイルの生成が必要になるため、テスト用のknife.rbを作成します。


ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ mkdir -p test/.chef/
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi test/.chef/knife.rb
cache_type 'BasicFile'
cache_options(:path => "#{ENV['HOME']}/.chef/checksums")

rakeコマンドを実行すると、ChefSpec、knife cookbook test、foodcriticによるテストが行われます。

ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ rake rspec
/usr/bin/ruby -S rspec ./spec/default_spec.rb -c
.............

Finished in 0.09312 seconds
13 examples, 0 failures
rm -rf /home/ubuntu/chef-repo/cookbooks/apache2-take/tmp/cookbooks/cookbook
mkdir -p /home/ubuntu/chef-repo/cookbooks/apache2-take/tmp/cookbooks/cookbook
cp -r CHANGELOG.md README.md metadata.rb attributes files recipes templates /home/ubuntu/chef-repo/cookbooks/apache2-take/tmp/cookbooks/cookbook
bundle exec knife cookbook test cookbook -c test/.chef/knife.rb -o /home/ubuntu/chef-repo/cookbooks/apache2-take/tmp/cookbooks/cookbook/../
checking cookbook
Running syntax check on cookbook
Validating ruby files
Validating templates
foodcritic -f any /home/ubuntu/chef-repo/cookbooks/apache2-take
FC008: Generated cookbook metadata needs updating: /home/ubuntu/chef-repo/cookbooks/apache2-take/metadata.rb:2
FC008: Generated cookbook metadata needs updating: /home/ubuntu/chef-repo/cookbooks/apache2-take/metadata.rb:3
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$

まずはじめに、このようなテストのための設定を行っておけば、開発サイクルに効果をもたらすはずです。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA