我有一个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命令来检查软件包,但转义tilda字符,它不起作用。 serverspec运行:
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$'
我该如何解决这个问题?
问题在这里: https : //github.com/mizzy/specinfra/blob/92ccc19714ead956589127c40e3cd65faf38cb8b/lib/specinfra/command/debian/base/package.rb#L6 。
Specinfra正在使用#{Regexp.escape(escape(version))}
而不是#{Regexp.escape(version))
来转义with_version
链中的字符。 由于Specinfra / serverspec的贡献政策,这将需要PR到Specinfra进行修复。 我可以把它放在我要做的事情列表上,并在完成后通知您,因为我保留了最新的Specinfra分支,并且是两者的贡献者,所以我知道代码库。
同时,你将不得不做一个command
匹配器的解决方法。
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
Specinfra PR: https : //github.com/mizzy/specinfra/pull/608