使用Jenkins和Maven获取独特的版本号

时间:2013-09-03 13:33:02

标签: maven groovy jenkins continuous-integration build-automation

我正在与Jenkins合作开发一个多模块maven项目。我有一个Build-Job,我想用一个唯一的版本号打包我的项目并将其部署到Nexus。

版本号应为 - 其中“maven-version”是根POM中维护的版本,“build-number”是Jenkins的作业版本号。例如:1.2.3-1234

我正在使用maven-versions-plugin来设置所需的版本号,但我遇到的问题是我希望在POM中维护版本(1.2.3)的第一部分。所以我需要一种方法将POM中的版本分配到Jenkins环境变量中。

直到我找不到这样做的直接方法。我的解决方案是使用一个groovy脚本,它削减POM并将版本号写入临时属性文件。之后,我使用EnvInject插件创建环境变量,以便以后重新注入“mvn versions:set”命令的版本号。

我的常规剧本:

import jenkins.util.*;

def project = new XmlSlurper().parse(new File("pom.xml"))

def version = project.version.toString();
def mainversion = version.substring(0, version.indexOf("-SNAPSHOT"));

println "Version: $mainversion";

def versionFile = new File("v.properties");
versionFile << "VERSION=$mainversion"; 

通过属性文件的这种间接是非常难看且容易出错的。有没有办法在groovy脚本中直接创建环境变量?可以使用系统groovy脚本,但这些脚本总是在主服务器上执行。所以我的工作将无法在对我不起作用的奴隶上运行,因为我没有在主人身上执行构建。

1 个答案:

答案 0 :(得分:1)

欢迎使用另一个版本的Jenkins Chain上游 - 下游变量问题。我假设您可能正在尝试进行某种持续集成管道。

在我的公司,我们解决了以下两种方式之一:

选项1:通过执行sed搜索来强制执行并在开头替换为执行shell:

#sed -i '0,/<version>.*<\/version>/s/<version>.*<\/version>/<version>'${SVN_REVISION}'<\/version>/g' pom.xml;
#sed -i '0,/<name>.*<\/name>/s/<name>.*<\/name>/<name>'"${JOB_NAME}"'<\/name>/g' pom.xml;
#find . -name pom.xml | xargs sed -i 's/${build.number}/'${SVN_REVISION}'/g';

选项2:使用Artifactory而不是Nexus并支付Artifactory Pro。 Artifactory jenkins插件的构建/发布管理功能为我们节省了数小时的这种悲伤。