私が管理しているサーバー上で動く、管理用のツールだったりバッチ処理だったりがいくつかあります。
課題
Rubyで書きたい
Ruby on Rails で開発しているチームで運用しているサーバーなので、おのずとそういったツールも Ruby で作られる事が多いです。1
処理にもよりますが、シェルスクリプトではなく慣れている Ruby で書きたいのです。
Rubyのインストールが必要
Rubyで書きたいとなるとサーバーに Ruby のインストールが必要になります。
Ruby on Railsのアプリが稼働しているサーバーなら、当然 Ruby もインストールされているのですが、そうでないサーバーもあります。OS のパッケージマネージャーで入る Ruby は古いことも多いので rbenv など使ってインストールすることになります。2
シェルスクリプトのツールを使う場合と比べるとインストール直後のサーバーで動く場合も多く、rubyスクリプトでツール運用はやはり手間が増えることになります。3
mruby-cli
mruby-cliとは、mrubyでワンバイナリなコマンドラインラインツールを作るために色々やってくれるツールです。
複数プラットフォーム向けにビルドが可能で、クロスコンパイル環境についてもDockerにて用意されています。Docker for MacをインストールしたMacとmruby-cliがあればMac上だけで、LinuxやWindowsのバイナリをビルド可能になります。
mruby-cli自体がmruby-cliで出来ているので、自分の環境用のバイナリを落としてくればすぐに動きます。
ここからダウンロードしましょう。https://github.com/hone/mruby-cli/releases
開発手順
- mruby-cliコマンドにてプロジェクトの雛形作成
- 利用するmgemや、ビルド対象プラットフォーム設定
- コーディング
- ローカルでビルド
- 完成したら対象プラットフォーム用にビルド
- 出来上がったバイナリを、対象サーバーに置く
実用してみた
上記の開発手順に従って、今回はファイルをS3へ転送するバッチ処理を移植しました。元のツールは ruby2.3.1 で書かれていたものです。
mgemも中々充実していて、ライブラリの機能を呼ぶだけで実装が可能でした。
ただ、ruby と mruby は完全な互換はありませんし、利用したライブラリも、rubyのgemと同じ訳ではないので移植にあたって書き換えは発生しました。
スクリプト自体は、業務で使っているものなので公開出来ませんが、利用した mgem は以下のものです。
- iij/mruby-io
- iij/mruby-dir
- iij/mruby-aws-s3
- iij/mruby-env
- mattn/mruby-onig-regexp
- gromnitsky/mruby-fileutils-simple
それぞれの mgem を見たいただければ分かるのですが、mrubyはファイルシステムが無いような環境も想定されているので、標準ではIOが無かったりします。
それらの機能について、rubyと互換が出るように mgem としてライブラリが作られています。結構な数のライブラリが作られているので、かなり便利にコードを書いていけます。
まとめ
組み込み用という紹介のされ方が多い mruby ですが、mruby-cliのお陰でワンバイナリコマンドラインツールの作成にも使え、組み込み以外にも用途があることがわかりました。
私のように、普通のアプリケーションを書く人が増えて、ライブラリも増えていくといいなと思いますので、組み込み関連は触らない人でも mruby 試してみてはどうでしょうか。