maven - 使用 Jenkins 和 Maven 获取唯一版本号

标签 maven groovy jenkins continuous-integration build-automation

我正在使用 Jenkins 开发一个多模块 Maven 项目。我有一个构建作业,我想用唯一的版本号打包我的项目并将其部署到 Nexus。

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

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

直到现在我还没有找到直接的方法来做到这一点。我的解决方案是使用常规脚本来削减 POM 并将版本号写入临时属性文件。之后我使用 EnvInject用于创建环境变量的插件,以便稍后作为“mvn versions:set”命令的版本号重新注入(inject)。

我的常规脚本:

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 脚本,但这类脚本总是在主服务器上执行。所以我的工作将无法在对我不起作用的从站上运行,因为我不在主站上执行构建。

最佳答案

欢迎来到另一个版本的 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 插件的构建/发布管理功能为我们节省了数小时的此类悲伤。

关于maven - 使用 Jenkins 和 Maven 获取唯一版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18593709/

相关文章:

jenkins - 如何连接 Jenkinsfile 中的字符串?

android - 如何单独构建 SQLite 数据库并在 maven build 中 bundle 到 android 应用程序

java - 具有相同包名称和相同类名称的两个不同的 .jar。如何得到那个?

java - 仅从 Maven 测试调用 init 方法失败 ested 异常为 java.lang.UnsupportedOperationException

groovy - 没有脚本Elasticsearch的部分更新文档

java - 仅从命令行获取系统属性列表

java - Jenkins 或 Maven 在类路径上放置了错误的tools.jar

android - 使用 Maven Jarsigner 签名 APK 时出错

multithreading - 常规/ chalice : pass parameter to thread

jenkins - 当构建队列超过特定长度时如何发送警告电子邮件?