5

我目前正在为我的应用程序开发基于微服务的架构。我有一个 maven 多模块项目,它有很多服务,所以我可以使用 maven deploy 命令和maven docker plugin轻松地将它们部署到 docker hub 。

尽管如此,泊坞窗图像标签仍基于项目版本号,而我希望将它们标记为每个存储库的最后更改的修订号。目前,我正在尝试使用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>

module-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。为了更好地解释它,当我显示来自 tortoise 的 module-a 的属性时,我得到了这个:

在此处输入图像描述

我想要的是检索 3248,它指的是对模块 a 所做的最后一次真正更改,而不是 3257(工作副本),这是我从插件中得到的。这样,docker 插件就会知道它是否是不同的图像标签,并且只有在对 repo 中的模块进行了更改时才推送它。

4

5 回答 5

3
<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>

这对我有用。

于 2018-01-09T12:48:33.093 回答
3

我也无法让buildnumber-maven-plugin用于同样的场景。<useLastCommittedRevision>在 v1.4 和 v1.3 中不起作用,在某些情况下它不会返回最后更改的版本,而是返回倒数第二个。

您可以采取一种巧妙的解决方法来从svn info命令输出中获取最后更改的修订号。两个选项取决于您的 SVN 版本:

  1. 对于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>
    
  2. 对于早于 v1.9(在我的情况下为 v1.8.13)的 SVN 版本,您可以使用maven-antrun-plugin运行svn info --xml并将输出保存到属性中,并使用build-helper-maven-plugin解析该属性的内容一个正则表达式,匹配最后更改的修订号并将其保存到第二个属性中。

    我选择添加--xml参数是因为基本svn info输出会根据安装的语言进行翻译,但 xml 输出格式始终相同。

    <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="--xml"/>
                        </exec>
                    </target>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
            <execution>
                <id>regex-svn-last-rev</id>
                <goals>
                    <goal>regex-property</goal>
                </goals>
                <configuration>
                    <!-- Output property -->
                    <name>svn.last.rev</name>
                    <value>${svn.info}</value>
                    <regex>^[\s\S]*?commit[\s\S]*?revision=\"(\d+?)\"[\s\S]*?$</regex>
                    <replacement>$1</replacement>
                    <failIfNoMatch>false</failIfNoMatch>
                </configuration>
            </execution>
        </executions>
    </plugin>       
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifestEntries>
                    <SCM-Revision>${svn.last.rev}</SCM-Revision>
                </manifestEntries>
            </archive>
        </configuration>
    </plugin>
    
于 2018-03-21T11:35:11.623 回答
1

我认为你在这里错过的唯一一件事是

<doCheck>false</doCheck>

我认为应该是true

于 2017-08-02T19:18:59.780 回答
1

也偶然发现了这个问题,我觉得有必要深入了解它:这似乎是 buildnumber-maven-plugin 本身的一个相当老的问题: 实现“Last Changed Rev”而不是“Revision”字段

实际上已经提交了修复程序,但此后没有发布任何新版本。

最简单的选择是签出/下载代码并在本地构建,确保将其放入组织的中央存储库中。

如果这不是一个选项,请尝试使用 jitpack 直接获取最新版本作为 maven 依赖项: 我可以直接在 Maven 中使用 GitHub 项目吗?=> 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>
...
于 2020-07-06T09:21:02.050 回答
0

这是 maven-scm-provider-svnexe 中众所周知的错误。还是没有修好。

于 2020-04-14T15:49:37.290 回答