Elixir:我如何利用release_handler?

时间:2016-03-24 08:46:09

标签: erlang elixir

我知道exrm这样的项目可以为你做到这一点,它似乎做得非常好。但是,我想手动使用release_handler进行教育,我发现很少有关于这个主题的文档或文章。

1 个答案:

答案 0 :(得分:2)

您是否阅读了有关发布处理的Learn You Some Erlang article

使用发布处理程序进行升级既简单又困难。很简单,因为一旦你知道所有细节的细节,它就会非常自动化。但很难,因为首先要掌握所有细节是一项非常重要的任务。

我花了很多时间试图理解如何使流程正确,效果是builderl,一个构建系统,类似于rebar,但从开始到结束都做了{ {3}}

如果您使用Elixir,它可能没什么用处,而且我不太了解Elixir的过程有何不同。但是我可以给你一些与Erlang相关的观点,你可以尝试适应你的情况(在builderl的上下文中,因为这将允许我分享一些代码示例。)

鸟瞰图

一般来说,过程如下:

  1. 创建初始版本。这是使用OTP waysystools处理的项目的编译版本,其中包含发布处理程序期望的所有文件夹和文件。这是builderltmp/relgmake rel创建的内容。它是一个独立的文件夹,也称为reltool安装。稍后会详细介绍。

  2. 将版本复制到生产系统,安装并启动节点。

  3. 在您的开发环境中,对发布中运行的一个或多个应用程序进行一些更新。

  4. 创建已更改的每个应用程序的新版本。为这些应用程序创建适当的embedded Erlang文件。增加发布版本。

  5. 使用appup创建relup文件。最简单的方法是将两个发行版本一起拆开并安装并运行较新版本。然后在新版本的Erlang shell中调用make_relup引用旧版本的应用程序的旧版本(请参阅答案底部的片段)。

  6. 创建升级存档。这只是已升级的所有应用程序,版本文件夹和版本定义文件的tarball(再次是底部的片段)。

  7. 将升级存档复制到生产系统,然后使用systools解压缩。这将解压缩应用程序的新版本以及版本文件夹的lib文件夹中的旧版本。

  8. 然后最终使用release_handler:unpack_release/1安装新版本。

  9. 发布

    为了使用发布处理程序,代码必须以特定方式构造。 release_handler:install_release/1文档指定了发布文件夹的外观。 Releases应用程序就是一个示例,这里是builderl编译它的文件夹和humbundeetmp/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 manuallygenerates 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* bootscript文件也是从/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").