2015-07-23 4 views
0

Я продолжаю получать бит от досадной gotcha, которая происходит, когда разработчики Windows проверяют кулинарные книги из моего Git repo with Git's autocrlf set to true. Когда они запускают vagrant up для вывода виртуальной машины Linux, файлы cookbook отображаются в виртуальную машину с завершающими концами CRLF, что не приводит к концы неясных ошибок, когда оболочка и другие утилиты POSIX пытаются работать с шаблоном (теперь недействительным) файлы, которые были скопированы в виртуальную машину.Имейте Vagrant + Chef бежать, если файлы шаблонов были выписаны с окончанием строки CRLF

Исправить это достаточно просто: повторно клонировать хранилище после изменения autocrlf на input или false.

Моя проблема заключается в том, что, когда у вас неправильные окончания строк, единственными симптомами являются ошибки в странных местах, которые никоим образом не указывают на проблему с окончанием строки.

Как я могу проверить шеф-повар за неправильными окончаниями строк, скажем, в файлах шаблонов поваренной книги и выбросить ошибку, если она найдет ее? Я думаю, что простой фрагмент Ruby, который выполняет утверждение на концах строки в заданном файле, который я могу разместить в верхней части рецепта, будет работать.

Примечание: в данном случае моей репо, последовательность шагов:

  1. Разработчик проверяет Repo
  2. Разработчик работает vagrant up
  3. Vagrant стартует Chef запуска в виртуальной машине
  4. Наконец, сценарий построения репо находится в виртуальной машине

† Или действительно что-либо еще, включенное в t он репо

ответ

0

Вот рубин фрагмент кода, который вы можете поместить в любой рецепт шеф-повара:

def cookbook_supporting_files(*cookbooks) 
    cookbooks = cookbooks.map {|name| run_context.cookbook_collection[name]} 

    cookbooks.flat_map do |cb| 
    (cb.manifest[:files] + cb.manifest[:templates]) \ 
     .map {|f| ::File.join(cb.root_dir, f['path']) } 
    end 
end 

def dos_eol?(f) 
    ::File.open(f, 'rb').read(4096).include? "\r\n" 
end 

cookbook_supporting_files(cookbook_name).each do |f| 
    if dos_eol? f 
    raise "Cookbook template '#{f}' contains CRLF line endings" 
    end 
end 

Это будет проверять окончаний линии поваренной файлов и шаблонов, которые существуют в любой кулинарной выше фрагмент кода помещается в

.

Если вы хотите иметь ту же проверку сниппает другие кулинарные книги, просто заменить:

cookbook_supporting_files(cookbook_name) 

с перечнем кулинарных книг, которые вы хотите проверить:

cookbook_supporting_files('some_cookbook', 'another_cookbook') 
2

Rubocop может использоваться для обеспечения исполнения unix style line endings (среди many other things).

Например (из командной строки, в гостевой):

gem install rubocop 
rubocop --only Style/EndOfLine # only check line endings 

Или это может быть сделано в рамках контекста самого шеф-повара что-то вроде следующего рецепта:

chef_gem 'rubocop' 

ruby_block 'check line endings' do 
    block do 
    # It's probably better to call rubo cop code directly, rather than 
    # shelling out, but that can be an exercise for the reader ;-) 
    rubocop_cmd = Mixlib::ShellOut.new(
     'rubocop --only Style/EndOfLine', 
     :cwd => 'dir_to_check' 
    ) 
    rubocop_cmd.run_command 

    # Raise an exception if it didn't exit with 0. 
    rubocop_cmd.error! 
    end 
end 

Неперехваченное исключение заставит шеф-повара побежать.

+0

+1 Хороший ответ.В моем случае я не уверен, что могу применить это, поскольку локальные скрипты сборки запускаются на виртуальной машине только после того, как произошел прогон Chef. Извините за то, что вы не включили все детали в вопрос изначально. –

+0

Работает ли он в контексте шеф-повара или нет, например. после, на самом деле не имеет значения. До тех пор, пока у вас есть рубин/комплект поставки, вышеуказанное будет работать. –

+0

Сказав это, я бы рекомендовал запустить что-то вроде этого * до того, как * окончание строк DOS приведет его к главной ветке (или что-то еще) в scm. Иначе это будет просто шум. –

 Смежные вопросы

  • Нет связанных вопросов^_^