从Jenkins的Maven POM获取项目版本

Eng*_*_DJ 52 maven jenkins

在处理POM之后,Jenkins构建是否有任何方法可以了解项目的Maven版本号?

我有一些项目,其中版本控制由Maven控制,在后期构建工作中,我们想创建一个Debian包并调用一些shell脚本.我需要的是Maven以前作为Jenkins环境变量可用的版本号,所以我可以将它传递给后期构建操作.

需要明确的是,我没有需要知道如何让詹金斯版本号传递到Maven的; 相反,我希望Maven将版本号传递给Jenkins!

Nil*_*ese 63

您可以使用https://issues.jenkins-ci.org/browse/JENKINS-18272中引入的$ {POM_VERSION}变量

  • 请记住,POM_VERSION没有考虑可能已传递给maven构建过程的任何环境变量.例如:<version> $ {CUSTOM_VERSION} <version>将为空或具有默认值. (2认同)
  • 由于此错误,POM_VERSION 缓存不正确 https://issues.jenkins-ci.org/browse/JENKINS-24869 (2认同)

Eng*_*_DJ 22

经过大量的挖掘(我从来没有意识到Jenkins的文档记录是多么糟糕!)我找到了一个非常简单的解决方案.

  1. 安装Groovy插件
  2. 添加Post Step到您的Maven构建类型Execute **system** Groovy script
  3. 粘贴在以下Groovy片段中:

脚本:

import hudson.model.*;
import hudson.util.*;

def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def mavenVer = currentBuild.getParent().getModules().toArray()[0].getVersion();
def newParamAction = new hudson.model.ParametersAction(new hudson.model.StringParameterValue("MAVEN_VERSION", mavenVer));
currentBuild.addAction(newParamAction);
Run Code Online (Sandbox Code Playgroud)

调用的构建环境变量MAVEN_VERSION现在可用于以通常的方式(${MAVEN_VERSION})替换到其他构建后的步骤.我正在使用它进行Git标记等.

  • 如果你将`def mavenVer =`行更新为[后续的后续内容](http://stackoverflow.com/a/10205702/487663) - `def mavenVer = currentBuild.getParent(),这就像魅力一样. .getModules()指定者()[0] .getVersion();` (2认同)

Ako*_*kom 10

正如其他答案已经指出的那样,如果您使用的是Maven项目类型,则可以访问$ POM_VERSION变量.但如果你不是,你可以使用这一系列步骤(丑陋但可靠).这样做依赖于相同版本的maven来确定pom版本(同时处理复杂的父/子pom继承,其中<version>甚至可能不存在于子代中).

  1. Maven迈出了这个目标:

    org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -l version.log

  2. Shell步骤 :(您可能需要根据您的层次结构调整version.log的路径)

    echo "POM_VERSION=$(grep -v '\[' version.log)" > props.properties

  3. 注入环境变量步骤(Environment Injector Plugin):

    属性文件路径: props.properties

现在你可以使用$ POM_VERSION,就好像这是一个Maven项目.

这样做:使用maven打印出版本以及一堆输出,然后将输出的混乱留下来,只留下版本,使用属性文件格式将其写入文件,然后将其注入构建环境.这比单线程更好的原因是mvn ..... | grep -v '\['使用Maven步骤不会对已安装的maven版本做出假设,并且将通过与任何其他maven步骤相同的自动安装来处理.

  • grep 过滤器存在一个问题:如果存储库中没有插件,您还会在 POM_VERSION 中看到“正在下载...”行。例如: `+ echo 'POM_VERSION=下载:...` (2认同)

apa*_*a64 6

I used Pipeline Utility Steps plugin in a declarative pipeline job to get Maven version. In the example below I use script variable instead of environment variable, because that can be modified and passed between stages.

def TAG_SELECTOR = "UNINTIALIZED"
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh "mvn --batch-mode -U deploy"
                script {
                    TAG_SELECTOR = readMavenPom().getVersion()
                }
                echo("TAG_SELECTOR=${TAG_SELECTOR}")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Note: You must approve the getVersion() method after creating the job in Manage jenkins > In-process Script Approval.

See also:

  • 管理员可能需要[授予“readMavenPom().getVersion()”批准](/sf/answers/2758906601/) (2认同)