在处理POM后,Jenkins构建是否有任何方法可以了解项目的Maven版本号?
我有一些项目,其中版本控制由Maven控制,在后期构建作业中,我们想创建一个Debian软件包并调用一些shell脚本。我需要的是Maven以前作为Jenkins环境变量可用的版本号,所以我可以将它传递给后构建操作。
要清楚,我不需要知道如何让Jenkins将版本号传递给Maven;相反,我希望Maven将版本号传递给Jenkins!
答案 0 :(得分:60)
答案 1 :(得分:21)
经过大量的挖掘(我从未意识到詹金斯有多么糟糕!)我发现了一个非常简单的解决方案。
Post Step
添加到类型为Execute **system** Groovy script
<强>脚本:强>
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);
现在,可以使用名为MAVEN_VERSION
的构建环境变量以常规方式(${MAVEN_VERSION}
)替换为其他构建后步骤。我将Git标记用于其他事情。
答案 2 :(得分:8)
正如其他答案已经指出的那样,如果您使用的是Maven项目类型,则可以访问 $ POM_VERSION 变量。但如果你不是,你可以使用这一系列步骤(丑陋但可靠)。这样做依赖于相同版本的maven来确定pom版本(同时处理复杂的父/子pom继承,其中&lt; version&gt; 甚至可能不存在给孩子)。
Maven迈出了这一目标:
org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -l version.log
Shell步骤 :(您可能需要根据您的层次结构调整version.log的路径)
echo "POM_VERSION=$(grep -v '\[' version.log)" > props.properties
注入环境变量步骤(环境注入器插件):
属性文件路径:props.properties
现在您可以使用 $ POM_VERSION ,就好像这是一个Maven项目。
这是做什么的:使用maven打印出版本以及一堆输出,然后将输出混乱,只留下版本,使用属性文件格式将其写入文件,然后将其注入构建环境。这比单线程mvn ..... | grep -v '\['
更好的原因是使用Maven步骤不会对已安装的maven版本做出假设,并且将通过与任何其他maven步骤相同的自动安装来处理。
答案 3 :(得分:3)
String regex = '.*\\[INFO\\] Building .+ (.+)';
def matcher = manager.getLogMatcher(regex);
if (matcher == null) {
version = null;
} else {
version = matcher.group(1);
}
将此添加到Jenkins以供稍后使用有点棘手。尽管我记得这给我们带来了一些令人头疼的问题。 (对不起,我们很久以前做过这个)
def addBuildParameter(String key, String value) {
manager.build.addAction(new hudson.model.ParametersAction(new hudson.model.StringParameterValue(key,value)));
}
答案 4 :(得分:3)
有同样的需求并解决了Groovy解析pom的建议。
import jenkins.util.*;
import jenkins.model.*;
def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def workspace = currentBuild.getModuleRoot().absolutize().toString();
def project = new XmlSlurper().parse(new File("$workspace/pom.xml"))
def param = new hudson.model.StringParameterValue("project.version", project.version.toString())
currentBuild.addAction(new hudson.model.ParametersAction(param));
将此脚本添加为“执行系统Groovy脚本”类型的后续步骤(因此不需要安装Groovy)并将代码粘贴到“Groovy命令”中。
答案 5 :(得分:3)
我在声明性管道作业中使用了Pipeline Utility Steps插件来获取Maven版本。在下面的示例中,我使用脚本变量而不是环境变量,因为它可以在各阶段之间进行修改和传递。
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}")
}
}
}
}
注意:在管理jenkins &gt;中创建作业后,您必须批准getVersion()方法。 进程内脚本批准。
另见:
答案 6 :(得分:0)
你也可以这样做:
MAVEN_VERSION=`grep A -2 -B 2 "<your_project_name>" pom.xml | grep version | cut -d\> -f 2 | cut -d\< -f 1`-commit-"`echo $GIT_COMMIT`"
说明:假设您的项目名称在一行或两个上/下版本中,就像普通的pom一样:
<groupId>org.apache.bigtop</groupId>
<artifactId>bigpetstore</artifactId>
<version>1.0-SNAPSHOT</version>
然后你可以轻松地grep for artifactId,使用“之前/之后”grep动作来吸引它的版本,然后grep版本并使用简单的unix“cut”命令拼接出来之间的内容“版本”标签。
我喜欢Jenkins-groovy集成,但这很容易,甚至可以在你无法控制的构建服务器上工作(即因为bash是通用的)。
答案 7 :(得分:0)
<强>解决方案:强>
POM_VERSION=$( \
xmlstarlet sel \
-N x='http://maven.apache.org/POM/4.0.0' \
-t \
-v '//x:project/x:version/text()' \
pom.xml \
)
<强>解释强>
您可以使用命令行XPath工具在单行中执行此操作,例如“How to execute XPath one-liners from shell?”中提到的那些工具。我选择XMLStarlet,但它们都有类似的语法。
解析POM时,必须考虑命名空间。文档here帮助我解决了这个问题。
为了获取XPath中元素的文本,可以使用text {()函数,如XPath: select text node中所述。
我的POM看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.bar</groupId>
<artifactId>foobar</artifactId>
<version>1.0.6-SNAPSHOT</version>
<packaging>jar</packaging>
这里的缺点是,如果名称空间发生变化,则必须更改命令。
答案 8 :(得分:0)
使用'Execute System Groovy Script'如下:
import jenkins.util.*;
import jenkins.model.*;
def thr = Thread.currentThread();
def currentBuild = thr?.executable;
def projectManager = build.getProject()
def file = projectManager.getWorkspace().child("pom.xml");
def project = new XmlSlurper().parseText(file.readToString())
def param = new hudson.model.StringParameterValue("currentVersion", project.version.toString())
currentBuild.addAction(new hudson.model.ParametersAction(param));
通过使用Execute System Groovy脚本,您可以直接访问构建,从中可以获取项目,从而获得“子”文件,在这种情况下为pom.xml。
您不必创建新文件,因为您可以看到它可以非常强大地访问工作区中的每个文件。
答案 9 :(得分:0)
基于@Akom的answer,拥有POM_VERSION的前置步骤为:
脚本
mvn org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -l project_version
# grep for the version pattern rather than not mentioning '\['
echo "POM_VERSION=$(grep -E '^[0-9.]+(-SNAPSHOT)?$' project_version)" > your_property_file