如何让Maven自动使用git status作为版本号的一部分?

时间:2017-05-18 18:01:37

标签: git maven

这个问题是更广泛的Automatically incrementing a build number in a Java project

的更窄版本

具体来说,我希望Maven生成格式major.minor.sequence的版本,其中major.minorpom.xml中是硬编码的,但sequence编号是从git rev-list HEAD --count的输出中获得的命令git status。我还想追加字符串" -WIP"如果nothing to commit, working tree clean不包含单词{{1}}。

实现这一目标的最简单方法是什么?

2 个答案:

答案 0 :(得分:0)

好吧,我想如果你真的希望它以这种方式工作,你必须在运行相应mvn命令的git命令周围编写一个包装器,计算版本字符串后缀,并在调用真正的-Dversion.suffix=可执行文件时将其作为mvn选项传递。

(然后在你的pom中你将版本设置为3.7.${version.suffix}。)

如果可以找到用于编写脚本的等效接口,那么您可能应该确保避免使用人为目标接口(如字符串“无需提交,工作树清理”)。 (例如,查看--porcelain文档中git status选项的输出格式:https://git-scm.com/docs/git-status

那就是说,你确定这是个好主意吗?无法保证提交的数量是严格增加的值,如果您有多个开发人员,则最终可能会使用相同版本号的不同版本。 Maven的-SNAPSHOT约定并没有给你你所寻找的特异性,但是或多或少存在以承认你所寻找的特异性通常比它的价值更麻烦......

答案 1 :(得分:0)

为此,Maven 3.5.0中有一个解决方案,您可以将${sha1}${changelist}${revision}用于此类目的。可以是其中一个,也可以将它们组合在一起。

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}${sha1}${changelist}</version>
  ...
  <properties>
    <revision>1.3.1</revision>
    <changelist>-SNAPSHOT</changelist>
    <sha1/>
  </properties>
</project>

通过使用上述内容,您只需使用以下命令构建应用程序:

mvn clean package

但也可以这样做:

mvn -Drevision=2.7.1 clean package

根据您的示例,您可以使用:

mvn -Dsha1=-XXXX clean package

其中XXXX可以替换为从Git(描述)中提取的信息,或者甚至更好地使用来自Jenkins(GIT_REVISION等)的信息。

非常重要的提示使用flatten-maven-plugin,如ci friendly documentation page中所述。