wkzk's blog

なんか消去法的に、もしくはブログであることを求められてるときに書くかもしれないブログ。

rebarはじめて物語

日頃、java屋なのでmavenと近い印象で望みましたが結構似てました。とても長いけどメモまでに。

0. rebar準備

Githubから取得してmakeします。できたrabarをプロジェクトで利用します。

1. プロジェクト作成

hello_rebarという名前にします。otpアプリケーションが複数あることもふまえてappsというサブディレクトリを作成します。あとは後述するリリース用のrelディレクトリを作ります。で、さっきmakeしたrebarをhello_rebarディレクトリ下にコピる。

2. テンプレート自動生成

rails/mavenと同様にテンプレート生成します。

  1. create-app appid=hello_rebar でアプリケーションの骨格である各ファイルを作成
  2. create template=simplemod modid=hello_rebar テストディレクトリも含めたシンプルなモジュールを作成

3. rebar.config修正

mavenのpom.xmlみたいなものですね。作成したhello_rebarディレクトリ下にファイルを用意します。今回は外部ライブラリ参照ぐらいしておきたいのでlagerをログ出力として使います。lagerの利用で必要なのはerts_optにパラメタの追加が必要なのでたします。また、mavenと同様にdependencyを追加します。

やったのは

  1. 今回はサブディレクトリきったのでsubdirの指定を追記。
  2. コンパイルするとわかるけど、結構WARNがでるのででないようにするerts_optを指定。xref checkを追加。
  3. {parse_transform, lager_transform}がlagerで必要なのでerts_optに追加
  4. versionをR15に。
  5. 一番最後に依存ライブラリ宣言を追加

4. 依存ライブラリ取得

rebar.configの内容にもとづいて依存ライブラリ取得、コンパイルをします。get-depsで取得、list-depsコマンドで確認します。

5. gen_serverのサンプルモジュール作成

いよいよモジュール作るのですが、その前に今回、サブディレクトリきって動かすことにしたので自動生成したhello_rebar/srcディレクトリをhello_rebar/apps/hello_rebar/srcに移動することにします。

$ mkdir -p apps/hello_rebar
$ mv src apps/hello_rebar/

今回つくるのは単純にhello/1の関数を用意して、文字列をわたしてHello,+文字列でログ出力するというhello world級なものです。gen_serverのテンプレートをベースにstart()とhello/1とそのcallbackを自動生成されたhello_rebar.erlに書きたします。以下、抜粋。

start() ->
	gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
%% 略 %%
hello(Name) ->
	Reply = gen_server:call(?MODULE, {hello, Name}),
        lager:info("Hello, ‾s‾n", [Reply]). 
%% 略 %%        
handle_call({hello, Name}, From, State) ->
    Reply = lists:append(["newbie- ", Name]),
    {reply, Reply, State}.

ログ出力はlager:infoのところですね。他にもログレベルはあるようですが今日は割愛。
フルソースははると長いのでリンクだけ。こちら

6. コンパイル

そろったので、早速コンパイル。./rebar compileコマンドだけです。

7. 軽く動作確認

パスをとおして、実際に起動してみます。起動後は必要なアプリケーションを起動してからhello_rebarを起動して動作確認します。

erl -pa apps/*/ebin deps/*/ebin -boot start_sasl -s hello_rebar

そうするとPROGRESS_REPORTがわさっと出力されて、erlang shellモードになりますので、そのままlager起動に必要なcompilerとsyntax_toolsを起動していきます。最後にhello_rebarを起動してhello/1を呼び出して動作確認します。

「Hello, newbie- waki」と出力されます。q().でぬけます。

8. リリース

rebar create-node、generateコマンドをつかってリリース準備します。erlangのreltoolをベースにしているので必要な設定はreltool.configにて編集します。順序的にはcreate-node => reltool.config編集 => generateとなります。

で、次にreltool.configを修正します。フルソースはこちら。
生成されたreltool.configで修正したのは以下のところになります。

  1. lib_dirにapps, depsを宣言
  2. アプリ宣言箇所に必要なライブラリを追加(compiler, syntax_tools, lager)
  3. excl_app_filters下のapp宣言にも同様にcompiler, syntax_tools, lager分の宣言を追加

で、最後にgenerateします。

で、このあとバージョンアップもやるので作成したディレクトリをリリース用にみたてて、renameします。

mv hello_rebar hello_rebar_release

9. リリース動作確認

すでにbin下にコマンドができてます。

sh hello_rebar_release/bin/hello_rebar start
sh hello_rebar_release/bin/hello_rebar attach

start指定でするとバックグラウンドで起動されまして、やりとりしたい場合はattachするとshell経由で会話できるようになりますが、ここではconsoleで動作確認します。

先の軽い動作確認と同様にhello_rebarを起動して、helloで文字列をわたしてログ出力されるのが確認できます。ちなみにログの場所はデフォルトだと実行ディレクトリ(今回でいうと/Users/waki/hello_rebar/rel/hello_rebar_release/log)にconsole.logをはじめいくつかのログが出力されます。

って感じです。

10. バージョンアップ

では、こんどはホットスワップでアップデートしてみます。アップデートの段取りはこんな感じのようです。

(1)該当ソースなおす
(2)XXXXX.app.src、reltool.configのバージョン番号を修正
(3)compile
(4)generate
(5)appupファイル作成
(6)新リリースファイル作成
(7)リリースハンドラで反映!

です。以下、それぞれの補足説明を(1)からおってかいていきます。

(1)該当ソースなおす
今回はログ出力している部分をHello,からGoodByeに変えます

(2)XXXXX.app.src、reltool.configのバージョン番号を修正
まず、hello_rebar.app.srcを修正します。vsnを2にします。

次に、reltool.configを修正します。{rel, "hello_rebar", "1",の"1"を"2"に変えます。

(3)compile
(4)generate
上記ふたつは最初にやった手順といっしょです。generateするときはrelディレクトリでの実行ということも間違えないようにしてればすんなりいきます。

(5)appupファイル作成
appupベースでアップデートを行います。これ自体はrebarとは直接的に関係ないです。rebarは簡単なappupファイルを作成してくれます。

previous_releaseで指定するのは現在、動いている実行環境のディレクトリで、先ほどrenameしたディレクトリになります。

(6)新リリースファイル作成

リリース用に実行環境をまるっとつつんだgzパッケージをgenerate-upgradeコマンドをつかって作成します。

hello_rebarにバージョン番号がついて、hello_rebar_2.tar.gzが作成されます。このtar.gzパッケージを動作しているディレクトリ下のreleaseディレクトリにおきます。

cp hello_rebar_2.tar.gz hello_rebar_release/releases/

(7)リリースハンドラで反映!
あとは最新モジュールでアップデートします。erlang shellからrelease_handlerをつかって反映させます。これ自体はrebarとは関係ないです。

メッセージがGoodByeになりました。ちなみにrelease_handler:which_releases().でその時うごいているバージョンを確認しています。unpack_releaseして、install_releaseでアップデートされます。make_permanentをするとrebootしてもこのバージョンで動き続けるようになります。

以上です。

以下、オフィシャルサイトとそれ以外に参考したリンクです、勝手に感謝m(_ _)m!
本家rebar wiki
Erlang に興味を持った人へ
Erlang: ログライブラリLager
Erlang rebar tutorial: generating releases and upgrades


最後に今日の教訓:「長すぎよくない」

以上、ひやひやどきっちょでした。