かまたま日記3

プログラミングメイン、たまに日常

serverspecで特定のパッケージマネージャにパッケージがインストールされているかをテストする

serverspecで特定のパッケージマネージャ(たとえばgem)にパッケージがインストールされてるかどうかをチェックする場合、以下のように書きます。

describe package('bundler') do
  it { should be_installed.by('gem') }
end

ただし、defaultで対応しているのはここに定義されているマネージャのみで、それ以外のマネージャに対応するためには以下のように新たにcheck_is_installed_by_xxxメソッドを定義してあげる必要があります。今回の自分のケースだとfluent-gemでのインストールをチェックしたかったので、check_is_installed_by_gemメソッドを丸っと使わせてもらいました。

class Specinfra::Command::Base::Package
  class << self
    def check_is_installed_by_fluent_gem(name, version=nil)
      regexp = "^#{name}"
      cmd = "/opt/td-agent/embedded/bin/fluent-gem list --local | grep -iw -- #{escape(regexp)}"
      cmd = %Q!#{cmd} | grep -w -- "[( ]#{escape(version)}[,)]"! if version
      cmd
    end
  end
end

これで以下の記述を使うことが出来ます。

describe package('fluent-plugin-hogehoge') do
  it { should be_installed.by('fluent_gem') }
end