我目前正在为我的应用程序开发基于微服务的架构。我有一个maven多模块项目,它有很多服务,所以我可以使用maven deploy命令和maven docker plugin轻松地将它们部署到docker hub。
仍然,docker镜像标签基于项目版本号,而我希望用每个存储库的最后更改版本号标记它们。从现在开始,我只是想使用buildnumber-maven-plugin将此字段添加为清单条目:
让我们说这是我的多模块项目:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
...
</project>
模块-a的模型是:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<scm>
<connection>scm:svn:http://myrepo.com/svn/application/module-a</connection>
</scm>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>true</doUpdate>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<SCM-Revision>${buildNumber}</SCM-Revision>
</manifestEntries>
</archive>
</configuration>
</plugin>
....
</plugins>
</build>
<dependencies>
...
</dependencies>
</project>
问题是{buildNumber}的计算结果是我的工作副本号,它是指对存储库而不是scm:svn:http://myrepo.com/svn/application/module-a
位置的最后一次提交。为了更好地解释它,当我显示来自乌龟的module-a的属性时,我得到了这个:
我想要的是检索3248,它指的是对模块-a进行的最后一次真正的更改,而不是3257(工作副本),这是我从插件中获得的。这样,docker插件就会知道它是否是一个不同的图像标记,只有在回购中对模块进行了更改时才推送它。
答案 0 :(得分:1)
我认为你唯一遗漏的是
<doCheck>false</doCheck>
我认为它应该是true
。
答案 1 :(得分:1)
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>true</doUpdate>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</plugin>
这对我有用。
答案 2 :(得分:1)
我也偶然发现了这个问题,因此不得不深究它: 在buildnumber-maven-plugin本身中,这似乎是一个相当老的问题: Implement "Last Changed Rev" instead of "Revision" field
实际上已提交了一个修复程序,但是此后没有发布任何新版本。
最简单的选择是检出/下载代码并在本地构建,确保将其放入组织的中央存储库中。
如果这不是一个选项,请尝试jitpack直接获取最新版本作为maven依赖项: Can I use a GitHub project directly in Maven? => https://stackoverflow.com/a/28483461/167865
...
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
...
<dependency>
<groupId>com.github.mojohaus</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>e74e373</version>
</dependency>
...
答案 3 :(得分:0)
我无法获得 buildnumber-maven-plugin 来为同一场景工作。 <useLastCommittedRevision>
在v1.4和v1.3中不起作用,它不返回上次更改的修订版,但在某些情况下是倒数第二个版本。
您可以使用狡猾的解决方法从svn info
命令输出中获取最后更改的修订号。两个选项取决于您的SVN版本:
对于 SVN v1.9 或更新版本,请使用 maven-antrun-plugin 运行svn info --show-item=last-changed-revision
并将输出保存到属性中。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<exportAntProperties>true</exportAntProperties>
<target>
<exec executable="svn" outputProperty="svn.info">
<arg value="info"/>
<arg value="--show-item=last-changed-revision"/>
</exec>
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<SCM-Revision>${svn.info}</SCM-Revision>
</manifestEntries>
</archive>
</configuration>
</plugin>
对于早于v1.9的SVN版本(在我的情况下为v1.8.13),您可以使用 maven-antrun-plugin 来运行{{1}并将输出保存到属性中,并使用 build-helper-maven-plugin 使用正则表达式解析该属性的内容,匹配上次更改的修订版号并将其保存到第二个属性中。
我选择添加 - xml 参数,因为根据安装语言翻译了基本svn info --xml
输出,但xml输出格式始终相同。
svn info
答案 4 :(得分:0)
这是maven-scm-provider-svnexe中的著名错误。仍然没有解决。