我正在与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脚本,但这些脚本总是在主服务器上执行。所以我的工作将无法在对我不起作用的奴隶上运行,因为我没有在主人身上执行构建。
答案 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插件的构建/发布管理功能为我们节省了数小时的这种悲伤。