mod_mrubyでmrubyのビルドサーバを書いた

build_config.rbをそのままPOSTすると、mrubyの静的ライブラリを返してくれるサーバを書きました。

なにが嬉しいかといえば、ローカルにCRuby等を用意しなくても、以下を実行してlibmruby.aをコロッと作れるので、 開発環境に1台このビルドサーバを置いておけば、任意の場所からおもむろにmrubyを生成することができるのです。 あとは、これをGoに組み込んだりして遊ぶんです。

$ curl -d "`cat /path/to/build_config.rb`" -o libmruby.a http://hostname:8080/mruby-build

github.com

インストール&コンテナ起動

これは、setup.shを実行するだけです。

#!/bin/bash

git clone https://github.com/matsumoto-r/mod_mruby
cp -p ./Dockerfile mod_mruby
cp -p ./mruby-build.rb mod_mruby/docker/hook
cp -p ./mruby.conf mod_mruby/docker/conf

cd mod_mruby

docker build -t local/mruby-build-server .
docker run -d -p 8080:80 local/mruby-build-server 

まずmod_mruby本体をcloneしてきています。

このままmod_mrubyの手順にしたがってdocker buildすると、サンプルのapache設定ファイルとフックに渡すmrubyスクリプトを使ったDockerイメージが出来上がります。

ですが、ここでは、この2つをそれぞれ用意したmruby.conf, mruby-build.rbで置き換えしています。また、 Dockerfileも自前のもので置換しています。

置換したDockerfileについては、mod_mrubyオリジナルのものに、以下を追記したものになります。

# clone mruby 
RUN cd /var/www/html; git clone https://github.com/mruby/mruby
RUN chown -R www-data:www-data /var/www/html/mruby

# create the module directory and add files 
RUN mkdir /etc/apache2/mruby-build
ADD docker/conf/mruby.conf /etc/apache2/mruby-build/mods-available/mruby.conf
ADD docker/hook/mruby-build.rb /etc/apache2/mruby-build/mruby-build.rb

乱暴ですが、ドキュメントルートにmrubyのリポジトリをcloneしてきて、POSTされたbuild_config.rbを使ってここでmrubyをビルドすることを考えています。
※ もともとmod_mrubyの生成時に使っている/usr/local/src/mod_mruby/mrubyがあるはずですが、なんとなくそれはそれで手をつけたくはないのでそっとしときます。

次に、置換したmruby.confは以下です。

<IfModule mod_mruby.c>
  <Location /mruby-build>
    mrubyTranslateNameFirst /etc/apache2/mruby-build/mruby-build.rb
  </Location> 
</IfModule>

mrubyTranslateNameFirstフックにmruby-build.rbを渡しているだけです。

そして、/mruby-buildルートにアクセスが来た時実行されるmruby-build.rbが以下です。

r = Apache::Request.new()                                                                                

# store the sent mruby_config.rb to /var/www/html/mruby  
File.open("/var/www/html/mruby/build_config.rb", "w") do |file|
  file.write(r.body.to_s)
end

# build mruby 
`cd /var/www/html/mruby; rake`

# return the generated static library
r.filename = "/var/www/html/mruby/build/host/lib/libmruby.a"

Apache.return(Apache::OK)

POSTされたbuild_configを/var/www/html/mruby/build_config.rbに保存して、これを使ってmrubyをビルドしています。 最後に、r.filenameにlibmruby.aを指定することで、クライアントに静的ライブラリを返しています。

setup.shが最後まで動けば、コンテナが起動しているはずです。 あとはcurlで、libmrubyを生成してください。

$ curl -d "`cat /path/to/build_config.rb`" -o libmruby.a http://hostname:8080/mruby-build

このコンテナ、このままHerokuデプロイすることも考えたのですが、 POSTされたスクリプトをそのまま実行部に渡すというのがちょっと怖かったので、 やっぱり見送りました。。

ローカルでちょこちょこ遊ぶにはちょうどよい作りなんじゃないかと思います。

この調子で、mod_mrubyでどんどんオレオレサーバを量産していきたいです。