【发布时间】:2015-12-28 21:40:16
【问题描述】:
我正在使用 exrm 构建 phoenix 应用程序。
良好的实践表明,我应该针对同一个二进制文件进行测试,然后将其投入生产。
Exrm 让我能够在没有安装 Erlang 或 Elixir 的机器上部署 phoenix,这使得拉取 docker 镜像更快。
有没有办法针对 exrm 构建的二进制文件启动 mix test?
【问题讨论】:
标签: release elixir elixir-mix
我正在使用 exrm 构建 phoenix 应用程序。
良好的实践表明,我应该针对同一个二进制文件进行测试,然后将其投入生产。
Exrm 让我能够在没有安装 Erlang 或 Elixir 的机器上部署 phoenix,这使得拉取 docker 镜像更快。
有没有办法针对 exrm 构建的二进制文件启动 mix test?
【问题讨论】:
标签: release elixir elixir-mix
需要注意的是,发布不是二进制文件。当然,它们被打包成一个 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 提供的出色软件 :)
MIX_ENV 进行更改(这是因为您没有在发行版中使用 Mix,无论是运行它还是读取配置)。因此,配置将是您运行 mix release 的任何环境(除非您在目标系统上编辑 sys.config)。
mix 应用程序添加为依赖项,并将其包含在版本中,但您可能会猜到,它既不推荐也不保证它可以正常工作;)