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

时间:2018-04-20 08:59:25

标签: 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>

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

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

  

平方米\库\ COM \ mytest的\测试\测试标签\ $ {修订} \测试标签 - $ {修订}的.jar

我试图默认&#39;修订&#39;使用以下值:

<properties>
  <revision>1.0.1</revision>
</properties>

但是然后设置该值的groovy代码没有效果。

我还尝试了maven groovy插件的不同阶段,没有运气。我错过了什么吗?有人可以帮我这个吗?

我想提一下,因为vatbub和StefanHeimberg提到我可以使用版本:设置版本但这要求我对GIT做一个额外的提交,我试图避免,想知道我是否可以实现这是通过写一个maven插件而不是?

2 个答案:

答案 0 :(得分:1)

使用Maven,您可以使用

在构建时设置版本
mvn versions:set -DnewVersion=${bamboo.inject.version}

正如vatbub已在你的问题中评论过。

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

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

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

下一步是将此文本文件注入Build Pipeline并按上述方式调用版本插件

<强>的pom.xml

类似

<project>

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

</project>

<project>

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

</project>

第1步:

./generate_version_txt.sh ${bamboo.buildNumber}

第2步:

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

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

例如${bamboo.inject.long_version}

第3步:

更新Maven Project版本

mvn versions:set -DnewVersion=${bamboo.inject.version}

第4步:

运行Maven Build

mvn clean verify

第5步:

运行Docker build

例如,

也将它用作docker标签版本。等...

docker build --build-arg version=${bamboo.inject.version} --tag your-awesome-app:${bamboo.inject.version} .

示例Dockerfile:

FROM jboss/wildlfy
ARG version
ADD target/your-awesome-app-${version}.war /opt/jboss/wildfly/standalone/deployments/

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

(对不起我的英语。但我希望我的意思是可以理解的)

答案 1 :(得分:0)

我遇到了一个类似的问题,最终使用maven flatten plugin来确保所有变量在部署之前都已从POM中删除。这将删除对字符串$ {revision}的所有引用,并在构建时将其替换为实际值,而不会干扰原始POM。