我正在尝试在我们的项目中实现语义版本控制。我测试了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插件而不是?
答案 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。