从推导混帐分支行家神器版本(Deriving maven artifact version from

2019-07-04 03:55发布

我们有一个工作流程的要求,基本上意味着我们需要从混帐当前分支外部定义模块的神器版本。

也就是说,如果我们将在git的主分支,我需要<version>master-...</version> ,如果我们都在bugfixX分支,我需要<version>bugfixX-....</version>的将所生成的伪影为这个pom.xml的。

我以前发现https://github.com/koraktor/mavanagaiata可以提供SHA-1散列的属性,并将其从文档看来,它也可以提供分支,所以也许如果它可以运行早期足够这个过程中我们可以设置的属性,只是把<version>${our.version}</version> POM中。 如果这是可能的,我非常希望看到一个工作的pom.xml(并奖励500点赏金太)。

如果不是这样,我想我们正在进入或者预处理或“混帐结账”做一些钩子额外的魔法(我还没有尝试过,工作代码将是巨大的)。

我们大楼里这个功能我想咨询一下需要走模块之前,有一个顶层POM,它可以运行生成的属性文件中的“..”。

任何建议如何解决这个问题?

Answer 1:

事实上,Maven可以不与其他目标之一运行改变它自己的项目的版本。 在它的上面,因为据我所知,Maven的不支持在任意属性<version>标签。 因此,需要单独的执行来运行,这将改变POM的版本的目标。 有哪些可以做各种插件-这种情况下,一个可以使用的versions:set来自目标versions插件- http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html

所以,举例如下一个可以执行:

mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT

其中$branch变量包含当前的Git分支名称; 它可以与被提取git rev-parse ,这样的:

branch=$(git rev-parse --abbrev-ref HEAD)

但尽管如此,一个需要以某种方式执行。 您可以手动完成,但很繁琐。 所以,我的猜测是,的确是最强大的解决方案是从Git的一侧接近这一点。 那就是 - 一个Git挂钩。 下面是完整的Git post-checkout钩子将做的工作(相同的代码与上面一些过滤运行挂钩,只有当分支签出,不仅是单个文件):

#!/bin/bash

echo 'Will change the version in pom.xml files...'

# check if the checkout was to checkout a branch
if [ $3 != '1' ]
    then echo 'git checkout did not checkout a branch - quitting';exit
fi

# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT

# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version

echo 'Changed version in pom.xml files to $version'

将这个内容的文件PROJECTDIR\.git\hooks\post-checkout文件。 需要注意的是挂钩的文件应该是可执行文件运行它( chmod +x post-checkout )。

约几个音符versions插件-它是非常灵活,且支持多种选择,几乎没有其他目标可能会有帮助,这取决于你的项目结构(你用父母劲歌与否,做孩子的有自己的版本,还是他们从派生母等)。 因此,钩上面可能会略作修改通过使用从其他目标来支持您的具体情况下versions插件或指定的其他参数。

优点:

  • 强大的
  • 不需要在pom.xml任何改变文件本身,使这项工作
  • 这种“功能”可以简单地通过停用钩(删除或做出不执行)关闭 - 再次,需要在pom.xml没有变化

缺点:

  • 回购克隆后,应手动安装(或,你可以提供一个脚本安装钩子,如果假定的Git用户都不敢触碰.git目录里面的东西) - 一个不能强制他人使用挂钩。

UPDATE

此后是钩,这不仅将设置版本分支的名称,也将保留旧版本的后缀更复杂的版本。 例如,提供旧版本master-1.0-SNAPSHOT ,切换到feature1分支将改变项目版本feature1-1.0-SNAPSHOT 。 这个bash脚本的几个问题遭受(需要分支名称不破折号( -在名称),只需要根POM的版本),但可能会给如何挂钩可以延长一个想法:给MVN的混合和bash命令可以提取和更新相当多的POM中的信息。

#!/bin/bash

echo 'Will change the version in pom.xml files...'

# check if the checkout was to checkout a branch
if [ $3 != '1' ]
    then echo 'git checkout did not checkout a branch - quitting';exit
fi

# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)

# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')

# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)

# build new version
version=$branch-$suffix

# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version

echo 'Changed version in pom.xml files to $version'


Answer 2:

对不起,重振这个问题,并以非常最近另一种解决方案后,但有可能确实是动态地改变Maven版本,并使用一些git的功能,有点像git describe会做。

做这个项目是jgitver - Maven的插件 (免责声明;我的作者),它使用jgitver一个jgit基于库,以便从git的信息中得到行家的项目版本。

这是很容易的行家扩展使用

...
  <build>
      <extensions>
          <extension>
              <groupId>fr.brouillard.oss</groupId>
              <artifactId>jgitver-maven-plugin</artifactId>
              <version>0.1.0</version>
          </extension>
      </extensions>
     ...
  </build>
...

该扩展还可以用来作为一个插件扩展,然后让更多的配置,例如如果你不希望使用快照。 查看项目的全面使用场景的描述页面。

还有一个gradle这个插件可用,做或多或少是相同的。


[编辑1]:答案Thorbjb'rn Ravn的安德森评论

该插件不会修改原来的POM文件或文件的build.gradle。
对于Maven插件,修改在Maven的对象模型内存中完成,并都写入到临时目录中的临时文件。 该计算基于Git的元数据只(标记,提交,...)。
这不修改允许不污染git的历史。 当你感到满意了git的承诺,将其标记git tag -a xyzmvn deploy :这就是全部。
在项目文件的版本,现在是无用的,可以设置为0的例子。

截至今天,并且由于IDEA-155733与Maven插件的IntelliJ工作只是最近EAP版本。 日食和Netbeans的也没问题。




Answer 3:

免责声明:我是作者

我的Maven的核心扩展,无形中设置基于当前分支或者标记的版本。 只要你喜欢,你可以配置定制版本格式模式。

https://github.com/qoomon/maven-branch-versioning-extension

版本格式示例



Answer 4:

如果是足以设置在神器的文件名git的标签和版本信息,你可以使用Maven的jgit-buildnumber-插件 :

<build>
  <finalName>${artifactId}-${git.buildnumber}</finalName>
  <plugins>
    <plugin>
      <groupId>ru.concerteza.buildnumber</groupId>
      <artifactId>maven-jgit-buildnumber-plugin</artifactId>
      <version>1.2.7</version>
      <executions>
        <execution>
          <id>git-buildnumber</id>
          <goals>
            <goal>extract-buildnumber</goal>
          </goals>
          <phase>prepare-package</phase>
        </execution>
      </executions>
    </plugin>
    <!-- more plugins -->
  </plugins>
</build>


Answer 5:

你是否尝试过使用这个插件?: https://github.com/ktoso/maven-git-commit-id-plugin 。 你可以配置它来生成属性以及有关回购状态的所有相关信息文件:

  • 描述
  • 的commitid
  • buildUserName
  • buildUserEmail
  • 构建时
  • commitUserName
  • commitUserEmail
  • commitMessageShort
  • commitMessageFull
  • commitTime


Answer 6:

你检查过buildnumber - Maven的插件,它给你使用git的版本号的机会。 但是,你需要的东西不同。 此外,我会建议做的事情,如:

   1.0.0-SNAPSHOT 
   1.0.0-SNAPSHOT 

beeing上主

树枝上,你可以简单的改变的版本

  1.0.0-BF-SNAPSHOT 


Answer 7:

行家-3.5.0上有对$ {}修改$ {} SHA1和版本标签内$ {}更改列表属性的支持。 如果,例如要纳入的Git分支名称到版本的CI构建工作,此功能可能足以为你的目的。 见Maven的CI友好版本

基本上,在你的pom.xml通过更换固定的版本:

<version>${revision}${changelist}</version>

通过创建一个文件设置为项目中的根目录的修订变更列表默认值.mvn/maven.config包含:

-Drevision=1.2.3
-Dchangelist=-SNAPSHOT

检查该文件版本控制,当你碰到你的项目的修订更新。

在你的CI系统,你就可以覆盖使用的Git分支名称的清理后表示变更表变量,例如。

BRANCHNAME=$(git rev-parse --abbrev-ref HEAD | sed -E -e 's@[^0-9A-Za-z.-]+@-@g')
mvn clean install -Dchangelist="-${BRANCHNAME}"

(您可能更喜欢git symbolic-ref --short HEAD用于获取的分支名称,因人而异)

你的神器由分支的CI系统内置feature/branchname届时将有一个版本分支的后缀,如:

yourproject-1.2.3-feature-branchname.jar

而谁不使用任何替代仍然会打造为开发者:

yourproject-1.2.3-SNAPSHOT.jar


文章来源: Deriving maven artifact version from git branch