Альтернативные драйверы с тестовой кухней
Многие кулинарные книги, такие как 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
- что-то другое
Похоже, что должен быть более чистый подход к использованию альтернативного файла конфигурации, который заменит грубую силу по умолчанию.
Спасибо
Ответы
Ответ 1
В кухне предусмотрены три переменные среды для контроля, где он ищет каждый из возможных файлов конфигурации. Чтобы сделать поведение по умолчанию явным, вы можете установить их следующим образом:
KITCHEN_YAML="./.kitchen.yml"
KITCHEN_LOCAL_YAML="./.kitchen.local.yml"
KITCHEN_GLOBAL_YAML="$HOME/.kitchen/config.yml"
Вам не нужно переопределять все из них, поэтому вы можете запустить тестовую кухню с помощью .kitchen-cloud.yml
так:
$ KITCHEN_YAML=".kitchen-cloud.yml" kitchen test
Ответ 2
... для добавления в 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: {
}
Таким образом, вы поддерживаете один файл и избегаете расходящихся тестов платформы (изменяя один файл и забывая в другом). Существуют также случаи, когда параметры, представленные в .kitchen.local.yml, могут быть конфликтующими с параметрами в .kitchen.yml.
Ответ 3
В дополнение к тому, что сказал zts, помните, что вы можете использовать ERb в кухонных файлах, поэтому ваша конфигурация драйвера может выглядеть так:
driver:
name: <%= ENV['KITCHEN_DRIVER'] || 'vagrant' %>
Ответ 4
Я нашел этот вопрос, ища решение для поддержки нескольких драйверов с одним файлом в кухне, и ответ Ives был очень полезен. Я адаптировал его, чтобы сделать следующее.
- По умолчанию бродячий драйвер
- Разрешить пользователю переопределять параметр драйвера с помощью переменной среды 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 %>