如何从詹金斯访问maven属性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从詹金斯访问maven属性?相关的知识,希望对你有一定的参考价值。

我有一个maven项目,我有一个属性。我想从Jenkins访问它。

POM片段:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <timestamp>${build.time}</timestamp>
    <outputFolder>C:/AutomationTestReports/${project.name}/ExecutionReport${timestamp}</outputFolder>
</properties>

此输出文件夹属性在运行时进行评估。我想在Jenkins中访问此属性以导航到根据时间戳生成的输出文件夹。为此,我需要在Jenkins中捕获此输出文件夹属性,这是我无法做到的。

仅使用此输出文件夹,我将能够导航到该文件夹​​以访问结果文件。

问题:如何从Jenkins作业访问Maven属性?

答案

Jenkins Maven作业默认提供一些在作业配置期间使用的maven properties,但是它不能提供对pom文件中定义的其他属性的任何简单访问。

因此,需要一种定制方法。这是一个使用groovy脚本的工作解决方案,可用于在构建时将任何已定义的Maven属性转换为新的Jenkins变量,然后在其他后期构建步骤中进一步使用。

此解决方案的预先要求是:

  • Groovy安装在Jenkins服务器上(简单的步骤,只需download it,解压缩,将其设置为路径
  • Jenkins Groovy Plugin安装在Jenkins中(简单步骤,管理Jenkins>管理插件,可用插件,安装它,然后在Manage Jenkins> Configure System> Groovy下配置它,使其指向安装上面的步骤

然后你可以添加到项目pom以下是build/plugins部分:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>write-project-properties</goal>
            </goals>
            <configuration>
                <outputFile>${project.build.directory}/build.properties</outputFile>
            </configuration>
        </execution>
    </executions>
</plugin>

我们在做什么?只需使用properties-maven-plugin及其write-project-properties目标将项目属性写入目标文件夹(targetuild.properties)下的新文件中。注意:此文件中的属性已经过插补。 这个新文件对于你的构建和项目是无害的,被任何其他构建步骤忽略,作为mvn clean调用的一部分被删除,但对Jenkins真的很有帮助。

然后,在相关的Jenkins作业中,您可以添加一个新的Post Steps> Execute系统Groovy脚本(而不是一个Execute Groovy脚本,承载difference)指向一个新的groovy文件,您可以在需要的地方存储或键入控制台以下groovy码:

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

def thr = Thread.currentThread();
def currentBuild = thr?.executable;

def props = new Properties();
new File(currentBuild.workspace.toString()+"	argetuild.properties").withInputStream { 
  stream -> props.load(stream);
}

println "detected from properties: "+props.get("outputFolder");

def newParamAction = new ParametersAction(new StringParameterValue("outputFolder", props.get("outputFolder")));
currentBuild.addAction(newParamAction);

这个脚本在做什么?只需读取属性文件,将outputFolder属性作为日志打印到控制台(可选择删除),然后将其设置为具有相同名称的新Jenkins作业变量(如果需要,可以更改)。

然后,您可以在进一步的后期构建步骤中使用${outputFolder}新变量(或Windows命令中的%outputFolder%),它将正确存在。

例如,您可以通过新的Post Steps> Execute Windows Batch命令对其进行调试,并简单地回显它。这是一个截图:

enter image description here

作为样本Jenkins作业的输出,您将拥有:

detected from properties: C:/AutomationTestReports/sample-project/Execution_(2016-04-24_12-11-13UTC)
[workspace] $ cmd /c call C:dev	omcat-7	emphudson6024790907972070905.bat

C:Usersuser-name.jenkinsjobssample-mavenworkspace>echo C:/AutomationTestReports/sample-project/Execution_(2016-04-24_12-11-13UTC) 
C:/AutomationTestReports/sample-project/Execution_(2016-04-24_12-11-13UTC)

C:Usersuser-name.jenkinsjobssample-mavenworkspace>exit 0 
Finished: SUCCESS
另一答案

快速而肮脏的解决方案。

添加“执行Shell”步骤,并将属性的值分配给变量:

outputFolderVar=$(awk -F '[<>]' '/outputFolder/{print $3}' pom.xml)

以上是关于如何从詹金斯访问maven属性?的主要内容,如果未能解决你的问题,请参考以下文章

出现 OutOfMemoryError:在詹金斯中执行 maven 构建时 PermGen 空间

如何在詹金斯管道中访问 git commit 消息 INSIDE sh STEP?

詹金斯自动部署tomcat 7

如何从詹金斯管道中选择声纳质量门?

将 maven 项目集成到 svn 版本的 jenkins 中

在詹金斯中运行我的硒项目时出现 Maven 错误