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 来实现这一点插件代替?
使用 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)
我知道这可能是一个问题/在你的情况下使用常规脚本是不可能的。但也许这是对你的问题的另一种看法。可能还有另一种解决方案。
(抱歉我的英语。但我希望我的意思可以理解)
| 归档时间: |
|
| 查看次数: |
20942 次 |
| 最近记录: |