如何从 Jenkins 访问 maven 属性?

How to access maven property from Jenkins?

我有一个 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 变量,然后进一步用于其他 post 构建步骤。

此解决方案的先决条件是:

  • 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 and its write-project-properties目标将项目属性写入目标文件夹(target\build.properties)下的新文件中。注意:此文件中的属性 已经被插值
这个新文件对您的构建和项目无害,被任何其他构建步骤忽略,作为 mvn clean 调用的一部分被删除,但对 Jenkins 非常有用

然后,在相关的 Jenkins 作业中,您可以添加一个新的 Post Steps > Execute system Groovy script(而不是 执行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 作业变量(如果需要,可以更改)。

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

例如,您可以通过新的 Post 步骤 > 执行 Windows 批处理命令进行调试,然后简单地回显它。这是屏幕截图:

作为示例 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

一个快速而肮脏的解决方案。

添加一个 'Execute Shell' 步骤,并将 属性 的值赋给一个变量:

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

在当前版本的 Jenkins 中,使用 "readMavenPom()".

有一个很好且简单的方法来实现这一点

比如我要读取pom.xml文件的版本。但是如果它使用较新的 Maven "revision" 实践,我需要从 pom.xml.

中定义的属性中读取 "revision" 值
      def pomVersion = readMavenPom().version   // read version
      if (pomVersion.equals("${revision}"))    // using revision strategy, read revision property
      {
        pomVersion = readMavenPom().properties['revision']
      }

所以最好的方法是使用

readMavenPom().properties['PROPETY_NAME']
environment {
       OUTPUT_FOLDER = "${sh(script: 'mvn help:evaluate -Dexpression=outputFolder -q -DforceStdout', returnStdout: true)}"
    }

pipeline-utility-steps