Maven Mercurial发布流程

时间:2012-02-02 05:50:38

标签: mercurial branch dvcs release-management

我们最近改用了Mercurial。看完这段有用的视频后: http://www.youtube.com/watch?v=-k2vLKOUb8s&noredirect=1

我正在尝试实现允许以下内容的发布过程: - maven发布独立于正在进行的开发工作 - 补丁发布版本,然后将修复程序推送回dev

到目前为止,我已经想出了这个: Repo Arch

这允许我们在dev repo上继续开发的同时对稳定的仓库进行释放。

我遇到的问题是使用maven发布插件。如果我发布1.0.0-SNAPSHOT,我最终会在稳定的回购中得到以下结果: 1.0.0-SNAPSHOT-> 1.0.0-> 1.1.0-SNAPSHOT

现在我可以将其推回到dev repo并继续开发1.1.0-SNAPSHOT。到目前为止一切都很好。

但是管理1.0.0版本和后续补丁的最佳方法是什么?我应该从1.0.0提交点或另一个克隆创建一个分支吗?是否有其他方法来管理它,以便开发1.0.1修复程序可以轻松应用它并将修复程序推回到dev?

2 个答案:

答案 0 :(得分:3)

你的设置听起来不错。我会根据1.0.0版本的变更集创建一个新的long-term named branch。保留development on the default branch并为每个版本创建分支。

在这里,我在POM的上方和下方写下版本号,并将分支名称一直写到左侧:

          1.0.0-SNAPSHOT    1.0.0    1.1.0-SNAPSHOT
default:  o --- o --- o --- o ------ o --- o --- o --- o --- o --- o
                             \                              /
1.0.x:                        o --- o --- o --- o -------- o --- o --- o
                              1.0.1-SNAPSHOT    1.0.1      1.0.2-SNAPSHOT

因此,您使用default分支在1.0.0-SNAPSHOT版本上愉快地工作。在发布的时候,插件会在1.0 {0}时立即生成一个变更集,并在default分支上立即生成另一个变更集1.1.0-SNAPSHOT。

您现在或以后可以分支1.0.x版本 - 无关紧要。当你做分支时

$ hg update 1.0.0  # <- this is a tag
$ hg branch 1.0.x
# edit the POM to change version to 1.0.1-SNAPSHOT
$ hg commit -m "Started 1.0.x branch"

开发人员现在可以随时使用

$ hg update 1.0.x  # <- this is a branch

获取该分支上的最新变更集,并hg update default返回主要开发线。在1.0.x分支上提交变更集时,您需要将它们合并回default,以便在那里修复错误:

$ hg update default
$ hg merge 1.0.x
$ hg commit -m "Merge in bugfix-123 from 1.0.x"

现在,您服务器上的一个或两个存储库之间的选择主要是无关。您可以使用命名分支来区分稳定的变更集(它们位于1.0.x)和不太稳定的变更集(它们位于default上)。但是,为每个稳定版本在服务器上保留存储库通常很有意义。您可以在Jenkins中设置作业或使用cronjobs来执行

$ cd foo-1.0.x
$ hg pull --branch 1.0.x

定期,以便克隆保持最新。你也可以在主dev开发中创建一些changegroup钩子:

[hooks]
changegroup.1.0.x = hg push --branch 1.0.x ../foo-1.0.x
changegroup.1.1.x = hg push --branch 1.1.x ../foo-1.1.x

开发人员必须等到钩子完成,但是当你在本地存储库之间推送时它应该很快。如果这是一个问题,请使用异步同步机制(Jenkins,cronjob,...)。

答案 1 :(得分:0)

publication workflow的角度来看,最好在专用分支中isolate any hotfix(可以从repo到repo推送)或repo(如果你想避免'命名分支')。