我知道exrm这样的项目可以为你做到这一点,它似乎做得非常好。但是,我想手动使用release_handler进行教育,我发现很少有关于这个主题的文档或文章。
答案 0 :(得分:2)
您是否阅读了有关发布处理的Learn You Some Erlang article?
使用发布处理程序进行升级既简单又困难。很简单,因为一旦你知道所有细节的细节,它就会非常自动化。但很难,因为首先要掌握所有细节是一项非常重要的任务。
我花了很多时间试图理解如何使流程正确,效果是builderl,一个构建系统,类似于rebar,但从开始到结束都做了{ {3}}
如果您使用Elixir,它可能没什么用处,而且我不太了解Elixir的过程有何不同。但是我可以给你一些与Erlang相关的观点,你可以尝试适应你的情况(在builderl
的上下文中,因为这将允许我分享一些代码示例。)
一般来说,过程如下:
创建初始版本。这是使用OTP way和systools
处理的项目的编译版本,其中包含发布处理程序期望的所有文件夹和文件。这是builderl
在tmp/rel
为gmake rel
创建的内容。它是一个独立的文件夹,也称为reltool
安装。稍后会详细介绍。
将版本复制到生产系统,安装并启动节点。
在您的开发环境中,对发布中运行的一个或多个应用程序进行一些更新。
创建已更改的每个应用程序的新版本。为这些应用程序创建适当的embedded Erlang文件。增加发布版本。
使用appup
创建relup
文件。最简单的方法是将两个发行版本一起拆开并安装并运行较新版本。然后在新版本的Erlang shell中调用make_relup
引用旧版本的应用程序的旧版本(请参阅答案底部的片段)。
创建升级存档。这只是已升级的所有应用程序,版本文件夹和版本定义文件的tarball(再次是底部的片段)。
将升级存档复制到生产系统,然后使用systools解压缩。这将解压缩应用程序的新版本以及版本文件夹的lib
文件夹中的旧版本。
然后最终使用release_handler:unpack_release/1
安装新版本。
为了使用发布处理程序,代码必须以特定方式构造。 release_handler:install_release/1
文档指定了发布文件夹的外观。 Releases应用程序就是一个示例,这里是builderl
编译它的文件夹和humbundee(tmp/rel
中):
> tmp/rel/
bin/
erts-7.2.1/
etc/
lib/
releases/
文件夹如下:
lib
包含应用程序的主文件夹。每个应用程序可能没有版本后缀(-Vsn
),或者相同应用程序的所有版本都必须具有后缀。您无法混合应用程序文件夹,其中一些文件夹包含版本后缀,而另一些文件夹则不包含。
但是在使用发布处理程序进行升级时,所有文件夹都必须具有正确的-Vsn
后缀,否则升级没有意义 - 升级是在应用程序版本之间进行的,而Erlang通过应用程序中的后缀来区分版本#39;文件夹名称。
> l tmp/rel/lib/
builderl-0.2.7/
compiler-6.0.2/
deploy-0.0.1/
goldrush-0.1.7/
humbundee-0.0.1/
kernel-4.1.1/
lager-3.0.1/
mnesia-4.13.2/
sasl-2.6.1/
stdlib-2.7/
syntax_tools-1.7/
yajler-0.0.1/
yolf-0.1.1/
erts-Vsn
通常这是安装Erlang的erts
文件夹的副本(在我的情况下为/usr/local/lib/erlang/erts-7.2.1
)。
releases
包含定义发布的文件。每个文件的创建方式略有不同。
> l tmp/rel/releases/
RELEASES
hbd-0.0.1/
start_erl.data
humbundee.rel
> cat release/RELEASES
[{release,"humbundee","hbd-0.0.1","7.2.1",
[{kernel,"4.1.1","/usr/home/g/work/humbundee/lib/kernel-4.1.1"},
{stdlib,"2.7","/usr/home/g/work/humbundee/lib/stdlib-2.7"},
{sasl,"2.6.1","/usr/home/g/work/humbundee/lib/sasl-2.6.1"},
{yolf,"0.1.1","/usr/home/g/work/humbundee/lib/yolf-0.1.1"},
{yajler,"0.0.1","/usr/home/g/work/humbundee/lib/yajler-0.0.1"},
{mnesia,"4.13.2","/usr/home/g/work/humbundee/lib/mnesia-4.13.2"},
{syntax_tools,"1.7",
"/usr/home/g/work/humbundee/lib/syntax_tools-1.7"},
{compiler,"6.0.2","/usr/home/g/work/humbundee/lib/compiler-6.0.2"},
{goldrush,"0.1.7","/usr/home/g/work/humbundee/lib/goldrush-0.1.7"},
{lager,"3.0.1","/usr/home/g/work/humbundee/lib/lager-3.0.1"},
{humbundee,"0.0.1",
"/usr/home/g/work/humbundee/lib/humbundee-0.0.1"}],
permanent}].
> cat releases/start_erl.data
7.2.1 hbd-0.0.1
> cat tmp/rel/releases/humbundee.rel
%% rel generated at {2016,3,24} {11,9,39}
{release,{"humbundee","hbd-0.0.1"},
{erts,"7.2.1"},
[{kernel,"4.1.1"},
{stdlib,"2.7"},
{sasl,"2.6.1"},
{yolf,"0.1.1"},
{yajler,"0.0.1"},
{mnesia,"4.13.2"},
{syntax_tools,"1.7"},
{compiler,"6.0.2"},
{goldrush,"0.1.7"},
{lager,"3.0.1"},
{humbundee,"0.0.1"}]}.
> l tmp/rel/releases/hbd-0.0.1/
builderl.config
cmd.boot
cmd.data
cmd.rel
cmd.script
hbd.config
humbundee.boot
humbundee.data
humbundee.rel
humbundee.script
start.boot -> humbundee.boot
sys.config -> hbd.config
sys.config.src -> ../../etc/sys.config.src
这些文件由builderl
自动创建,然后在Release Handler的帮助下生成它们:
<强>释放强>
包含系统上当前可用的当前和过去版本的定义。可以使用creates the release using systools
创建。 builderl
通过使用此命令启动节点来创建它(它运行命令并在之后关闭节点):
run_erl -daemon ../hbd/shell/ ../hbd/log "exec erl ../hbd releases releases/start_erl.data -config releases/$APP_VSN/hbd.config -args_file ../hbd/etc/vm.args -boot releases/$APP_VSN/humbundee -noshell -noinput -eval \"{ok, Cwd} = file:get_cwd(), release_handler:create_RELEASES(Cwd, \\\"releases\\\", \\\"releases/$APP_VSN/humbundee.rel\\\", []), init:stop()\""
<强> start_erl.data 强>
release_handler:create_RELEASES/4
<强> humbundee.rel 强>
包含发行版的定义 - 哪些应用程序应包含在版本的发行版中。它可以手动创建,但很难跟踪应用程序版本。因此,它通常是从更通用的文件生成的。如果基于Can be created manually的generates the .rel
文件中的builderl
reltool.config
个文件。
bin
包含指向发行版的Erlang可执行文件,脚本和启动文件的链接。如果是builderl
,则只是these reltool
examples。
> l tmp/rel/bin/
builderl -> ../lib/builderl-0.2.7
config.esh -> builderl.esh
configure.esh -> builderl.esh
deps.esh -> builderl.esh
init.esh -> builderl.esh
migresia.esh -> builderl.esh
mk_dev.esh -> builderl.esh
mk_rel.esh -> builderl.esh
start.esh -> builderl.esh
stop.esh -> builderl.esh
update_root_dir.esh -> builderl.esh
builderl.esh
ct_run
epmd
erl
escript
run_erl
to_erl
start
cmd.boot
humbundee.boot
start_clean.boot
start_sasl.boot
start.boot
start.script
.esh
个文件属于builderl
,因此您可以跳过它们。可执行文件是从/usr/local/lib/erlang/bin/
复制的(这取决于系统 - 我使用的是FreeBSD)。 start*
boot
和script
文件也是从/usr/local/lib/erlang/bin/
和cmd.boot
复制的,而humbundee.boot
只是从tmp/rel/releases/hbd-0.0.1/
复制而来。< / p>
etc
由builderl
用于存储配置文件,而不是OTP版本处理程序所需。
最后,一些代码片段可帮助您使用发布工具:
创建一个将版本1.1.1升级到9.9.9的relup文件(在版本旧版本的版本中运行,请参阅顶部的鸟类视图答案):
systools:make_relup("releases/rel-9.9.9/my_release", ["../1.1.1/releases/rel-1.1.1/my_release"], ["../1.1.1/releases/rel-1.1.1/my_release"], [{path, ["../1.1.1/lib/lager-2.6/ebin", "../1.1.1/lib/backup_app-1.1.2/ebin", "../1.1.1/lib/goldrush-2.5/ebin"]}, {outdir, "releases/rel-9.9.9"}]).
创建一个relup文件,将两个版本1.1.1和2.2.2升级到9.9.9
systools:make_relup("releases/rel-9.9.9/my_release", ["../1.1.1/releases/rel-1.1.1/my_release", "../2.2.2/releases/rel-2.2.2/my_release"], ["../1.1.1/releases/rel-1.1.1/my_release", "../2.2.2/releases/rel-2.2.2/my_release"], [{path, ["../1.1.1/lib/lager-2.6/ebin", "../2.2.2/lib/lager-2.4/ebin", "../1.1.1/lib/backup_app-1.1.2/ebin", "../2.2.2/lib/other_app-1.1/ebin"]}, {outdir, "releases/rel-9.9.9"}]).
手动创建发布升级包
tar -czf update_to_rel-9.9.9.tar.gz releases/my_release.rel releases/rel-9.9.9 lib/lager-2.6.1 lib/builderl-0.2.6 lib/deploy-0.4.2 lib/backup_app-2.0.0 lib/other_app-2.5.3
解压缩版本升级包(在将其复制到生产节点上的版本中的releases
文件夹之后):
release_handler:unpack_release("rel-9.9.9").
确认已解压缩版本 - 新版本应标记为unpacked
:
release_handler:which_releases().
安装新版本:
release_handler:install_release("rel-9.9.9").
一旦按预期工作,请将其永久化:
release_handler:make_permanent("rel-9.9.9").
回滚版本:
release_handler:install_release("rel-1.1.1").
release_handler:remove_release("rel-1.1.1").