替代司机与测试厨房

Tej*_*don 18 chef-infra test-kitchen

许多烹饪书,例如mysql cookbook都有多个.kitchen.yml文件.例如,mysql有一个.kitchen.yml和一个.kitchen-cloud.yml.看文档和代码测试的厨房,我看不到任何方式使用比其他配置文件.kitchen.yml,.kitchen.local.yml以及~/.kitchen/config.yml.如果我想使用mysql菜谱中的云驱动程序,我会:

  • cp .kitchen-cloud.yml .kitchen.yml
  • cp .kitchen-cloud.yml .kitchen.local.yml
  • 别的什么?

似乎应该有一个更清洁的方法来使用替代配置文件,强制替换默认配置文件.

谢谢

zts*_*zts 27

Kitchen提供了三个环境变量来控制每个可能的配置文件的查找位置.要使默认行为显式,您可以按如下方式设置它们:

KITCHEN_YAML="./.kitchen.yml"
KITCHEN_LOCAL_YAML="./.kitchen.local.yml"
KITCHEN_GLOBAL_YAML="$HOME/.kitchen/config.yml"
Run Code Online (Sandbox Code Playgroud)

你不需要覆盖所有这些,所以你可以用你.kitchen-cloud.yml喜欢的方式运行test-kitchen :

$ KITCHEN_YAML=".kitchen-cloud.yml" kitchen test
Run Code Online (Sandbox Code Playgroud)


ive*_*ves 12

...要添加到coderanger,如果要根据CI工具是否设置环境变量来选择驱动程序或选项,还可以执行以下操作:


---
<%
  #--------------------------------------------------------------------------
  # the driver_plugin can be overridden with an environment variable:
  #   $ KITCHEN_DRIVER=docker kitchen test
  # if not specified, defaults are used...
  #   - kitchen_driver_ci if environment variable CI=true or TRAVIS=true are present
  #   - kitchen_driver_local is used otherwise (which defaults to vagrant)
  #--------------------------------------------------------------------------

  kitchen_driver_ci = 'ec2'
  kitchen_driver_local = 'vagrant'
  kitchen_driver_default = kitchen_driver_local

  if ENV['KITCHEN_DRIVER']
    kitchen_driver = ENV['KITCHEN_DRIVER']
  elsif ENV['TRAVIS']=="true"
    kitchen_driver = kitchen_driver_ci
  elsif ENV['CI']=="true"
    kitchen_driver = kitchen_driver_ci
  else
    kitchen_driver = kitchen_driver_default
  end
  puts "-----> driver_plugin: #{kitchen_driver.to_s}"    
%>

driver_plugin: <%= kitchen_driver %>
driver_config:
  require_chef_omnibus: 11.10.4
  <% if kitchen_driver == 'ec2' %>
  aws_access_key_id:      <%= ENV['AWS_ACCESS_KEY_ID'] %>
  aws_secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  aws_ssh_key_id:         <%= ENV['AWS_SSH_KEY_ID']         || "test-kitchen" %>
  ssh_key:                <%= ENV['AWS_SSH_KEY_FILE']       || "./test-kitchen.pem" %>
  region:                 <%= ENV['AWS_REGION']             || "us-east-1" %>
  availability_zone:      <%= ENV['AWS_AVAILABILITY_ZONE']  || "us-east-1c" %>
  flavor_id: "t2.small"
  groups: ["test-kitchen"]
  <% end %>
  <% if kitchen_driver == 'vagrant' %>
  customize:
    memory: 2048
  <% end %>

platforms:
- name: ubuntu-14.04
  <% if kitchen_driver == 'ec2' %>
  driver_config:
    image_id: ami-6ab2a702
    username: ubuntu
    tags: { "Name": "Test Kitchen" }
  <% end %>

busser:
  sudo: true

suites:
- name: default
  run_list: [
  ]
  attributes: {
  }
Run Code Online (Sandbox Code Playgroud)

这样,您可以维护单个文件并避免不同的平台测试(在一个文件中进行更改而在另一个文件中进行更改).还有一些情况,.kitchen.local.yml中提供的选项可能与.kitchen.yml中的选项冲突.


cod*_*ger 8

除了zts所说的,记住你可以在厨房文件中使用ERb,所以你的驱动程序配置可能如下所示:

driver:
  name: <%= ENV['KITCHEN_DRIVER'] || 'vagrant' %>
Run Code Online (Sandbox Code Playgroud)


小智 5

我在寻找一种使用一个厨房文件支持多个驱动程序的解决方案时发现了这个问题,艾夫斯的回答非常有帮助。我对其进行了调整以执行以下操作。

  • 默认为 vagrant 驱动程序
  • 允许用户使用 KITCHEN_DRIVER 环境变量覆盖驱动程序设置
  • 如果已安装,请选择 docker_ssh 驱动程序。
---
<%
require 'rubygems'
kitchen_driver = 'vagrant'

if ENV['KITCHEN_DRIVER']
    kitchen_driver = ENV['KITCHEN_DRIVER']
elsif Gem::Specification::find_all_by_name('kitchen-docker_ssh').any?
    kitchen_driver = 'docker_ssh'
end
%>

driver:
  name: <%= kitchen_driver %>
Run Code Online (Sandbox Code Playgroud)