5

Jenkins 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 list3.0.2 を使用していると表示されているのかわかりません)

sp_jenkinsクックブックはクックブック (metadata.rb) に依存しており、yum問題なく動作しますが、現在書いているクックブックはクックブックに依存していないため、利用可能なメソッドとメソッドyumがありません。yum_keyyum_repository

ChefSpec が含まれているレシピ/クックブックに「下降」するのを防ぎ、現在のクックブックをテストする方法はありますか?

4

3 に答える 3

3

おはよ!Julian は正しいです。ChefSpec は実際には、ローカル マシンのメモリ内でChef Soloを実行します。プロバイダーのアクションを noop に書き換えますが、実行されたすべてのアクション (通知が実行された場合に実行されるアクションを含む) のレジストリを作成します。

したがって、このレシピを実際のノードに収束させるためにクックブックが必要なのと同じようにyum、ChefSpec を使用した単体テスト中に収束させる必要があります。これを実現する最も簡単な方法は、Berkshelf または Librarian リゾルバーを使用することです。Berkshelf リゾルバーを使用するには、以下require 'chefspec/berkshelf'を要求した後chefspec:

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

システムに Berkshelf がインストールされている場合、すべてのクックブックが一時ディレクトリに取り込まれ、ChefSpec が実行されます。

同様の問題を解決することを目的としたStrainerも参照してください。


少し関係のない話ですが、私はJenkins クックブックのかなり大規模なリファクタリングに取り組んでいます。


ソース:

  • 私はそれを書きました...
于 2013-12-14T20:34:44.710 に答える
2

いいえ、Chef の実行全体をメモリ内に収束させようとしているため、下降を防ぐ方法はありません。

ただし、ChefSpec で Berkshelf 機能を使用すると、Berkshelf 依存関係リゾルバーが依存するすべてのクックブックをメモリ内の Chef 実行にフィードするので、うまくいきます。

于 2013-12-13T18:12:07.657 に答える