我们在内部使用 Maven 和 Subversion。我们还使用 Maven 的 Release 插件。在执行以下(我认为是正确的)步骤时,我们注意到下面描述的问题。
1. 我们运行 release:prepare
:
- Maven 将主干版本更新为
1.0.0
。 - Maven 运行
svn copy trunk/myproject tags/myproject-1.0.0
,从而创建标签myproject-1.0.0
。 - Maven 将主干版本更新为
1.0.1-SNAPSHOT
。
2. 我们运行 release:rollback
:
- Maven 将主干版本重置为
1.0.0-SNAPSHOT
。 - Maven 不会删除标签,因为 Maven 不会做这种事情。
3. 我们对主干进行了更多更改,显然是针对版本 1.0.0-SNAPSHOT
。
4.我们再次运行release:prepare
:
- Maven 将主干版本更新为
1.0.0
。 - Maven 运行
svn copy trunk/myproject tags/myproject-1.0.0
,认为它创建了标签myproject-1.0.0
最新的行李箱。但是,唉,Subversion(1.6 和 1.7 类似)将代之以 Maven 的名义创建tags/myproject-1.0.0/myproject
。
5. 我们运行 release:perform
:
- Maven 检查标记
myproject-1.0.0
的内容。 - Maven 构建内容并将结果部署到 Nexus。
问题很明显:第 3 步中的更改没有进入标记。我们现在发布 1.0.0
,其中没有任何更改。
问题是:我们如何解决这个问题? Maven 的发布回滚功能是否天生就坏了?
最佳答案
公平地说,rollback
应该将项目和 SCM 重置为允许第二次 prepare
发生的状态。 这包括删除标签。答案现在很明显(谷歌搜索“maven release rollback remove tag”):
http://maven.apache.org/maven-release/maven-release-plugin/examples/rollback-release.html :
The created branch/tag in SCM for the release is removed. Note: This is not yet implemented so you will need to manually remove the branch/tag from your SCM. For more info see MRELEASE-229.
然后解决方案是强制 release:rollback
包含一个命令,使用类似 org.codehaus.mojo:exec-maven-plugin
的东西来删除 SCM 标签.除此之外,将 rollback
包装在一个在外部执行此操作的脚本中。
关于Maven 版本 : Prepare/Perform after Rollback incorrectly succeeds with wrong content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464598/