rebar 熱更 Erlang 代碼實踐

jopen 10年前發布 | 69K 次閱讀 Erlang開發 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

添加升級輔助腳本rpc腳本

為了避免修改代碼中版本號的繁瑣,這里創建了兩個.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熱更產品了,當然,如果你發現了有什么不對的地方或者有更好的方法,歡迎交流

項目主頁:http://www.baiduhome.net/lib/view/home/1418780575386

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!