2013-12-12 4 views
4

Я построил поваренную книгу для установки Jenkins CI. Он использует key и repository ресурсы из yum поваренной книги, так что я в конечном итоге со следующим рецептом:ChefSpec не должен тестировать включенный рецепт

yum_key "RPM-GPG-KEY-jenkins" do 
    url "http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key" 
    action :add 
end 

yum_repository "jenkins" do 
    description "Jenkins-CI 3rd party repository" 
    url "http://pkg.jenkins-ci.org/redhat" 
    key "RPM-GPG-KEY-jenkins" 
    action :add 
end 

Когда я включаю этот рецепт в другой рецепт:

include_recipe 'sp_jenkins::default' 

и я проверить это с следующий тест ChefSpec

it 'includes the `sp_jenkins::default` recipe' do 
    expect(chef_run).to include_recipe('sp_jenkins::install') 
end 

мой ChefSpec тест терпит неудачу с следующий вывод:

NameError: 
    Cannot find a resource for yum_key on chefspec version 0.6.1 

(я не знаю, почему он говорит, что версия 0.6.1, gem list говорит мне, что он использует 3.0.2)

sp_jenkins поваренной действительно зависит от yum поваренной книги (metadata.rb), и работает хорошо, однако поваренная книга, которую я сейчас пишу, не зависит от кулинарной книги yum и, следовательно, не имеет доступных методов yum_key и yum_repository.

Есть ли способ предотвратить использование ChefSpec в «включенных» рецептах/поваренных книгах и просто проверить текущую поваренную книгу?

+0

Вы говорите, что вы включили рецепт 'include_recipe 'sp_jenkins :: default'', но утверждаете' include_recipe (' sp_jenkins :: install ') '. какой рецепт содержит ресурсы 'yum_key' и' yum_repository'? – shawnzhu

+0

Рецепт 'sp_jenkins' содержит ресурсы, но я тестирую поваренную книгу, которая включает' include_recipe 'sp_jenkin :: default', в которой не указано кулинарная книга 'yum', указанная как зависящая. – mtak

+0

Он должен работать так, как сейчас. Похоже, что ChefSpec не может найти вашу кулинарную книгу 'yum'. Это в той же папке, что и кулинарная книга Дженкинса? Если это не так, убедитесь, что ChefSpec знает, где искать поваренные книги. Попытайтесь найти строку '0.6.1' - что это может означать, что поможет. –

ответ

3

Ohai! Джулиан прав: ChefSpec фактически выполняет Chef Solo в памяти на вашем локальном компьютере. Он перезаписывает действия провайдера как noop, но создает реестр всех предпринятых действий (включая те, которые были бы предприняты, если бы были выполнены уведомления).

Так же, как вам нужна кулинарная книга yum, чтобы сменить этот рецепт на настоящий узел, вам нужно, чтобы он сходился во время модульных тестов с помощью ChefSpec. Самый простой способ добиться этого - использовать решетки Berkshelf или Librarian. Для того, чтобы использовать Berkshelf resolver, просто require 'chefspec/berkshelf' потребовав chefspec:

# spec_helper.rb 
require 'chefspec' 
require 'chefspec/berkshelf' 

Если у вас есть Berkshelf установлены на вашей системе, он будет тянуть все поваренные книги во временный каталог и запустить ChefSpec для вас.

Вы также можете взглянуть на Strainer, целью которого является решение аналогичной проблемы.


На несколько несвязанных ноте, я работаю на довольно large refactor to the Jenkins cookbook, что может лучше соответствовать вашим потребностям.


Источники:

  • я написал ...
+0

Благодарим вас за помощь! –

2

Нет, не существует способа предотвратить его спуск, поскольку он пытается свести весь ход Chef в памяти.

Однако, если вы используете функциональность Berkshelf в ChefSpec, преобразователь зависимости Berkshelf будет кормить все зависимые кулинарные книги для запуска повара в памяти, и вы будете золотыми.