酷い夢で夜中に目が覚めたら、なにか無性に書きたくなったので書いてみたという酷いエントリーです。しかもあんまり技術的詳細を書くつもりもなく、Qiita に書くのが申し訳ないくらいの内容になるかもしれません。
何を書きたいかまでたどり着くのに少々前置きがあります。今日ようやくあの「リーダブルコード」を読破。一週間で読み終えましたが、読めば読むほどコードを書き直したくて書き直したくて。しかしすでに救いようのないアンリーダブルな自分のコードを読むのが恥ずかしくて、他人さまのコードを書き換えることにしました。良い仕事したなあ。
そのコードがたまたま ksh だっので bash にポーティングしたり楽しく弄らせて頂いたわけですが、変更箇所が多くなってきたのでテストも追加したくなってしまったわけです。そこで(これまで何度もググったけど) bash TDD とかで検索したら bats に出会ってしまったのです。衝撃の出会いというよりは「やっぱあるよねー」というくらいでしたが、でも使ってみたら素晴らしいツールだったので即採用。もくもくと(他人の)リファクタリングを楽しんでました。
そんな事をしてるうちにふと、「あれ?これサーバのテストに使えるんじゃ?」というあざとい考えが浮かんできたのであります。社内でこれまで数年間サーバの正常系テスト普及にトライしてきたのですがうまくいっておらず、もしかしたらこれはイケるかもしれないと期待しています。なぜ普及出来なかったか Bad practice としてちょっと歴史を振り返ってみると・・・
- RSpecに出会いTDDを知る
- サーバに使って Test Driven Installation みたいなのやりたいと思いシェルスクリプトで作って社内に展開
- メンテナが自分しかおらず多忙につき挫折
- 年月が経ち serverspec が出現
- 早速社内に展開
- Rubyを誰も知らず挫折
- ansible が出現
- Excelのシステム設計書から ansible, cucumber+serverspec を自動生成するツールを開発
- 社内からの期待大!
- メンテナが自分しかおらず多忙につき挫折
- bats に出会う ← new!
てな具合で足掛け6年くらい悶々としてきたわけですが、悲しいことにまだ成功には至っていません。
serverspec は非常に優れたソフトウェアであり是非とも弊社で使いたいのですが、残念ながらいまの状況では学習コストが高く厳しい。さらに SuSE が多いのでインストールのナレッジも世の中に少なく、セットアップすら一大事なので誰もやりたがらないという状況です。
いま bats にすごく期待してるのは学習コストの低さです。普段使ってるコマンドをそのまま使えるので、普及させるにあたって説明すら必要ないのではないかと。具体的に serverspec と比べるとこんな感じです。
describe service("httpd") do
it should_be enabled
end
@test "You guys, service httpd must be enabled." {
chkconfig httpd
}
serverspec は直感的に読みやすく大変わかりやすい反面、文法やメソッドを覚える必要があります。対して bats は自由に書けすぎて厳密ではなく読みにくいですが、UNIXコマンドに慣れた人ならすぐ書けそうです。
使い勝手として重要な問題がありました。リモートサーバへの対応です。serverspec は最初から ssh に対応してるので問題ありません。bats は bash スクリプトと同様に書けるので、grep node* /etc/hosts | cut -f1 -d" " | xargs -l -I{} ssh {} chkconfig httpd
(xargsはfalseを返さないかも)とか書けそうですが、明らかにリーダブルじゃない!
などなどしばし悩んだ結果、pdcp + pdsh + dshbak で実行すりゃいいじゃんと割り切ってしまいこの問題も解決。なんだかイケそう!と相成りました。
あとは社内展開。次こそは挫折したくないなぁ。大丈夫かなぁ。。。あぁ、その前にインストールテストしないと。
ではこの辺で。