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

时间:2016-04-22 10:02:07

标签: maven jenkins maven-3 pom.xml

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

3 个答案:

答案 0 :(得分:2)

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

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

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

  • Groovy安装在Jenkins服务器中(简单步骤,只需download it,解压缩,将其设置为路径
  • Jenkins Groovy Plugin安装在Jenkins中(简单步骤,管理Jenkins&gt;管理插件,可用插件,安装它,然后在 Manage Jenkins&gt;配置系统下配置它&gt; 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&gt;执行系统Groovy脚本(而不是执行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&gt;进行调试。执行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 :(得分:1)

快速而肮脏的解决方案。

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

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

答案 2 :(得分:0)

在当前版本的Jenkins中,有一种很好的,简单的方法可以使用“ readMavenPom()”来实现。

例如,我想阅读pom.xml文件的版本。但是,如果使用的是较新的Maven“修订”实践,则需要从pom.xml中定义的属性中读取“修订”值。

false true false false false false false false true

所以最好的方法就是使用

      def pomVersion = readMavenPom().version   // read version
      if (pomVersion.equals("\${revision}"))    // using revision strategy, read revision property
      {
        pomVersion = readMavenPom().properties['revision']
      }