2009-06-24 78 views
4

以下是这种情况:我们有多个开发人员,他们具有不同程度的命令行体验,我们正在为我们的网站制定部署解决方案。生产环境是2个SUSE Linux机器。开发环境也是SUSE Linux系统。每个开发人员都会在其主目录中拥有SVN树的副本,以进行开发和测试。SVN网站开发和部署解决方案

的目标是有一个版本系统,易于使用和易于恢复,将有多个生产服务器工作。如果一个非网页开发者(仍然是一个不在网络世界的编码人员)也可以很容易地恢复任何网站,那将是一件好事。在一个最佳的世界里,发布会像在你想要发布的网站上运行一个命令一样简单。该命令会更新生产服务器并在唤醒中留下恢复路径。

我们目前部署的解决方案是有点笨重,很难恢复,慢如粪土。我们目前使用SVN检入所有文件。然后运行一个脚本,基本上在SVN中创建一个标签。然后运行第二个脚本,进入2个生产服务器的每一个,并运行“svn up”。

有什么建议吗?

+1

我尝试了一些下面的建议,包括Capistrano和CruiseControl,并检出了SpringLoops(非常酷的解决方案,但它不适用于我们)。 PHP Phing最终成为了一个完美的搭档。它很容易定制和设置。 – prime31 2009-07-09 17:50:32

回答

0

您可能遇到的其中一个问题是在不同版本中通过不同的数据库结构向后和向前转移。另外如果你有它需要的初始化数据。我记得这里有一些被类似的问题,如果你搜索,但不太喜欢这个..

+0

我们使用自定义应用程序服务器作为我们的SQL服务器(MYSQL和MSSQL)和客户数据库服务器之间的中间件,因此我们的数据已经处理完毕。 – prime31 2009-06-24 20:50:53

+0

Jas表示对数据库(或数据库中的数据)的更改无法使用恢复命令进行回滚。具有功能性的Web应用程序=数据库+代码一起工作。如果数据库具有不同的模式,回到(以前)功能性代码可能无法正常工作。 – Ted 2010-12-03 16:24:43

0

在我的经验中,“恢复”功能几乎是不可能维持,因为没有简单的方法来处理破坏性更新。也就是说,你绝对可以做得比svn up更好。至少,你希望在代码签出后运行脚本,这可以修补应用程序(对数据库进行更改等)。您可能想要将实际更新原子化为原子,因此我建议您将svn export添加到临时文件夹,然后在完成后更新符号链接以指向该文件夹。在运行补丁期间,您可能还想停止任何服务。

你可以考虑使用类似斯特拉努在一个包装精美包装了这一切。它带有一个漂亮的基于我们的gui(Webistrano)。

2

我是一个.NET的家伙,因此与在Windows世界的事情工作...话说回来,虽然我每日的基础上合作,共同管理构建过程的技术,从你的世界来了! (Linux/java技术在括号中,但是我也包括了它们与Windows读取器的等价物)我使用CruiseControl.NETCruiseControl),VisualSVNSVN),TortoiseNAntAnt)来照顾我所有的构建需求。

所有我的构建通常自动推并在检查的时间标记,这是通过CruiseControl的,因为它监视我的源控制(SVN或颠覆)来完成。当CruiseControl(CC)发现新代码已被检入时,它将执行一个CC项目,该项目又调用构建服务器上的Ant脚本。

Ant脚本在常见构建中为我做了几件事情。它将检出最新代码的副本并将其下载到构建服务器。然后它将构建代码以确保至少编译的东西。然后它设置我的数据库的干净副本,并执行任何SQL脚本以构建基准数据库直到当前版本。然后运行我所有的单元测试项目。然后运行集成测试,其中包括测试我的存储库层,以确保代码仍与我的后端对齐(我通常在我的项目中使用ORM,因此它们很少不同步......但这是一个很好的步骤正在进行中)。一旦所有测试都通过(或失败),我将数据库回滚到干净状态,并执行脚本以使其达到当前版本(这非常重要,因为它为团队提供了一个干净的数据库,以便在点击时进行开发的按钮)。如果构建成功,那么我会将代码部署到开发服务器(我也有一个点击部署到我的登台服务器和生产服务器)。如果您想在每次签到时标记您的代码库,那么您也可以在这里做到这一点。

一旦所有这些完成,我喜欢使用NDepend,NDocNCover对我的代码进行一些分析。 NDepend是一个代码分析工具,用于确保事物在架构上是正确的,命名标准是应该的,并且是一个全部更多。 NDoc提取所有代码注释并为我的代码创建MSDN样式文档。 NCover告诉我是否对我的代码进行了适当的单元测试。

然后,我写了一个自定义Ant任务,它解析了我的各种// TODO和// CodeDebt标记的所有代码,以生成另一份报告(通常在冲刺结束时)告诉我如何在我的代码库中建立了很多垃圾。这可以作为下一个冲刺的考虑因素。

所有这些报告都包含在构建电子邮件中,或者链接太适当。

请记住,所有上述情况发生在每次检查...并且没有任何人必须点击一个按钮!这是真正的持续集成,应该是每个构建主人的目标。

CruiseControl有一个基于web的控制台,它也允许非web开发人员(任何人)真正进入并执行这个推动,而不必检查代码......调用强制构建。

鉴于此框架,只要所有内容都受版本控制,就可以轻松地回滚推送。您需要另一个Ant脚本来执行相同的过程,但需要额外的第一个任务,因为它必须获取最新版本的代码,而不是最近版本来执行构建过程。所有的Ant任务都可以与不同的执行目标重用。

1

只是为了保持简单,给SpringLoops一试。这是一个托管的svn服务,可以选择部署(并恢复)到不同的服务器。它的使用和设置非常简单,免费版本可以让你部署到一台服务器上,但是如果你愿意付费,你可以部署到不同的服务器上(例如分段,开发和生产)。

您可以免费获得30天的任何软件包,因此您可以使用尽可能多的服务器进行测试。我不隶属于springloops。我只是使用它,并发现它很有用和简单。

2

Capistrano是一个很好的解决方案。尽管最初是为Ruby on Rails平台开发的,但我已经在许多PHP项目上成功地使用了它。它可以自动执行通过SSH执行的操作。部署是原子的,因为每个部署都检出到一个新目录。

通过使用符号链接打开当前副本。最新版本的源代码来自Subversion。您还可以设置静态配置文件以在生产环境中使用。

Capistrano也支持回滚,但如果您在部署之间进行数据库更改,则必须谨慎。考虑使用类似dbdeploy或rails migrations来解决此问题。