15

部署 Perl 应用程序的最佳实践是什么?假设您正在部署到一个带有很少 CPAN 模块安装的 vanilla 盒子。理想的构建、部署方法是什么?模块::构建,ExtUtils::MakeMaker,其他?我正在从那些为大规模应用反复这样做的人那里寻找一些最佳实践想法。

该应用程序正在部署到服务器上。它不是 CPAN 或脚本。它实际上是一个 PSGI Web 应用程序。也就是说,大量的 Perl 包。

我目前有一个部署脚本,它使用 Net::SSH::Expect 将 SSH 连接到新服务器,安装一些工具并配置服务器,然后从源代码控制中拉下所需的应用程序分支。这感觉不错,但这是最佳实践吗?

下一步是构建应用程序。跟踪和管理依赖项、从 CPAN 安装这些依赖项以及确保应用程序准备好运行的最佳实践是什么?

谢谢

4

3 回答 3

11

我工作的公司目前为安装到系统 site_perl 目录中的应用程序(相当多的包!)的每个 CPAN 和内部依赖项构建 RPM。这有很多问题:

  • 随着版本在 CPAN 上的碰撞,不断构建 RPM 非常耗时。
  • 将自己绑定到系统 perl 意味着您可以任由您的发行版来决定或破坏您的 perl(在 Centos 5 中,我们有一个最大的 perl 版本 5.8.8 !)。
  • 如果您将多个应用程序部署到同一主机,则为所有应用程序使用一个 perl 库意味着如果不重新测试主机的每个应用程序,升级依赖项可能会很危险。我们部署了很多独立的发行版,都具有不同程度的维护关注,所以这对我们来说很重要。

我们不再为每个依赖项构建 RPM,而是计划使用 carton [1] 为我们部署的每个应用程序构建一个完全自包含的 perl 库。我们正在将这些库构建到系统包中,但如果您不想与包管理器打交道,您可以轻松地将它们打包并手动复制它们的位置。

carton 的问题在于,如果您的应用程序依赖于不在 CPAN 上的模块,您将需要设置一个内部 CPAN 镜像,您可以将内部依赖项安装到该镜像上。如果您不想处理这个问题,您总是可以手动将所需的库安装到 local::lib [2] 或 perlbrew [3] 中,然后将生成的库打包以部署到您的生产环境中。

对于所有规定的解决方案,请非常小心 XS perl 库。您需要在与您要部署到的主机相同的架构上构建您的 cartons/local:libs/perlbrews,并确保您的生产盒具有与您过去构建的相同的二进制依赖项。

回答有关您的问题的更新,即采购结帐并安装到您的生产主机上是否是最佳实践; 我个人认为这不是一个好主意。我认为这是有风险的原因在于,很难完全确定您安装的库集与您测试的库完全一致,因此部署可能无法预测。webapps 可能会激怒这个问题,因为您很可能将相同的代码部署到多个生产机器上,这些机器也可能不同步。虽然 perl 社区在尝试发布向后兼容的高质量代码方面做得非常出色,但当出现问题时,通常需要付出很大的努力才能解决问题。这就是开发 carton 的原因,因为这会创建一个缓存,其中包含您需要在特定版本中冻结安装的所有分发 tarball,以便您可以预测地部署您的代码。尽管如此,所有这些都说了;如果您乐于接受这种风险并在故障时修复问题,那么本地安装对您来说应该没问题。但是,至少我会强烈建议安装到 local::lib,这样您就可以在安装更新之前备份旧的本地 lib,这样如果事情搞砸了,您就有一个回滚点。

  1. 纸盒
  2. 本地::lib
  3. perlbrew
于 2012-02-11T05:24:45.270 回答
3

如果它有一些重要的 CPAN 依赖项,那么您可能想要编写一个CPAN::Shell用于安装必要模块的小脚本,或者编辑Makefile.PL您的应用程序,以便它反映BUILD_REQUIRES文件部分中的必要依赖项。

于 2012-02-11T03:48:51.123 回答
0

你可以看看sparrowdo一个 perl6 配置管理工具,它带有一些与 perl5 部署相关的方便插件,例如安装 cpan 包或部署 psgi 应用程序。

更新:此链接https://dev.to/melezhik/deploying-perl5-application-by-sparrowdo-9mb可能有用。

披露 - 我是工具作者。

于 2016-07-03T18:23:18.430 回答