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
インストール&コンテナ起動
これは、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でどんどんオレオレサーバを量産していきたいです。