Serverspec неправильно проверяет версию пакета

У меня проблема с serverspec. Я пытаюсь проверить установленную версию пакета на Ubuntu.

Я использую этот код:

describe 'java packages' do
  it 'package openjdk-9-jre should be installed with the correct version' do
    expect(package('openjdk-9-jre')).to be_installed.with_version('9~b114-0ubuntu1')
  end
end

Serverspec запускает команду dpkg-query для проверки пакета, но экранирует символ тильды, и это не работает. спецификация сервера работает:

dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre | grep -E '^(install|hold) ok installed 9\\~b114-0ubuntu1$'

вместо

dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre | grep -E '^(install|hold) ok installed 9~b114-0ubuntu1$'

Как я могу решить эту проблему?


person esio    schedule 23.02.2017    source источник


Ответы (1)


Проблема здесь: https://github.com/mizzy/specinfra/blob/92ccc19714ead956589127c40e3cd65faf38cb8b/lib/specinfra/command/debian/base/package.rb#L6.

Specinfra экранирует символы в цепочке with_version как #{Regexp.escape(escape(version))} вместо #{Regexp.escape(version)). Это потребует PR для Specinfra для исправления из-за политики участия Specinfra/Serverspec. Я могу внести это в свой список дел и уведомить вас, когда закончу, так как я держу актуальный форк Specinfra и являюсь участником обоих, поэтому я знаю кодовую базу.

Тем временем вам придется использовать обходной путь command matcher.

describe 'java packages' do
  it 'package openjdk-9-jre should be installed with the correct version' do
    describe command("dpkg-query -f '${Status} ${Version}' -W openjdk-9-jre") do
      its(:stdout) { is_expected.to match('^(install|hold) ok installed 9\~b114\-0ubuntu1$') }
    end
  end
end

PR Specinfra: https://github.com/mizzy/specinfra/pull/608

person Matt Schuchard    schedule 23.02.2017
comment
Хорошо, спасибо. Будет здорово, если это будет исправлено. :) - person esio; 23.02.2017
comment
Похоже, это было исправлено в github.com/mizzy/serverspec/pull/316/files. в ServerSpec и, похоже, у меня работает. Не уверен, можно ли сделать >= или он поддерживает только › или ‹. - person dragon788; 12.10.2017
comment
@ dragon788 Обратите внимание на ссылку в ответе на PR, где я это исправил. - person Matt Schuchard; 12.10.2017
comment
Ага, я знал, что где-то это видел! Он также работает с cmp в InSpec. Жаль, что нечеткие версии еще не полностью поддерживаются во всех ресурсах пакета Chef. - person dragon788; 12.10.2017