hatenob

プログラムって分からないことだらけ

ServerUnitというのを作ってみた

作ろうと思った経緯

昨今、DevOpsの旗印のもと様々なツールが登場しておりますが、その1つにserverspecというサーバ状態をテストするためのツールがあります。
Serverspec - Home

僕の中で、このテストツールはインフラテストにプログラムコードを持ち込んだ点で画期的でした。
シェル等でこちょこちょやっていたなんちゃってテストツールに比して、プログラマからしても使いやすく再利用しやすいものです。
すぐにでも使いたいのですが、実装言語および実行環境はRubyになります。
Rubyに慣れているチームであれば気にならないのですが、Javaで開発をしている人からするとJavaで書いてJUnitMavenでやりたくなるのが人情ってもんです。

ところが、Google先生に問い合わせてもJavaで同じようなことができそうなものってのはなかなか見つかりませんでした。
なので自分で書いてみることにしました。

どんなものを作ろうか

serverspecのソースを見ると、つまるところOSコマンドを叩いてるようです。
なので叩いているOSコマンドさえ同じであれば、実質同じ品質でテストができるということ(にしておく)になります。

一方使い方としては、自分の作業環境に照らし合わせて、WindowsクライアントからLinuxサーバに対してテストできることを最初の目標にします。

コマンド叩いて、実行結果をassertThatで検証するような形を想定します。

どんなのができたか

コードはこちら。

nobrooklyn/serverunit · GitHub

使い方はREADMEに書いた通りです。
肝心のコマンド群はまだほとんど未実装です。

あと、Linuxの、しかもRedhat系しか実装してません。テストはVagrant上のCentOS 6.5でやってます。つまり、Redhatでも5や7は怪しいってことです。

また、Mavenリポジトリに登録とかもしてないので、jarをダウンロードして使ってください、という感じです。

やってみてどうだったか

APIの設計って難しい。
自分が馴染む形と、使い手が馴染む形とでどうするか。
今どきは少しでも記述量が少なくなるように設計するのが妥当なんだろうけれどねぇ。

今後どうするか

半分勉強がてら作ったものなので、拡張するかどうかは気分次第です。
時間があればコマンドをちまちま付け足していこうと思います。
手伝いたいという方はPull Requestとか送ってもらえばいいんだと思います。

APIは試行錯誤した末、一周回った感じで今の形になってますが、どことなくイマイチな感じもしています。
serverspecのようなDSLチックになっていなくて、昔からのJavaっぽい書き方になるからだと思います。
こっちのほうが古参のJavaプログラマにも馴染むかなと思って今のところはそうしていますが、見直すかも。

テストコードでディストリビューションを意識しなくてよいようにしたいのだけれど、そこはまだノーアイデア

まだSNAPSHOTバージョンなので、今後予告なく変更する可能性があります。
まぁその辺は万が一にも自分以外のユーザができたら検討することにします。