【问题标题】:Testing elixir release build with exrm使用 exrm 测试 elixir 发布版本
【发布时间】:2015-12-28 21:40:16
【问题描述】:

我正在使用 exrm 构建 phoenix 应用程序。

良好的实践表明,我应该针对同一个二进制文件进行测试,然后将其投入生产。

Exrm 让我能够在没有安装 Erlang 或 Elixir 的机器上部署 phoenix,这使得拉取 docker 镜像更快。

有没有办法针对 exrm 构建的二进制文件启动 mix test?

【问题讨论】:

    标签: release elixir elixir-mix


    【解决方案1】:

    需要注意的是,发布不是二进制文件。当然,它们被打包成一个 tarball,但这只是为了简化部署,它包含的实际上是使用 MIX_ENV=prod mix compile 生成的二进制 .beam 文件,加上 ERTS(如果你正在捆绑它)、Erlang/Elixir .beam 文件,以及启动应用程序的启动脚本/配置文件等。

    因此,简而言之,您的代码在发布中的行为与使用MIX_ENV=prod 运行时的行为相同(假设您运行MIX_ENV=prod mix release)。唯一实际的区别是您是否已正确配置应用程序以打包在发布中,并且测试这归结为对/tmp/<app> 进行测试部署并启动它以确保您没有忘记添加依赖项到 mix.exs 中的applications。

    您需要测试的另一个元素是您是否正在对应用程序进行热升级/降级,在这种情况下,您需要在本地进行测试部署以确保按预期应用升级/降级,因为 exrm 会生成默认.appup 为您提供文件,这可能并不总是做正确的事情,或者您需要他们做的所有事情,在这种情况下您需要适当地编辑它们。我通过部署到/tmp/<app> 来启动旧版本,然后将升级压缩包部署到/tmp/<app>/releases/<new version>/<app>.tar.gz,并运行/tmp/<app>/bin/<app> upgrade <version> 并测试应用程序是否按预期升级,然后运行之前版本的降级命令以看看它是否正确回滚。测试的性质因您所做的代码更改而异,但这就是它的要点。

    希望这有助于回答您的问题!

    【讨论】:

    • 要添加到这个出色的答案,请记住,发布不包含测试代码,也不包含mix,因此在发布上运行测试在技术上无法正常工作。您当然可以考虑集成/验收测试,如果您将发布部署到某个登台服务器并运行一些黑盒测试(例如,通过检查各种 http 请求的结果)。
    • 谢谢,这正是我的预期,但我只是想确定一下。还有一个问题。它是用MIX_ENV=prod 编译的,但实际版本会读取环境变量吗?因此,如果我将 MIX_ENV=stag 与其他数据库凭据一起使用,它应该仍然可以正常工作吗?感谢 bitwalker 提供的出色软件 :)
    • @tkowal 您仍然可以在代码中使用 System.get_env,因此您可以设置环境变量并按照您的预期读取它们,不同之处在于您的应用程序的配置,因为配置赢了'不再基于MIX_ENV 进行更改(这是因为您没有在发行版中使用 Mix,无论是运行它还是读取配置)。因此,配置将是您运行 mix release 的任何环境(除非您在目标系统上编辑 sys.config)。
    • @sasajuric 好事情要指出!虽然您实际上可以将 mix 应用程序添加为依赖项,并将其包含在版本中,但您可能会猜到,它既不推荐也不保证它可以正常工作;)
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多