この記事について
みんなのServerspecの知見を知りたい
背景
久しぶりにServerspecを
業務で真面目に導入しようという話になっている
前提
- 案件がたくさんある
- 案件によってアーキテクチャが全然違う
- ミドルウェア周りの共通的なものはまとめたい
http://serverspec.org/advanced_tips.html のページの
How to use Serverspec tests as shared behaviors
を参照している
工夫できること
-
case
のディレクトリをつくって案件毎にまとめる -
shared
のディレクトリに共通の設定をまとめる
というぐらいしかアイデアがない
みんななにを工夫をしているのか知りたい
構成
├── Rakefile
└── spec
├── case
│ ├── anken_one
│ │ └── main_spec.rb # 1インスタンスとかであればこんな感じ?
│ └── anken_two
│ ├── db_spec.rb # WebやDBで分かれているならこんな感じ?
│ └── web_spec.rb
├── shared
│ ├── apache
│ │ └── init.rb
│ ├── nginx
│ │ └── init.rb
│ ├── postfix
│ │ └── init.rb
│ └── rails
│ └── init.rb
└── spec_helper.rb
Rakefile
require 'rake'
require 'rspec/core/rake_task'
task :spec => 'spec:all'
task :default => :spec
namespace :spec do
targets = []
Dir.glob('./spec/case/**').each do |dir| # caseディレクトリを追加
next unless File.directory?(dir)
target = File.basename(dir)
target = "_#{target}" if target == "default"
targets << target
end
task :all => targets
task :default => :all
targets.each do |target|
original_target = target == "_default" ? target[1..-1] : target
desc "Run serverspec tests to #{original_target}"
RSpec::Core::RakeTask.new(target.to_sym) do |t|
ENV['TARGET_HOST'] = original_target
t.pattern = "spec/case/#{original_target}/**/*_spec.rb" # ここも追加
end
end
end
anken_one/web_spec.rb
個別の設定
require 'spec_helper'
describe 'shared' do
include_examples 'nginx::init'
include_examples 'postfix::init'
end
describe process("nginx") do
its(:user) { should eq "foo" }
end
shared/postfix/init.rb
shared_examples 'postfix::init' do
describe port(25) do
it { should be_listening }
end
describe process("master") do
it {should be_running}
end
end