如何在构建时在maven中设置项目版本?

xbm*_*ono 6 java groovy maven-3

我正在尝试在我们的项目中实现语义版本控制。我测试了 Maven semver 插件,但这对我没有帮助,所以请不要问我为什么。我最终使用了 Maven Groovy。它的工作原理就像一个魅力,但是,当我安装或部署 Maven 项目时,存储库中的版本是变量名称。

尽管所有工件和 jar 文件都以正确的版本打包,但情况仍然如此。

所以请看看我的pom.xml

<?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">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mytest.test</groupId>
    <artifactId>test-tag</artifactId>
    <version>${revision}</version> 


    <description>Test</description>

    <properties>
        <ChangeType>TO_BE_SET</ChangeType>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.gmaven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>1.5</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <providerSelection>2.0</providerSelection>
                            <properties>
                                <script>git describe --abbrev=0 --tags</script>
                            </properties>
                            <source>
                                def tagIt = 'git tag -a vXXXX -m "Auto tagged"'
                                def changeType = project.properties.ChangeType
                                def command = project.properties.script
                                def process = command.execute()
                                process.waitFor()
                                def describe = process.in.text.trim()
                                println "Setting revision to: " + describe

                                if(!describe.startsWith("v")) {
                                    describe = "1.0.1"
                                } else {
                                    describe = describe.substring(1)
                                }

                                    project.properties.setProperty('revision', describe)


                            </source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-compile</id>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>default-testCompile</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-testResources</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-jar</id>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-test</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
Run Code Online (Sandbox Code Playgroud)

版本是 ${revision} 是在 groovy 脚本中设置的变量名称。Groovy 代码的作用是从 GIT 获取最后一个标签,然后将其设置为属性“revision”。

最终的 jar 文件提取了正确的版本,但是当安装到存储库中时,文件夹名称和 jar 名称如下:

m2\repository\com\mytest\test\test-tag\${revision}\test-tag-${revision}.jar

我尝试使用以下方法将“修订”默认为一个值:

<properties>
  <revision>1.0.1</revision>
</properties>
Run Code Online (Sandbox Code Playgroud)

但随后设置该值的常规代码不起作用。

我还尝试了 Maven Groovy 插件的不同阶段,但没有成功。我错过了什么吗?有人可以帮我解决这个问题吗?

我想提一下,正如 vatbub 和 StefanHeimberg 提到的,我可以使用 versions:set 来设置版本,但这需要我对 GIT 进行额外的提交,这是我试图避免的,想知道我是否可以通过编写 Maven 来实现这一点插件代替?

Ste*_*erg 7

使用 Maven,您可以在构建时设置版本

mvn versions:set -DnewVersion=${bamboo.inject.version}
Run Code Online (Sandbox Code Playgroud)

正如@vatbub 已经在你的问题中评论过的那样。

除此之外,我编写了一个 Shell 脚本,可在构建管道中使用,根据 Maven 项目版本生成版本,并添加来自构建服务器的构建号。

https://gist.github.com/StefanHeimberg/c19d7665e8df087845c036fe8b88c4f2

该脚本读取 Maven 项目版本,添加内部版本号并写入包含所有可以使用的新编号的文本文件。

下一步是将此文本文件注入到构建管道中并调用版本插件,如上所述

pom.xml

就像是

<project>

    <groupId>ch.stefanheimberg.example</groupId>
    <artifactId>your-awesome-app</artifactId>
    <version>5.1.2-SNAPSHOT</version>

</project>
Run Code Online (Sandbox Code Playgroud)

或者

<project>

    <groupId>ch.stefanheimberg.example</groupId>
    <artifactId>your-awesome-app</artifactId>
    <version>5.1-SNAPSHOT</version>

</project>
Run Code Online (Sandbox Code Playgroud)

步骤1:

./generate_version_txt.sh ${bamboo.buildNumber}
Run Code Online (Sandbox Code Playgroud)

第2步:

在构建系统中注入生成的 version.txt,所有属性都可以在所有任务/插件等中使用...

在我的例子中,Bamboo CI 准备好 version.txt 文件,并将文件的内容声明为bamboo.inject.前缀下的环境变量。

例如${bamboo.inject.long_version}

步骤3:

更新 Maven 项目版本

mvn versions:set -DnewVersion=${bamboo.inject.version}
Run Code Online (Sandbox Code Playgroud)

步骤4:

运行 Maven 构建

mvn clean verify
Run Code Online (Sandbox Code Playgroud)

第5步:

运行 Docker 构建

例如,也可以将其用作 docker 标签版本。ETC...

docker build --build-arg version=${bamboo.inject.version} --tag your-awesome-app:${bamboo.inject.version} .
Run Code Online (Sandbox Code Playgroud)

Dockerfile 示例:

FROM jboss/wildlfy
ARG version
ADD target/your-awesome-app-${version}.war /opt/jboss/wildfly/standalone/deployments/
Run Code Online (Sandbox Code Playgroud)

我知道这可能是一个问题/在你的情况下使用常规脚本是不可能的。但也许这是对你的问题的另一种看法。可能还有另一种解决方案。

(抱歉我的英语。但我希望我的意思可以理解)