我为安装詹金斯ci做了一本食谱。它使用key食谱中的repositoryyum资源,因此我最终得到了以下配方:

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_keyyum_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
资料来源:
我写的…

07-28 02:50