我有一个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属性?
答案 0 :(得分:2)
Jenkins Maven作业默认在作业配置期间提供一些maven properties,但是它不能提供对pom文件中定义的其他属性的任何简单访问。
因此,需要一种定制方法。这是一个使用groovy脚本的工作解决方案,可用于在构建时将任何已定义的Maven属性转换为新的Jenkins变量,然后在其他后期构建步骤中进一步使用。
此解决方案的预先要求是:
然后您可以将以下内容添加到项目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命令并简单地回显它。这是一个截图:
作为样本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']
}