如何从 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)}"
}
我有一个 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)}"
}