rebar 熱更 Erlang 代碼實踐
在公司的Erlang團隊中,我們采用rebar來管理依賴、構建、自動化測試、部署和升級。前面的幾個話題網上已經能搜到不少介紹的文章,這里就不做贅述了。本文主要集中介紹我們采用 rebar進行產品熱更的實踐,當然,如果你有更好、更方便的方法,歡迎交流。
目標
先來介紹目標, 假設第一個release版本為'1.0.0.0', 我需要這樣的一個工具,它可以簡單地執行upgrade.sh -n upgrade_demo -v 1.0.0.1
就將產品熱更到新的版本。
問題
從rebar的wiki中我們能找到一個更新代碼的簡單教程,遺憾的是,在試用的時候總會有報錯。例如,它可以從1.0.0.0升級到1.0.0.1, 但是再往1.0.0.2升級的時候就會有異常拋出。通過翻rebar的代碼發現里邊有一處明顯的bug。
DEMO
準備工作
OK, 下面我們用一個簡單的例子來說明:
為了讓讀者有個感性的認識, 本repo demo分支的commits 仔細按照下文的步驟進行了調整,如果你熟悉git,希望能幫你節省一些時間。
首先你需要下載一個新版本的rebar(至少包含#commit 899d60c)。
為demo新建文件夾:
mkdir upgrade_demo
cd upgrade_demo
mv path/to/your/new/rebar ./
創建app#commit
./rebar create-app appid=upgrade_demo
修改原始的版本號為'1.0.0.0'#commit
$EDITOR src/upgrade_demo.app.src
## 把vsn tuple中的默認版本號由1改為1.0.0.0保存即可
在upgrade_demo_app.erl
中添加測試程序#commit
$EDITOR src/upgrade_demo_app.erl
創建node#commit
mkdir rel
cd rel
../rebar create-node nodeid=upgrade_demo
這里生成的rel/files/install_upgrade.escript
不符合需求,簡單修改一下#commit
$EDITOR files/install_upgrade.escript
調整reltool.config
中app位置#commit
$EDITOR reltool.config
為了避免修改代碼中版本號的繁瑣,這里創建了兩個.template文件,并設置錨點#commit
另外在測試的時候發現目前rebar在處理nodetool有一處和文件位置相關的簡單bug, 簡單處理一下#commit 并且調整了升級腳本(因為在我們這里產品的代碼是放在apps/里面的,這和此demo代碼樹層級不符合)#commit
升級測試
好了,經過上面有些麻煩的準備工作,下面我們可以體驗簡單的熱更操作了。
現在使用master和demo分支應該都可以。
發布1.0.0.0
cd path/to/upgrade_demo/
./reabr compile
cd rel
../rebar generate
啟動node
cd path/to/upgrade_demo/
./rel/upgrade_demo/bin/upgrade_demo start
通過測試腳本調用hello()函數
./rpc_test.erl
輸出結果
hello() result: 1
修改hello()函數
$EDITOR src/upgrade_demo_app.erl
diff --git a/src/upgrade_demo_app.erl b/src/upgrade_demo_app.erl
index 905e2fc..bcf7bc9 100644
--- a/src/upgrade_demo_app.erl
+++ b/src/upgrade_demo_app.erl
@@ -16,4 +16,4 @@ stop(_State) ->
ok.
hello() ->
- 1.
+ 2.
執行升級腳本, 升級到1.0.0.1版本
./scripts/upgrade.sh -n upgrade_demo -v 1.0.0.1
通過測試腳本調用hello()函數
./rpc_test.erl
輸出結果
hello() result: 2
再次修改hello()函數(因為之前這里有處不能繼續升級的bug,重復測試一下,保證沒有問題)
$EDITOR src/upgrade_demo_app.erl
diff --git a/src/upgrade_demo_app.erl b/src/upgrade_demo_app.erl
index 905e2fc..bcf7bc9 100644
--- a/src/upgrade_demo_app.erl
+++ b/src/upgrade_demo_app.erl
@@ -16,4 +16,4 @@ stop(_State) ->
ok.
hello() ->
- 2.
+ 3.
執行升級腳本, 升級到1.0.0.1版本
./scripts/upgrade.sh -n upgrade_demo -v 1.0.0.2
通過測試腳本調用hello()函數
./rpc_test.erl
輸出結果
hello() result: 3
END
至此你應該可以比較簡潔的使用rebar熱更產品了,當然,如果你發現了有什么不對的地方或者有更好的方法,歡迎交流。