从Subversion迁移到Mercurial - 如何调整工作流程和登台/集成系统?

时间:2010-07-15 20:40:36

标签: mercurial continuous-integration installation staging

我们从svn到hg都感到非常兴奋,并且由于开发工作流程或多或少被淘汰,这里仍然是最困难的部分 - 分段和集成系统。

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

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

  1. 结帐代码,工作,提交
  2. 通过Web界面在服务器上运行更新(这基本上可以在特定项目的服务器上运行,并在需要时运行db-migration脚本)
  3. 服务器上的QA更改
  4. 当我们有2个以上的开发人员使用相同的代码时,这种方法对于大型项目来说肯定不是最理想的。 svn中的分支只会导致更多的头痛,因此转移到Mercurial。这就是问题所在 - 如何为这类工作组织有效的登台/集成/测试服务器(你有很多项目,比如单个开发人员可以在1天内完成3个不同的项目)。

    我们决定基本上进行'默认'分支跟踪生产,然后在各个分支中进行所有更改。在这种情况下,我们如何自动化每个分支的暂存更新?如果早期的一个项目我们几乎总是在trunk上工作,那么我们需要一个DB,一个vhost等等。现在我们可能会讨论每个项目的N数据库,N-vhost配置等等。那么CI的东西(比如运行phpDocumentor和/或单元测试)?它应该只在'默认'上完成吗?在树枝上?

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

    附加说明:

    可能值得一提的是,我们选择了Kiln作为回购托管服务(主要是因为我们还在使用FogBugz)

2 个答案:

答案 0 :(得分: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”部署,这可能会设置数据库和vhost
  5. biggie和mercurial书中的第10章涵盖了这一点,就是不让用户等待这个过程。您希望用户推送到包含可能正常代码的repo,并且自动处理的CI执行CI并部署工作,如果它通过则最终成为可能的回购。

    在我工作过的最大的mercurial设置中(20个左右的开发人员)我们已经达到了这样的程度:我们的CI系统(Hudson)每次定期从可能的ok存储库中提取,然后进行构建和测试,以及处理每个分支分开。

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

答案 1 :(得分:2)

您需要记住的是DVCS (vs. CVCS)为版本控制引入了另一个维度:
您不必再依赖 进行分支(并从右侧分支获取暂存工作区)
您现在使用DVCS publication workflow (在回购之间推/拉)

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

alt text http://hginit.com/i/02-repo.png
来自Joel关于Mercurial的教程 HgInit

开发人员无需提交给其他人查看:publication process in a DVCS允许他/她首先拉出暂存分支,在本地协调任何冲突,然后然后推送到分期回购。