我为安装詹金斯ci做了一本食谱。它使用key
食谱中的repository
和yum
资源,因此我最终得到了以下配方:
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“下降”到包含的食谱/食谱中,并且只测试当前的食谱?
最佳答案
奥海!julian是正确的-chefspec实际上在本地计算机的内存中执行Chef Solo运行。它将提供者操作重写为noop,但会创建所有已采取操作(包括在执行通知时将采取的操作)的注册表。
因此,就像您需要yum
菜谱将此菜谱聚合到一个真正的节点上一样,您也需要它在使用chefspec进行单元测试时聚合。实现这一点的最简单方法是使用berkshelf或library解析器。要使用Berkshelf resolver,只需在需要require 'chefspec/berkshelf'
后chefspec
:
# spec_helper.rb
require 'chefspec'
require 'chefspec/berkshelf'
如果您的系统上安装了berkshelf,它会将所有的食谱放入一个临时目录中,并为您运行chefspec。
您可能还想看看Strainer,它旨在解决类似的问题。
有点不相干的是,我正在研究一种比较适合你需要的large refactor to the Jenkins cookbook。
资料来源:
我写的…