部署自动化

时间:2013-03-17 21:05:59

标签: scala deployment jetty lift puppet

我有一个Lift应用程序,它打包为WAR存档,必须在Jetty下部署。但是,我希望能够自动执行一些任务:

  • 指定目标服务器(或服务器集合)。我有多个服务器,从开发到测试和生产服务器,我希望能够轻松控制部署的目的地。
  • 目的地(例如DEVELOPMENT)可能表示服务器集合,用于负载平衡。
  • 测试阶段。基本上,在每个部署中,如果应用程序无法编译或者一个或多个测试失败,我希望运行整个测试集并阻止部署。
  • WAR档案必须在Jetty上部署,再次在一台或多台运行Linux的Amazon EC2机器上部署。(Ubuntu 12.10)

我正在使用SBT,我不知道这对Puppet或类似的东西有多好。你会怎么做?

4 个答案:

答案 0 :(得分:5)

我一直在看这个问题,希望有人会想出一个聪明的答案。既然他们没有,我想我会对自己对此事的看法感到满意。

据我所知,没有现有工具来自动化这些类型的部署,我认为这是因为有很多不同的场景需要处理。至少,你有:

  1. 单个开发服务器,只需将WAR复制到位,然后重新启动应用服务器。
  2. 单个生产服务器,其过程类似,但您不希望该过程中断您的用户。这里的注意事项包括在重新启动时保留会话数据,并在低使用率的情况下计划重新启动。
  3. 一个小型群集,您可以在许多节点上拥有负载均衡器。现在事情变得复杂了。您可以使用各种不同的LB工具(HA Proxy,NGINX,Amazon的Elastic LB),如果您关心用户体验,则需要协调应用服务器的滚动重启。在节点之间迁移任何会话数据也是一个问题。
  4. 您有一个庞大的群集,由不同地理区域的较小群集组成。在这里,你要处理的是#3 +在区域之间需要进行协调的任何配置。
  5. 我想1& 2是最容易找到通用工具的,如果这是我需要处理的唯一情况,我可能只是将Jenkins与应用程序一起部署。它可以非常容易地配置,以便在发生更改时从git分支中提取,构建代码并重新启动Jetty。等到3&但是,我认为所涉及的不同工具的数量以及协调它们的需要已经排除了任何类型的标准解决方案。我不认为这只是Java / Scala世界中的一个问题,因为我已经看过Github人员在他们为管理deployments of their Rails app而构建的自定义工具上的文章。

    至于Puppet,我从未使用它的警告,似乎它可能是这种类型的过程的有用工具。您需要某种类型的中央协调器来处理群集,我相信Puppet可以帮助解决这个问题。

答案 1 :(得分:1)

您可以使用我们的产品BuildMaster来完成所有这些操作。我注意到你提到了Puppet,重要的是要注意这个工具是为基础设施自动化而设计的,而不是软件部署和交付。

在DevOps领域工作,我们发现通过团队协作保持软件和基础架构部署正交并同步非常重要(开发人员不是操作人员,反之亦然)。

要解决您的要点:

部署到多个服务器

创建自动部署计划时,您可以根据需要指定服务器组并从组中添加/删除服务器。

测试阶段

您可以在生产之前使用任意数量的测试环境设置工作流,并且这些工作流可以包括在允许将构建提升到下一个环境之前传递测试的自动检查(即促销要求)。内置的用于确保传递单元测试,但您可以为任何命令行工具输出指定它们,甚至可以编写自定义扩展。

Jetty部署

复制WAR文件就像使用SSH代理将工件部署到服务器一样简单。

答案 2 :(得分:0)

也看了这个问题。

实际上有同样的感觉:你不能考虑所有可能的环境,框架只允许你选择你想要的。因此,请使用任何令人愉快的部署工具并使用它。

(当然,SBT允许您测试,防止打包,并且有许多部署工具了解WAR-s和Jettyies。)

答案 3 :(得分:0)

这是典型的DevOps场景。我认为Jenkins将通过添加几个开源插件来帮助解决前两个需求,以获得对作业的更多控制,例如“CloudBees Build Flow”和“Node and Label parameter”。

Puppet或Chef肯定会帮助您配置一系列准备好软件配置的系统。它们几乎是等价的,但Chef支持更少的操作系统平台。

我建议你参考OpenStack的持续集成,尤其是项目选通和基础设施自动化:http://ci.openstack.org/

对于部署,还有urbancode uDeploy,它允许您在友好的GUI上设计自动部署过程,但现在已经商业化(由IBM收购)。实际上詹金斯可以做同样的事情,但需要更多的编码和脚本。