如何解决 mixlib-shellout gem 版本冲突?
How to resolve a mixlib-shellout gem version conflict?
我正在尝试使用 Kitchen/Chef 进行部署。我其实不确定我是否接触过厨房。
我的理解是 gem list
列出存储库中的所有 gem,并且项目从该存储库中获取它想要的任何 gem。
在 运行 gem install bundler
和 gem install berkshelf
之后,我得到了 gem list | grep shellout
.
显示的 mixlib-shellout (2.2.6)
然后我 运行 bundle install
并根据我的 Gemfile 安装 "mixlib-shellout (1.6.1)"。然后 gem list | grep shellout
.
显示 "mixlib-shellout (2.2.6, 1.6.1)"
来自Gemfile.lock,我相信1.6.1 是想要的版本。然后我运行berks install
,抛出异常,是:
Unable to activate chef-11.18.12, because mixlib-shellout-2.2.6 conflicts with mixlib-shellout (~> 1.4) - 11.18.12 - (Gem::LoadError)
我不明白为什么它会尝试获取 2.2.6 而不是 1.6.1。
我的 Gemfile
source 'https://rubygems.org'
group :development do
gem 'berkshelf', '~> 4.0'
gem 'berkshelf-api-client', '~> 2.0'
gem 'thor'
gem 'chef', '~> 11.16'
gem 'test-kitchen', '~> 1.2'
gem 'kitchen-vagrant', '>= 0.16'
gem 'serverspec'
gem 'infrataster'
gem 'busser'
gem 'busser-serverspec'
gem 'chefspec', '~>4'
gem 'rubocop'
gem 'foodcritic'
end
gem 'chef-vault', '~> 2.2'
Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
addressable (2.3.8)
ast (2.2.0)
berkshelf (4.1.0)
addressable (~> 2.3.4)
berkshelf-api-client (~> 2.0)
buff-config (~> 1.0)
buff-extensions (~> 1.0)
buff-shell_out (~> 0.1)
celluloid (= 0.16.0)
celluloid-io (~> 0.16.1)
cleanroom (~> 1.0)
faraday (~> 0.9.0)
httpclient (~> 2.6.0)
minitar (~> 0.5.4)
octokit (~> 4.0)
retryable (~> 2.0)
ridley (~> 4.3)
solve (~> 2.0)
thor (~> 0.19)
berkshelf-api-client (2.0.0)
faraday (~> 0.9.1)
httpclient (~> 2.6.0)
buff-config (1.0.1)
buff-extensions (~> 1.0)
varia_model (~> 0.4)
buff-extensions (1.0.0)
buff-ignore (1.1.1)
buff-ruby_engine (0.1.0)
buff-shell_out (0.2.0)
buff-ruby_engine (~> 0.1.0)
busser (0.7.1)
thor (<= 0.19.0)
busser-serverspec (0.5.9)
busser
capybara (2.6.2)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
celluloid (0.16.0)
timers (~> 4.0.0)
celluloid-io (0.16.2)
celluloid (>= 0.16.0)
nio4r (>= 1.1.0)
chef (11.18.12)
chef-zero (~> 2.2, >= 2.2.1)
diff-lcs (~> 1.2, >= 1.2.4)
erubis (~> 2.7)
ffi-yajl (~> 1.2)
highline (~> 1.6, >= 1.6.9)
mime-types (~> 1.16)
mixlib-authentication (~> 1.3)
mixlib-cli (~> 1.4)
mixlib-config (~> 2.0)
mixlib-log (~> 1.3)
mixlib-shellout (~> 1.4)
net-ssh (~> 2.6)
net-ssh-multi (~> 1.1)
ohai (~> 7.4)
plist (~> 3.1.0)
pry (~> 0.9)
rest-client (>= 1.0.4, <= 1.6.7)
chef-vault (2.7.1)
chef-zero (2.2.1)
ffi-yajl (~> 1.1)
hashie (~> 2.0)
mixlib-log (~> 1.3)
rack
chefspec (4.5.0)
chef (>= 11.14)
fauxhai (~> 3.0, >= 3.0.1)
rspec (~> 3.0)
cleanroom (1.0.0)
cliver (0.3.2)
coderay (1.1.0)
diff-lcs (1.2.5)
erubis (2.7.0)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
faraday_middleware (0.10.0)
faraday (>= 0.7.4, < 0.10)
fauxhai (3.1.0)
net-ssh
ffi (1.9.10)
ffi-yajl (1.4.0)
ffi (~> 1.5)
libyajl2 (~> 1.2)
foodcritic (6.0.0)
erubis
gherkin (~> 2.11)
nokogiri (>= 1.5, < 2.0)
rake
rufus-lru (~> 1.0)
treetop (~> 1.4)
yajl-ruby (~> 1.1)
gherkin (2.12.2)
multi_json (~> 1.3)
hashie (2.1.2)
highline (1.7.8)
hitimes (1.2.3)
httpclient (2.6.0.1)
infrataster (0.3.2)
capybara
faraday
faraday_middleware (>= 0.10.0)
net-ssh
net-ssh-gateway
poltergeist
rspec (>= 2.0, < 4.0)
thor
ipaddress (0.8.2)
json (1.8.3)
kitchen-vagrant (0.19.0)
test-kitchen (~> 1.4)
libyajl2 (1.2.0)
method_source (0.8.2)
mime-types (1.25.1)
mini_portile2 (2.0.0)
minitar (0.5.4)
mixlib-authentication (1.4.0)
mixlib-log
rspec-core (~> 3.2)
rspec-expectations (~> 3.2)
rspec-mocks (~> 3.2)
mixlib-cli (1.5.0)
mixlib-config (2.2.1)
mixlib-log (1.6.0)
mixlib-shellout (1.6.1)
molinillo (0.2.3)
multi_json (1.11.2)
multipart-post (2.0.0)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-ssh (2.9.4)
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5)
net-ssh-multi (1.2.1)
net-ssh (>= 2.6.5)
net-ssh-gateway (>= 1.2.0)
net-telnet (0.1.1)
nio4r (1.2.1)
nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2)
octokit (4.2.0)
sawyer (~> 0.6.0, >= 0.5.3)
ohai (7.4.1)
ffi (~> 1.9)
ffi-yajl (~> 1.1)
ipaddress
mime-types (~> 1.16)
mixlib-cli
mixlib-config (~> 2.0)
mixlib-log
mixlib-shellout (~> 1.2)
systemu (~> 2.6.4)
wmi-lite (~> 1.0)
parser (2.3.0.3)
ast (~> 2.2)
plist (3.1.0)
poltergeist (1.9.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
polyglot (0.3.5)
powerpack (0.1.1)
pry (0.10.3)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.6.4)
rack-test (0.6.3)
rack (>= 1.0)
rainbow (2.1.0)
rake (10.5.0)
rest-client (1.6.7)
mime-types (>= 1.16)
retryable (2.0.3)
ridley (4.4.1)
addressable
buff-config (~> 1.0)
buff-extensions (~> 1.0)
buff-ignore (~> 1.1)
buff-shell_out (~> 0.1)
celluloid (~> 0.16.0)
celluloid-io (~> 0.16.1)
erubis
faraday (~> 0.9.0)
hashie (>= 2.0.2, < 4.0.0)
httpclient (~> 2.6)
json (>= 1.7.7)
mixlib-authentication (>= 1.3.0)
retryable (~> 2.0)
semverse (~> 1.1)
varia_model (~> 0.4.0)
rspec (3.4.0)
rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0)
rspec-mocks (~> 3.4.0)
rspec-core (3.4.2)
rspec-support (~> 3.4.0)
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-its (1.2.0)
rspec-core (>= 3.0.0)
rspec-expectations (>= 3.0.0)
rspec-mocks (3.4.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-support (3.4.1)
rubocop (0.37.0)
parser (>= 2.3.0.2, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 0.3)
ruby-progressbar (1.7.5)
rufus-lru (1.0.5)
safe_yaml (1.0.4)
sawyer (0.6.0)
addressable (~> 2.3.5)
faraday (~> 0.8, < 0.10)
semverse (1.2.1)
serverspec (2.29.1)
multi_json
rspec (~> 3.0)
rspec-its
specinfra (~> 2.48)
sfl (2.2)
slop (3.6.0)
solve (2.0.2)
molinillo (~> 0.2.3)
semverse (~> 1.1)
specinfra (2.50.4)
net-scp
net-ssh (>= 2.7, < 3.1)
net-telnet
sfl
systemu (2.6.5)
test-kitchen (1.4.2)
mixlib-shellout (>= 1.2, < 3.0)
net-scp (~> 1.1)
net-ssh (~> 2.7, < 2.10)
safe_yaml (~> 1.0)
thor (~> 0.18)
thor (0.19.0)
timers (4.0.4)
hitimes
treetop (1.6.3)
polyglot (~> 0.3)
unicode-display_width (0.3.1)
varia_model (0.4.1)
buff-extensions (~> 1.0)
hashie (>= 2.0.2, < 4.0.0)
websocket-driver (0.6.3)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
wmi-lite (1.0.0)
xpath (2.0.0)
nokogiri (~> 1.3)
yajl-ruby (1.2.1)
PLATFORMS
ruby
DEPENDENCIES
berkshelf (~> 4.0)
berkshelf-api-client (~> 2.0)
busser
busser-serverspec
chef (~> 11.16)
chef-vault (~> 2.2)
chefspec (~> 4)
foodcritic
infrataster
kitchen-vagrant (>= 0.16)
rubocop
serverspec
test-kitchen (~> 1.2)
thor
BUNDLED WITH
1.11.2
您不想将 chef-11.18.12 与 test-kitchen 和 berkshelf 捆绑在一起。您不需要将 chef 与这些工具捆绑在一起,而且您肯定会 运行 遇到试图将 chef-11 与它们捆绑在一起的问题。
创建包含所有 cli 工具的 Gemfile 的问题在于,这些工具永远不会同时激活整个 gem 集。所以 test-kitchen 不依赖于 chef,而 berkshelf 最近才开始将 chef-config 作为一个库引入。当您尝试创建一个包时,您是在声明每个 gem 必须能够与其他每个 gem 一起加载到相同的 ruby 进程中。即使对于最新的 cli 工具集,这也是经常会被破坏的东西。如果你在 chef-11.18.12 中添加,那么你选择的 gem 具有去年 4 月(大约 9 个月前)冻结的一组 gem 要求,并且很可能是最新的测试-kitchen 和 berkshelf 版本将引入与该版本的 chef 不兼容的 mixlib-shellout 版本。情况变得更糟,因为我们对 mixlib-shellout 进行了重大更改,而 chef-11 永远固定在 mixlib-shellout 的一个旧分支上,该分支没有得到更新,而 test-kitchen 和 berkshelf 已经继续。
这就是 ChefDK 存在的原因,它提供了一组一致的命令行工具,表面上看起来像一个包,但实际上并不是一个包。如果 test-kitchen 或 berkshelf 没有同时将 chef 加载到内存中,那么可以包含那些 gem 的不同版本,它们可能 'conflict' 使用 mixlib-shellout 但会加载到不同的ruby 过程就好了。因为他们从来没有尝试加载到同一个 ruby 进程中,所以 mixlib-shellout 上的 'conflict' 永远不会成为真实的
此外,我们确实尝试注意它们都正确加载在一起,并且我们不会在 ChefDK 中使用多个版本的 mixlib-shellout,但有时这很难避免。
您可能想做的是将所有东西捆绑在一起,因为您想要拥有最新的工具链,但又想使用 chef-11,因为您的产品是 chef-11。但问题在于,当您使用 berkshelf 或 test-kitchen 时,不需要在您启动的 ruby 进程中使用 chef-11。当 TK 启动时,它应该启动一个 virt,然后在那个 virt 上安装 chef 并启动它——你应该确保 virt 有 chef-11 这样你就可以测试你的食谱,而不是你的 TK 过程与厨师 11。无论厨师 gem TK 与什么捆绑在一起,都与其运作方式完全无关。
如果您尝试使用 test-kitchen 测试 chef-11,正确的方法是在 kitchen.yml 文件中将 require_chef_omnibus 配置参数设置为“11.18.12” .这将导致 chef-11 安装在您尝试配置的 virt 上。
+1 关于从安装 ChefDK 而不是尝试捆绑您自己的工具集开始的建议。
甚至建议在您的工作站上使用 chef-12 knife 和 ChefDK 来管理 chef-11 virts/hosts。有一个问题,chefspec 确实在您的工作站上 运行 并且当您的产品是 chef-11 时针对 chef-12 测试 chefspec 可能会导致某些类型的故障未被发现。您可以将 chefspec 与 chef-11 捆绑在一起并以这种方式进行测试——但是,最好坚持与 test-kitchen 进行完全集成测试以发现这些问题,并且只使用 chefspec 作为快速火焰测试(或者不在所有——单元测试和模拟资源集合在概念上都是相当高级的主题)。在您真正遇到并发布 chefspec 之前,最好不要担心您工作站上的 chef 版本,只需使用最新的 chef 版本来制作 knife。
我正在尝试使用 Kitchen/Chef 进行部署。我其实不确定我是否接触过厨房。
我的理解是 gem list
列出存储库中的所有 gem,并且项目从该存储库中获取它想要的任何 gem。
在 运行 gem install bundler
和 gem install berkshelf
之后,我得到了 gem list | grep shellout
.
然后我 运行 bundle install
并根据我的 Gemfile 安装 "mixlib-shellout (1.6.1)"。然后 gem list | grep shellout
.
来自Gemfile.lock,我相信1.6.1 是想要的版本。然后我运行berks install
,抛出异常,是:
Unable to activate chef-11.18.12, because mixlib-shellout-2.2.6 conflicts with mixlib-shellout (~> 1.4) - 11.18.12 - (Gem::LoadError)
我不明白为什么它会尝试获取 2.2.6 而不是 1.6.1。
我的 Gemfile
source 'https://rubygems.org'
group :development do
gem 'berkshelf', '~> 4.0'
gem 'berkshelf-api-client', '~> 2.0'
gem 'thor'
gem 'chef', '~> 11.16'
gem 'test-kitchen', '~> 1.2'
gem 'kitchen-vagrant', '>= 0.16'
gem 'serverspec'
gem 'infrataster'
gem 'busser'
gem 'busser-serverspec'
gem 'chefspec', '~>4'
gem 'rubocop'
gem 'foodcritic'
end
gem 'chef-vault', '~> 2.2'
Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
addressable (2.3.8)
ast (2.2.0)
berkshelf (4.1.0)
addressable (~> 2.3.4)
berkshelf-api-client (~> 2.0)
buff-config (~> 1.0)
buff-extensions (~> 1.0)
buff-shell_out (~> 0.1)
celluloid (= 0.16.0)
celluloid-io (~> 0.16.1)
cleanroom (~> 1.0)
faraday (~> 0.9.0)
httpclient (~> 2.6.0)
minitar (~> 0.5.4)
octokit (~> 4.0)
retryable (~> 2.0)
ridley (~> 4.3)
solve (~> 2.0)
thor (~> 0.19)
berkshelf-api-client (2.0.0)
faraday (~> 0.9.1)
httpclient (~> 2.6.0)
buff-config (1.0.1)
buff-extensions (~> 1.0)
varia_model (~> 0.4)
buff-extensions (1.0.0)
buff-ignore (1.1.1)
buff-ruby_engine (0.1.0)
buff-shell_out (0.2.0)
buff-ruby_engine (~> 0.1.0)
busser (0.7.1)
thor (<= 0.19.0)
busser-serverspec (0.5.9)
busser
capybara (2.6.2)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
celluloid (0.16.0)
timers (~> 4.0.0)
celluloid-io (0.16.2)
celluloid (>= 0.16.0)
nio4r (>= 1.1.0)
chef (11.18.12)
chef-zero (~> 2.2, >= 2.2.1)
diff-lcs (~> 1.2, >= 1.2.4)
erubis (~> 2.7)
ffi-yajl (~> 1.2)
highline (~> 1.6, >= 1.6.9)
mime-types (~> 1.16)
mixlib-authentication (~> 1.3)
mixlib-cli (~> 1.4)
mixlib-config (~> 2.0)
mixlib-log (~> 1.3)
mixlib-shellout (~> 1.4)
net-ssh (~> 2.6)
net-ssh-multi (~> 1.1)
ohai (~> 7.4)
plist (~> 3.1.0)
pry (~> 0.9)
rest-client (>= 1.0.4, <= 1.6.7)
chef-vault (2.7.1)
chef-zero (2.2.1)
ffi-yajl (~> 1.1)
hashie (~> 2.0)
mixlib-log (~> 1.3)
rack
chefspec (4.5.0)
chef (>= 11.14)
fauxhai (~> 3.0, >= 3.0.1)
rspec (~> 3.0)
cleanroom (1.0.0)
cliver (0.3.2)
coderay (1.1.0)
diff-lcs (1.2.5)
erubis (2.7.0)
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
faraday_middleware (0.10.0)
faraday (>= 0.7.4, < 0.10)
fauxhai (3.1.0)
net-ssh
ffi (1.9.10)
ffi-yajl (1.4.0)
ffi (~> 1.5)
libyajl2 (~> 1.2)
foodcritic (6.0.0)
erubis
gherkin (~> 2.11)
nokogiri (>= 1.5, < 2.0)
rake
rufus-lru (~> 1.0)
treetop (~> 1.4)
yajl-ruby (~> 1.1)
gherkin (2.12.2)
multi_json (~> 1.3)
hashie (2.1.2)
highline (1.7.8)
hitimes (1.2.3)
httpclient (2.6.0.1)
infrataster (0.3.2)
capybara
faraday
faraday_middleware (>= 0.10.0)
net-ssh
net-ssh-gateway
poltergeist
rspec (>= 2.0, < 4.0)
thor
ipaddress (0.8.2)
json (1.8.3)
kitchen-vagrant (0.19.0)
test-kitchen (~> 1.4)
libyajl2 (1.2.0)
method_source (0.8.2)
mime-types (1.25.1)
mini_portile2 (2.0.0)
minitar (0.5.4)
mixlib-authentication (1.4.0)
mixlib-log
rspec-core (~> 3.2)
rspec-expectations (~> 3.2)
rspec-mocks (~> 3.2)
mixlib-cli (1.5.0)
mixlib-config (2.2.1)
mixlib-log (1.6.0)
mixlib-shellout (1.6.1)
molinillo (0.2.3)
multi_json (1.11.2)
multipart-post (2.0.0)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-ssh (2.9.4)
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5)
net-ssh-multi (1.2.1)
net-ssh (>= 2.6.5)
net-ssh-gateway (>= 1.2.0)
net-telnet (0.1.1)
nio4r (1.2.1)
nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2)
octokit (4.2.0)
sawyer (~> 0.6.0, >= 0.5.3)
ohai (7.4.1)
ffi (~> 1.9)
ffi-yajl (~> 1.1)
ipaddress
mime-types (~> 1.16)
mixlib-cli
mixlib-config (~> 2.0)
mixlib-log
mixlib-shellout (~> 1.2)
systemu (~> 2.6.4)
wmi-lite (~> 1.0)
parser (2.3.0.3)
ast (~> 2.2)
plist (3.1.0)
poltergeist (1.9.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
multi_json (~> 1.0)
websocket-driver (>= 0.2.0)
polyglot (0.3.5)
powerpack (0.1.1)
pry (0.10.3)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.6.4)
rack-test (0.6.3)
rack (>= 1.0)
rainbow (2.1.0)
rake (10.5.0)
rest-client (1.6.7)
mime-types (>= 1.16)
retryable (2.0.3)
ridley (4.4.1)
addressable
buff-config (~> 1.0)
buff-extensions (~> 1.0)
buff-ignore (~> 1.1)
buff-shell_out (~> 0.1)
celluloid (~> 0.16.0)
celluloid-io (~> 0.16.1)
erubis
faraday (~> 0.9.0)
hashie (>= 2.0.2, < 4.0.0)
httpclient (~> 2.6)
json (>= 1.7.7)
mixlib-authentication (>= 1.3.0)
retryable (~> 2.0)
semverse (~> 1.1)
varia_model (~> 0.4.0)
rspec (3.4.0)
rspec-core (~> 3.4.0)
rspec-expectations (~> 3.4.0)
rspec-mocks (~> 3.4.0)
rspec-core (3.4.2)
rspec-support (~> 3.4.0)
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-its (1.2.0)
rspec-core (>= 3.0.0)
rspec-expectations (>= 3.0.0)
rspec-mocks (3.4.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
rspec-support (3.4.1)
rubocop (0.37.0)
parser (>= 2.3.0.2, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 0.3)
ruby-progressbar (1.7.5)
rufus-lru (1.0.5)
safe_yaml (1.0.4)
sawyer (0.6.0)
addressable (~> 2.3.5)
faraday (~> 0.8, < 0.10)
semverse (1.2.1)
serverspec (2.29.1)
multi_json
rspec (~> 3.0)
rspec-its
specinfra (~> 2.48)
sfl (2.2)
slop (3.6.0)
solve (2.0.2)
molinillo (~> 0.2.3)
semverse (~> 1.1)
specinfra (2.50.4)
net-scp
net-ssh (>= 2.7, < 3.1)
net-telnet
sfl
systemu (2.6.5)
test-kitchen (1.4.2)
mixlib-shellout (>= 1.2, < 3.0)
net-scp (~> 1.1)
net-ssh (~> 2.7, < 2.10)
safe_yaml (~> 1.0)
thor (~> 0.18)
thor (0.19.0)
timers (4.0.4)
hitimes
treetop (1.6.3)
polyglot (~> 0.3)
unicode-display_width (0.3.1)
varia_model (0.4.1)
buff-extensions (~> 1.0)
hashie (>= 2.0.2, < 4.0.0)
websocket-driver (0.6.3)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
wmi-lite (1.0.0)
xpath (2.0.0)
nokogiri (~> 1.3)
yajl-ruby (1.2.1)
PLATFORMS
ruby
DEPENDENCIES
berkshelf (~> 4.0)
berkshelf-api-client (~> 2.0)
busser
busser-serverspec
chef (~> 11.16)
chef-vault (~> 2.2)
chefspec (~> 4)
foodcritic
infrataster
kitchen-vagrant (>= 0.16)
rubocop
serverspec
test-kitchen (~> 1.2)
thor
BUNDLED WITH
1.11.2
您不想将 chef-11.18.12 与 test-kitchen 和 berkshelf 捆绑在一起。您不需要将 chef 与这些工具捆绑在一起,而且您肯定会 运行 遇到试图将 chef-11 与它们捆绑在一起的问题。
创建包含所有 cli 工具的 Gemfile 的问题在于,这些工具永远不会同时激活整个 gem 集。所以 test-kitchen 不依赖于 chef,而 berkshelf 最近才开始将 chef-config 作为一个库引入。当您尝试创建一个包时,您是在声明每个 gem 必须能够与其他每个 gem 一起加载到相同的 ruby 进程中。即使对于最新的 cli 工具集,这也是经常会被破坏的东西。如果你在 chef-11.18.12 中添加,那么你选择的 gem 具有去年 4 月(大约 9 个月前)冻结的一组 gem 要求,并且很可能是最新的测试-kitchen 和 berkshelf 版本将引入与该版本的 chef 不兼容的 mixlib-shellout 版本。情况变得更糟,因为我们对 mixlib-shellout 进行了重大更改,而 chef-11 永远固定在 mixlib-shellout 的一个旧分支上,该分支没有得到更新,而 test-kitchen 和 berkshelf 已经继续。
这就是 ChefDK 存在的原因,它提供了一组一致的命令行工具,表面上看起来像一个包,但实际上并不是一个包。如果 test-kitchen 或 berkshelf 没有同时将 chef 加载到内存中,那么可以包含那些 gem 的不同版本,它们可能 'conflict' 使用 mixlib-shellout 但会加载到不同的ruby 过程就好了。因为他们从来没有尝试加载到同一个 ruby 进程中,所以 mixlib-shellout 上的 'conflict' 永远不会成为真实的
此外,我们确实尝试注意它们都正确加载在一起,并且我们不会在 ChefDK 中使用多个版本的 mixlib-shellout,但有时这很难避免。
您可能想做的是将所有东西捆绑在一起,因为您想要拥有最新的工具链,但又想使用 chef-11,因为您的产品是 chef-11。但问题在于,当您使用 berkshelf 或 test-kitchen 时,不需要在您启动的 ruby 进程中使用 chef-11。当 TK 启动时,它应该启动一个 virt,然后在那个 virt 上安装 chef 并启动它——你应该确保 virt 有 chef-11 这样你就可以测试你的食谱,而不是你的 TK 过程与厨师 11。无论厨师 gem TK 与什么捆绑在一起,都与其运作方式完全无关。
如果您尝试使用 test-kitchen 测试 chef-11,正确的方法是在 kitchen.yml 文件中将 require_chef_omnibus 配置参数设置为“11.18.12” .这将导致 chef-11 安装在您尝试配置的 virt 上。
+1 关于从安装 ChefDK 而不是尝试捆绑您自己的工具集开始的建议。
甚至建议在您的工作站上使用 chef-12 knife 和 ChefDK 来管理 chef-11 virts/hosts。有一个问题,chefspec 确实在您的工作站上 运行 并且当您的产品是 chef-11 时针对 chef-12 测试 chefspec 可能会导致某些类型的故障未被发现。您可以将 chefspec 与 chef-11 捆绑在一起并以这种方式进行测试——但是,最好坚持与 test-kitchen 进行完全集成测试以发现这些问题,并且只使用 chefspec 作为快速火焰测试(或者不在所有——单元测试和模拟资源集合在概念上都是相当高级的主题)。在您真正遇到并发布 chefspec 之前,最好不要担心您工作站上的 chef 版本,只需使用最新的 chef 版本来制作 knife。