4

从 svn 到 hg,我们都很兴奋,随着开发工作流程或多或少地被淘汰,这里仍然是最困难的部分 - 暂存和集成系统。

希望这个问题比你常见的“我如何从 xxx 移动到 Mercurial”更进一步。请原谅冗长且可能写得不好的问题:)

我们是做很多项目(主要是 PHP 和 Zend)的网上商店,所以我们有一个巨大的 svn 存储库,有大约 100 多个文件夹,每个文件夹代表一个项目,当然还有它自己的标签、分支和主干。在我们的集成和测试服务器(QA 和客户查看工作结果和测试内容)上,一切都非常自动化 - Apache 设置为自动选择新项目,为每个项目/主干创建虚拟主机;mysql 迁移脚本也在主干中,开发人员可以通过简单的 Web 界面应用它们。长话短说,我们的工作流程现在是这样的:

  1. 签出代码,工作,提交
  2. 通过 Web 界面在服务器上运行更新(这基本上在特定项目的服务器上进行 svn up,如果需要,还运行 db-migration 脚本)
  3. 服务器上的 QA 更改

当我们有 2 个以上的开发人员在处理相同的代码时,这种方法对于大型项目肯定不是最佳的。svn 中的分支只会引起更多的头痛,好吧,因此转向 Mercurial。这就是问题所在 - 如何为此类工作组织有效的登台/集成/测试服务器(您有很多项目,比如单个开发人员可能在 1 天内处理 3 个不同的项目)。

我们决定基本上使用“默认”分支跟踪生产,然后在各个分支中进行所有更改。但是在这种情况下,我们如何为每个分支自动进行分段更新?如果早期对于一个项目,我们几乎总是在主干上工作,所以我们需要一个 DB、一个虚拟主机等。现在我们可能会讨论每个项目的 N 个数据库、N 个虚拟主机配置等。那么 CI 的东西呢(例如运行 phpDocumentor 和/或单元测试)?它应该只在“默认”上完成吗?在树枝上?

我想知道其他团队如何解决这个问题,也许是我们没有使用或忽略的一些最佳实践?

补充笔记:

可能值得一提的是,我们选择 Kiln 作为 repo 托管服务(主要是因为我们无论如何都在使用 FogBugz)

4

2 回答 2

3

这绝不是您最终会选择的完整答案,但这里有一些工具可能会影响它:

  • 没有工作目录的存储库——如果你clone -Uhg update null你得到一个没有工作目录的存储库(只有 .hg)。它们在服务器上更好,因为它们占用的空间更少,而且没有人想在那里编辑
  • changegroup挂钩

对于最后一个,changegroup只要一个或多个变更集通过推送或拉取到达,挂钩就会运行,您可以让它做一些有趣的事情,例如:

  • 根据到达的内容将变更集推送到另一个仓库
  • 更新接收仓库的工作目录

例如,仅使用上述工具就可以自动化这样的事情:

  1. 开发人员将五个变更集推送到 central-repo/project1/main
  2. 最后一个变更集在分支'my-experiment'上,因此 csets 会自动重新推送到可选创建的 repo central-repo/project1/my-experiment
  3. central-repo/project1/my-experiment 自动执行hg update tip,这肯定在my-expiriment分支上
  4. central-repo/project1/my-experiment 自动在其工作目录中运行测试,如果测试通过,则执行部署的“make dist”,这也可能设置数据库和虚拟主机

最重要的是,mercurial 书中的第 10 章涵盖了这一点,即不让用户等待该过程。您希望用户推送到包含可能正常代码的存储库,并且自动处理的执行 CI 和部署工作,如果它通过最终成为可能正常的存储库。

在我工作过的最大的 mercurial 设置中(大约 20 位开发人员),我们的 CI 系统(Hudson)定期从可能正常的 repos 中提取每个分支,然后构建和测试,并分别处理每个分支.

底线:设置所需的所有工具可能已经存在,但是将它们粘合在一起将是一次性的工作。

于 2010-07-15T21:19:10.600 回答
2

您需要记住的是DVCS(与 CVCS 相比)为版本控制引入了另一个维度:
您不必再依赖分支(并从正确的分支获取暂存工作区)
您现在拥有 DVCS 的发布工作流程(回购之间的推/拉)

这意味着您的暂存环境现在是一个仓库(包含项目的完整历史记录),在某个分支上签出:
许多开发人员可以将许多不同的分支推送到该暂存仓库:协调过程可以在该仓库中单独完成,在您选择的“主要”分支。
或者他们可以在他们的仓库中拉出那个暂存分支并在推回之前测试一下。

替代文字
来自 Joel 关于 Mercurial HgInit的教程

开发人员不必提交给其他人看到:DVCS 中的发布过程允许他/她首先拉出暂存分支,在本地协调任何冲突,然后推送到暂存存储库。

于 2010-07-15T21:08:40.633 回答