Serverspec で rbenv と Ruby のインストールをテスト

スポンサーリンク

Chef で rbenv で ruby をインストールするための Cookbook を以前作成したのですが、それに対する Serverspec テストを書きました。以下の Chef Cookbook に対応するテスト。

Chefでrbenvとruby-buildをインストール | EasyRamble

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

※ 2014/08/06 serverspec で sudo なしでコマンドを実行する方法について追記しました。全てのリソースで “let(:disable_sudo) { true }” や “:sudo => false” のオプションを付けるなどの方法で、sudo なしでコマンドを実行できるそうです。

rbenv, ruby が正しくインストールされているか確認する serverspec コード

以下をチェックしています。

1. /usr/local/rbenv/bin/rbenv に rbenv がインストールされていること
2. /etc/profile.d/rbenv.sh が正しく作成されていること
3. rbenv のプラグインとして ruby-build がインストールされていること
4. 目的のバージョンの Ruby が正しくインストールされていること
5. Ruby 2.1.2 が global として設定されていること

spec/centos.vagrant/app_rbenv_spec.rb

/etc/profiled.d/rbenv.sh の中身は以下。

/etc/profiled.d/rbenv.sh

テスト実行。

ちゃんとテストは全て通過。

rbenv コマンドを使う箇所ではまった

実は最初、rbenv コマンドを使う処理の部分で、以下のように書いていてはまりました。

この書き方だと何回テストを繰り返してもテストは失敗し続けました。vagrant に ssh で入って確認すると、ちゃんと設定通り rbenv, ruby がインストールされていたのですが。

原因は sudo rbenv global で rbenv コマンドの PATH が追加されないため

しばらく serverspec のテスト結果を見ていて気付いたのですが、serverspec の場合、デフォルトでは sudo でコマンドが実行されますので、この書き方のテストで実際に実行されるコマンドは各々以下のようになります。

serverspec のテスト終了後のログ。

これら sudo が付いたコマンドを実際に vagrant にログイン後に実行すると、やはりエラーになることに気付きました。

どうやら sudo 経由だと、/etc/profiled.d/rbenv.sh で追加するはずの PATH(/usr/local/rbenv/bin)が引き継がれず、エラーになる模様です。

【追記 2014/08/06】
ということで、command リソースで sudo なしで rbenv コマンドを実行させるようにします。

コメントで教えて頂きましたが、”let(:disable_sudo) { true }” や “:sudo => false” のオプションを使うと、一時的に sudo なしでコマンドを実行できるそうです。mizzy さんありがとうございました!command リソースを含め全てのリソースで利用できるそうです。

Serverspec – Advanced Tips の下の方の見出し、How to control sudo に書いてあります。一時的ではなく、デフォルトで sudo なしにする方法なども掲載されています。

修正前、当初の command リソースを使うテストコード。rbenv コマンドを実行する command リソースで、env コマンドで PATH を追加していました。これも一応動くのですが、見た目がちょっとよろしくない感じです。

修正後のコード。command リソースに let(:disable_sudo) { true } を追加して、sudo なしで rbenv コマンドを使うように修正。

この場合も、明示的に source コマンドで /etc/profile.d/rbenv.sh を読み込む必要があるみたいです。これで無事に sudo なしでコマンドを実行できテストもパスしました。テストコードもすっきりして良い感じです。

ちなみに sudo source は、source コマンドが bash のコマンドなのでエラーになる。なので、sudo なしで command リソースが実行されるように let(:disable_sudo) { true } を追加する必要があります。

bash – sudo: source: command not found – Ask Ubuntu
【追記ここまで】

※ 以降は追記する前の文ですので、読まなくて構いません。

一般ユーザーで sudo なしで Serverspec の command リソースを実行する方法も模索したのですが、結局やり方が分かりませんでした。なので、以下のように env コマンドで PATH を追加した後に、rbenv コマンドを使うように対応しました。

>/dev/null 2>&1 してるのは、env コマンドを出力させないため。だいぶださい感じになっちゃってますけど、とりあえずこれでテストは全てOKとなった。

Serverspec を書き進めるにつれて、色々と自分で書いた Cookbook Recipe のボロが出てきています… 良いことです!

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
 
スポンサーリンク
  • 4件のコメント
  • mizzy

    sudoしないやり方はこのページの下の方にありますよ。
    http://serverspec.org/advanced_tips.html

    • taka

      大変助かりました。ありがとうございます!修正を追記しました。

  • mizzy

    commandリソースだけじゃなく、全部のリソースにあてはまります。

    • taka

      ありがとうございます。再度修正しました。

Leave Your Message!