2个云服务器,一个开发,一个产品;什么是良好的部署过程?

时间:2011-07-12 15:52:37

标签: php apache deployment build-process phing

目前在我的网络应用中使用LAMP堆栈。我的dev和prod在同一个云实例中。现在我得到一个新实例,并希望将dev / test环境移动到新实例,将其与prod环境分开。

它曾经是一个简单的Phing脚本,可以将SVN导出到prod目录(由我的vhost.conf指向)。现在如何在环境分离的情况下建立良好的构建过程?

考虑将SVN存储库转移到开发服务器,然后执行ssh + svn推送(这可能是Phing吗?)

此类设置的最佳/常用做法是什么?

更多信息:

我目前正在使用 CodeIgniter 用于MVC框架, Phing 用于localhost部署的自动构建。使用 Java 编写的一些CRON脚本也支持Web应用程序。

更新

结束使用Phing + Jenkins。到目前为止运作良好!

3 个答案:

答案 0 :(得分:3)

我们使用Phing进行类似于您所描述的部署。我们还为我们的项目使用Symfony框架(这对于此并不重要,但Symfony支持不同环境的概念,因此它是一个优点。)

但是我们仍然需要为数据库,前端控制器等生成不同的配置文件。

所以我们最终得到了一个带有build.properties的文件夹,它定义了不同环境的配置(在我们的例子中也适用于我们运送产品的不同客户)。此文件夹使用svn externals链接到文件结构(同样不是必需的)。

Phing build.xml文件然后在命令行上接受属性文件作为参数,从中获取值并生成所有必需的配置文件,控制器和其他特定于环境的文件。 我们将配置存储在模板文件中,然后使用Phing中的复制/过滤功能将模板中的占位符替换为特定值。

配置给定环境的整个任务可以像这样简单:

phing configure-environment -DpropertyFile=./build_properties/build.properties.prod

在构建文件中,检查是否定义了指定属性文件的propertyFile属性,并使用<property file="./build_properties/build.properties.prod" override="true" />加载文件。然后你就可以根据需要对这些值进行任何魔术。

您仍然可以使用svn checkout / update并将所有生成的配置文件放入svn ignore(您将通过phing生成它们)。我们实际上在Phing中使用了其他步骤。这些步骤最终产生了Linux shell安装自我部署包。这是在Jenkins中自动生成的。然后我们将软件包发送给我们的客户,或者支持团队可以从Jenkins获取软件包,他们可以通过执行它来完成整个部署(我们仍然希望手动部署到生产服务器),或者Jenkins可以自动部署它(例如测试)服务器)。

如果需要,我会很乐意写下更多信息。

答案 1 :(得分:1)

我建议使用Capistrano(看起来他们自移动网站后没有更新文档)和railsless-deploy进行部署。最终,您可能需要添加更多应用程序框并在部署中运行其他任务,因此选择支持此功能的框架可以为您节省大量时间。我已经使用capistrano进行了两次PHP部署(一个小型​​和一个大型)虽然它不完美,但它运行良好。它还处理所有代码检出/更新,将符号链接移动到位,并在出现问题时回滚。

一旦配置了capistrano,您所要做的就是:

cap dev deploy 
cap prod deploy

我为此做过探索的另一个选择是fabric。虽然我没有使用它,但如果我不得不再次部署一个复杂的应用程序,我会考虑它。界面简单明了。

第三种选择,你可能会看到它仍处于发展的早期阶段gantry(原谅自我推销)。这是我一直在努力解决的问题,因为使用capistrano在具有大量移动部件的环境中部署PHP应用程序。 Capistrano非常棒,适用于非PHP应用程序部署,但您仍需要在代码中进行一些调查,以了解正在发生的事情并根据您的需要进行调整。这也是我建议给面料一个好看的原因。

答案 2 :(得分:0)

我现在使用类似的配置。 Lamp + SVN + codeigniter + prd和dev服务器。

我在dev上运行svn repos。我将repos检入dev域的根文件夹。然后在每次开发人员提交时使用post-commit钩子来更新根文件夹。

当我们感到高兴并且已经完全测试了代码时,我将ssh引入prd服务器并将dev根目录转发到prd根目录。

这是我对不同配置的解决方案。在根文件夹之外,我有一个config.ini文件。我在我的codeigniter constants.php脚本中解析该文件。这意味着prd和dev服务器可以具有单独的设置,而不会在repos中。

如果您需要有关提交后的帮助,请告诉我rsync和ini代码。