情况如下:我们有多个开发人员具有不同程度的命令行经验,我们正在为我们的网站整合部署解决方案。生产环境是2个SUSE Linux机器。开发环境也是SUSE Linux盒子。每个开发人员都有/将在其主目录中拥有SVN树的副本以进行开发和测试。
目标是拥有一个易于使用且易于恢复的发布系统,该系统可与多个生产服务器配合使用。如果非网络开发人员(仍然是不在网络世界中的编码人员)也可以轻松地还原任何网站,那将是一个奖励。在一个最佳的世界中,发布将像在您要发布的网站上运行单个命令一样简单。此命令将更新生产服务器并在其中唤醒恢复路径。
我们当前的部署解决方案有点笨拙,很难恢复并且很慢。我们目前使用SVN签入所有文件。然后运行一个基本上在SVN中创建标记的脚本。然后运行第二个脚本,该脚本将进入2个生产服务器中的每个服务器并运行'svn up'。
有什么建议吗?
答案 0 :(得分:2)
我是一个.net家伙,因此在windows世界中处理事情......虽然我每天都在处理构建过程的技术来自你的世界! (Linux / java技术在括号中,但我也包括它们对于Windows阅读器的等价物)我使用CruiseControl.NET(CruiseControl),VisualSVN(SVN),{{3 }}和Tortoise(NAnt)来处理我的所有构建需求。
我的所有版本通常会在签入时自动推送和标记。这是通过CruiseControl完成的,因为它监视我的源代码控制(SVN或SubVersion)。当CruiseControl(CC)看到已经检查了新代码时,它将执行一个CC项目,该项目又调用构建服务器上的Ant脚本。
Ant脚本在常见版本中为我做了几件事。它将检出最新代码的副本并将其下载到构建服务器。然后它将构建代码以确保至少编译的东西。然后它设置我的数据库的干净副本并执行任何sql脚本以构建该基线数据库直到当前版本。然后我运行所有单元测试项目。然后我运行集成测试,其中包括测试我的存储库层以确保代码仍与我的后端对齐(我通常在我的项目中使用ORM,因此它们很少不同步......但是这是一个很好的步骤进行中)。一旦所有测试都通过(或失败),我将数据库回滚到干净状态并执行脚本以将其升级到当前版本(这很重要,因为它为团队提供了一个干净的数据库,以便在点击时进行开发一个按钮)。如果构建成功,那么我将代码部署到开发服务器(我还有一个单击部署到我的登台服务器和生产服务器)。如果您希望在每次签入时标记代码库,也可以在此处执行此操作。
完成所有这些操作后,我希望使用Ant,NDepend和NDoc对我的代码进行一些分析。 NDepend是一个代码分析工具,用于确保事物在架构上是正确的,命名标准是应该的,以及更多。 NDoc提取所有代码注释并为我的代码创建MSDN样式文档。 NCover告诉我,我的代码是否有适当的单元测试覆盖率。
然后我编写了一个自定义Ant任务,我编写了解析各种// TODO和// CodeDebt标记的代码以生成另一个报告,告诉我(通常在sprint结束时)多少废话正在我的代码库中建立起来。然后可以将其考虑到下一个冲刺中。
所有这些报告都包含在发布的电子邮件中,或者链接得太紧。
请记住,所有上述操作都会在每次办理登机手续时发生......并且任何人都不需要点击任何一个按钮!这是真正的持续集成,应该是每个构建大师的目标。
CruiseControl有一个基于Web的控制台,它还允许非网络开发人员(真正的任何人)进入并执行此推送而无需检入代码...强制构建。
鉴于此框架,只要一切都在版本控制之下,您就可以轻松地回滚推送。您将需要另一个Ant脚本,该脚本将执行相同的过程,但需要额外的第一个任务,因为它必须获取最新版本的代码而不是最新版本才能执行构建过程。所有Ant任务都可以与不同的执行目标一起重用。
答案 1 :(得分:2)
Capistrano是一个很好的解决方案。虽然最初是为Ruby on Rails平台开发的,但我已成功地在许多PHP项目中使用它。它自动执行通过SSH执行的操作。部署是原子的,因为每个部署都签出到新目录。
使用符号链接打开当前副本。最新版本的源代码是从Subversion中提取的。您还可以设置要在生产环境中使用的静态配置文件。
Capistrano还支持回滚,但如果您在部署之间进行数据库更改,则必须小心。考虑使用dbdeploy或rails migrations之类的东西来解决此问题。
答案 2 :(得分:1)
为了简单起见,请尝试 SpringLoops 。它是托管的svn服务,具有部署(和还原)到不同服务器的选项。它非常易于使用和设置,免费版本只允许您部署到一台服务器,但如果您愿意付费,您可以部署到不同的服务器(即分期,开发和生产)。
您可以免费获得30天的任何软件包,因此您可以使用所需数量的服务器进行测试。我不隶属于springloops。我只是使用它并发现它很有用而且很简单。
答案 3 :(得分:0)
您可能遇到的一件事是通过不同版本的不同数据库结构向后和向前转发。此外,如果您有其中所需的初始化数据。我记得在这里有一些类似的问题,如果你搜索但不太喜欢这个......
答案 4 :(得分:0)
您是否查看了现有的构建工具,例如ant / phing,甚至是xinc或phpUnderControl等CI解决方案?
答案 5 :(得分:0)
根据我的经验,“恢复”功能几乎无法维护,因为没有简单的方法来处理破坏性更新。也就是说,你绝对可以做得比svn up
更好。至少,您希望在签出代码后运行脚本,可以修补应用程序(对数据库进行更改等)。您可能也希望将实际更新设置为原子,因此我建议您svn export
到临时文件夹,然后在完成后更新符号链接以指向该文件夹。您可能也希望在运行补丁期间停止任何服务。
你可以考虑使用像卡皮斯特拉诺这样的东西将它包装在一个漂亮的包中。它带有一个漂亮的我们为基础的gui(Webistrano)。
答案 6 :(得分:0)
我建议如果您要将文件部署到生产服务器,那么puppet是配置管理的一个很好的工具,也可以用于从subversion(或git)部署您的内容。在木偶伪造上查找木偶和vcsdeploy模块http://www.practicalclouds.com/content/guide/pclouds-vcsdeploy-deploy-stuff。