【问题标题】:Getting unique version numbers with Jenkins and Maven使用 Jenkins 和 Maven 获取唯一的版本号
【发布时间】:2013-09-06 18:32:04
【问题描述】:

我正在与 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”命令的版本号。

我的 groovy 脚本:

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

【问题讨论】:

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


    【解决方案1】:

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

    在我的公司,我们通过以下两种方法之一解决了这个问题:

    选项 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 插件的构建/发布管理功能为我们节省了很多时间。

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2023-04-04
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多