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

问题描述 投票:3回答:2

我有一个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属性?

maven jenkins maven-3 pom.xml
2个回答
2
投票

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目标将项目属性写入目标文件夹(target\build.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()+"\\target\\build.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\tomcat-7\temp\hudson6024790907972070905.bat

C:\Users\user-name\.jenkins\jobs\sample-maven\workspace>echo C:/AutomationTestReports/sample-project/Execution_(2016-04-24_12-11-13UTC) 
C:/AutomationTestReports/sample-project/Execution_(2016-04-24_12-11-13UTC)

C:\Users\user-name\.jenkins\jobs\sample-maven\workspace>exit 0 
Finished: SUCCESS

1
投票

快速而肮脏的解决方案。

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

outputFolderVar=$(awk -F '[<>]' '/outputFolder/{print $3}' pom.xml)
© www.soinside.com 2019 - 2024. All rights reserved.