ククログ

株式会社クリアコード > ククログ > Serverspec(Specinfra)でWindows向けに不足している機能を追加するには

Serverspec(Specinfra)でWindows向けに不足している機能を追加するには

はじめに

クリアコードでは、Fluentdの開発に参加しています。Fluentdにはtd-agentと呼ばれるディストリビューションがあり、各種プラグインをまとめてパッケージやインストーラーが提供されています。

今回は、td-agentのテストに使っているServerspec(Specinfra)で、Windows向けのテストに不足している機能を一部追加する機会があったのでその紹介をします。

機能不足に気づいたきっかけ

td-agentでは、ビルドしたパッケージの動作を確認するために、Serverspec(Specinfra)によるテストを実行するようにしています。 Windowsのインストーラーにバンドルしているgemが期待通りインストールされているかをテストしようとしたところ、以下のエラーが発生することに気づきました。1

check_is_installed_by_gem is not implemented in Specinfra::Command::Windows::Base::Package

これは、以下のようなテストコードで発生していました。特定のgemの指定したバージョンのものがインストールされていることを確認するテストです。

describe package("#{spec.name}") do
  it { should be_installed.by("gem").with_version(spec.version) }
end

エラーメッセージから明らかなように、特定のgemがインストールされているかどうかをチェックする機能がまだWindowsではサポートされていないことがわかりました。

Specinfraにcheck_is_installed_by_gemを追加する

Windowsでも同じコードでバンドルしているgemのチェックができると嬉しいので、不足している機能を追加することにしました。

必要なのは、前述のエラーメッセージが示すように、Specinfra::Command::Windows::Base::Packagecheck_is_installed_by_gem を実装してあげることです。

def check_is_installed_by_gem(name, version=nil, gem_binary="gem")
  version_selection = version.nil? ? "" : "-gemVersion '#{version}'"
  Backend::PowerShell::Command.new do
    using 'find_installed_gem.ps1'
    exec "(FindInstalledGem -gemName '#{name}' #{version_selection}) -eq $true"
  end
end

gemの名前とバージョンを受け取り、比較して一致するか否かを返す FindInstalledGemfind_installed_gem.ps1に実装し、lib/specinfra/backend/powershell/support/find_installed_gem.ps1 として配置することで実現しました。

実際のPull RequestはWindows: support check_is_installed_by_gemです。

まとめ

今回は、Serverspec(Specinfra)の未実装の機能を追加して、Windowsでも他の環境同様に it { should be_installed.by("gem") } という記述で指定したgemがインストールされていることを確認できるようにフィードバックした話を紹介しました。

当社では、お客さまからの技術的なご質問・ご依頼に有償にて対応するFluentdサポートサービスを提供しています。Fluentd/Fluent Bitをエンタープライズ環境において導入/運用されるSIer様、サービス提供事業者様は、お問い合わせフォームよりお問い合わせください。

  1. td-agentはWindowsのインストーラに環境に合わせてWindows向けのgemをバンドルするようにしています。