9

拥有“一键构建”来将您的更改从开发环境转移到实时服务器是一件非常好的事情,并且经常被提倡。

我加入了一个在 LAMP 堆栈中运行的小团队,并使用 SVN 进行版本控制,目前部署在单个生产服务器上(另一个用于开发的服务器,很快将成为一个单独的 mysql 服务器)。我刚刚完成了很多在我加入之前缺少的组织方面的事情。

我很好奇

  1. 人们目前是如何做到这一点的(一步构建)
  2. 看看我如何才能最适合我的情况(小团队,带有 SVN 的 LAMP 环境)

我感兴趣的一些特殊挑战是处理数据库更改(模式),以及人们是否以及使用什么样的“包”来保持事物的组织性(例如 RPM、PEAR 等)。

4

8 回答 8

7

我们将antHudson一起使用。像魅力一样工作。

Hudson 也可以与其他构建系统一起工作,而不仅仅是 Java 项目。它允许您设置多个构建目标,并将自动或手动运行它们。它还强制您实现一种从单个命令运行构建的方法。

它不能解决在为已部署的服务器运行构建期间服务器将不可用的通信问题。

对于我们的模式更新和更改,我们设置我们的 ant 脚本来做两件事:

  1. 仅当 SVN 存在差异时更新运行模式。
  2. 在构建架构更改后签入架构转储。
  3. 如果架构没有更新,只需使用转储加载数据库

确实需要几次尝试才能做到正确,但突然间我们解决了多个开发人员使用不同模式的问题。导入转储以更新您的开发模式非常容易,您可以每天都这样做。

于 2009-06-15T00:09:16.350 回答
2

我们的确是。我们使用名为Anthill Pro的产品来完成我们所有的构建和部署。它有一个工作流程,用于检查文件、进行构建、运行单元测试,然后将代码部署到服务器。您可以使用它来部署几乎任何东西,因为该过程可以运行命令行程序等。

于 2009-06-15T00:18:24.767 回答
2

我认为这没有简单的食谱答案,因为这在很大程度上取决于您的环境。无论您想出什么,我都强烈推荐一种基于脚本的方法,部署脚本本身就在源代码控制中。这些脚本还将允许与构建解决方案更好地集成(见下文)。

在生产环境中运行的最简单的此类脚本就是从源代码控制获取最新(或获取特定版本)的命令。

下一个挑战是数据库部署。对于中小型项目,我最喜欢的解决方案是在每个数据库中维护一个模式版本表,并将所有 DDL 和数据更新脚本放在源代码控制中(包括它们在压缩档案中使用的数据源)。脚本是连续编号的(从 000001 ...、000002 ...等开始),我运行的部署脚本只是首先备份现有数据库,然后从架构版本表中获取上次运行的数据库脚本,然后运行在源代码控制中以正确顺序找到的任何新数据库脚本,相应地更新架构版本表。

这种方法使我可以非常快速地从头开始重建数据库。

这两种方法结合在一起可以将您的代码库快速部署到几个不同的登台机器、您的 QA 环境、测试版等。


对于稍微复杂一点的场景,您应该运行一个持续集成构建服务器,例如 Kieveli 等。人。建议,它基本上定期“重建”您的整个部署,因此包含脚本来完全执行您将在上面“手动”运行的内容。

通过为每个数据库脚本创建一个回滚脚本,也可以使数据库部署更加复杂。然后,您应该编写一个小控制器应用程序来处理这些问题。这类东西有几种 OSS 解决方案,其中一种可能适合您的需求。

但是,请确保您永远不会将数据库自动部署到生产环境;-)

于 2009-06-15T00:23:56.843 回答
2

PHP 项目的最佳构建工具可能是Phing,它与 Ant 非常相似,但是是用 PHP 编写的。它包含你需要的所有必要的东西,比如从你的 svn repo 中抓取东西。

于 2009-06-15T00:24:44.520 回答
1

UNIX(和 Windows)上的“make”是你的朋友。虽然它有一个学习曲线,但它是值得的。您可以让更新源、编译、测试等。

于 2009-06-15T00:20:13.297 回答
0

一步构建完成后,您可以轻松地将其转变为连续构建。

我们已经在中央服务器上获得了所有已完成的构建,并标有构建它们的更改编号。当某些事情被提交时(我们使用 Perforce,但这适用于 SVN),我们的一个构建框上的 cronjob 注意到有一个比构建更新的更改,触发下载源树的 http 请求,并开始构建(主要是使用 GMake)。只需几个简单的步骤即可持续构建 :)

之后,只需一小步即可自动运行所有测试自动化。每次提交后完全构建和测试(可能可部署!)的代码。

于 2009-06-15T02:52:05.053 回答
0

对于脚本语言,使用 ant-variant 或 CruiseControl 变体等通常的建议意义不大,因为您不需要编译任何东西。

让我们坚持数据库。在持续集成方面,三个重要的事情是自动化、自动化和自动化。这意味着您必须拥有从构建空数据库、从外部数据导入以及升级到脚本化的新版本并准备好使用某些脚本运行的所有内容。一个很好的例子可能是 MediaWiki,它让您可以使用 php 本身进行配置和安装。我建议在白天运行构建服务器以部署新数据库,运行单元测试并在任何失败时发送电子邮件。

于 2009-06-15T03:04:48.893 回答
0

我认为它的方式是您希望一个脚本将所有内容组合在一起,基本上从源代码管理中获取所有文件\资源,然后执行所有步骤以创建最终的“产品”

在我的脑海中,这些步骤可能包括获取最新版本、编译、获取完成产品所需的任何其他文件、创建安装程序(如果需要)、运行单元测试、在服务器上共享输出(无论这对特定项目意味着什么) ,并通知用户已经创建了一个新版本(或者告诉他们如果没有,以及为什么)。以及您可能需要做的任何其他事情。

过去,我通常从某种批处理文件开始,然后创建某种定制的构建器 exe。但保持这种状态总是很痛苦。最终,我将一个应用程序移至第 3 方应用程序……现在我只使用以下两种产品之一。

http://www.kinook.com/VBP/

http://www.finalbuilder.com/

于 2009-06-15T03:15:55.417 回答