我正在寻找一种方法来捕获在构建的“mvn deploy”阶段生成的唯一SNAPSHOT构建号。我希望能够将此版本(在Hudson构建期间)传递给另一个用于部署到应用程序服务器的进程。这里的关键是能够捕获确切的Maven SNAPSHOT内部版本号,例如:
foobar-0.4-20100707.060244-11.war
我注意到如果你归档maven构建工件,Hudson正在捕获这些信息,但我不清楚如何公开这个变量并将它传递给另一个工作(这就是我想要做的)。我可以在Hudson Home目录中看到这个变量,如下所示:
/hudson/jobs/JOB_NAME/builds/24/org.ace.widgets$foobar/archive/org.ace.widgets/foobar/0.4-20100707.060244-11
那里有任何Maven和/或Hudson专家有任何线索如何公开SNAPSHOT内部版本号?哈德森在做什么?
答案 0 :(得分:2)
查看我的回答to this slightly different problem,我使用GMaven在部署后访问项目元数据。它们的共同点是您必须访问唯一的内部版本号。因此,您可以调整脚本,以便在读取项目元数据(部署后)后,它将唯一版本存储在maven属性中:
pom.properties['uniqueVersion'] = uniqueVersion
如果appserver-deploy-process也是maven插件,请访问此属性,否则使用以下内容将其存储为文件:
new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion
现在你可以使用shell脚本从target / uniqueVersion.txt中选择它。
答案 1 :(得分:1)
有点晚了,但我注意到你遇到的问题完全相同。我需要能够在AIX机器上部署在Windows机器上生成的任意构建工件。部署过程需要在AIX机箱上本地运行。因此,我在AIX机器上定义了从Windows框上运行的构建作业下载构建工件的从属服务器。主人在Windows框上。
简而言之。构建作业存档必要的工件并以其构建URL作为参数触发部署作业(它实际上是“运行参数”,但字符串也可以工作)。部署作业使用wget
来确定工件URL(它搜索包含某些文本的工件ID,例如没有版本的工件名称),然后再次使用wget
下载工件。 wget
在没有版本的情况下保存它,以便我的所有部署脚本都可以在无版本名称上运行。您也可以使用第一步来了解工件名称。
wget使用远程API(xml版本)。如果您不想使用wget,可以使用命令行工具为您进行连接。
您可以通过将以下字符串附加到构建作业的运行URL来测试它,并在Web浏览器中使用生成的URL。
#to find the path (URL) of the artifact
api/xml?xpath=*/artifact[contains(fileName,"MyApp")]/relativePath/text()
#to find the path (URL) of the artifact with more than 1 string to match
#the match must identify exactly one artifact, otherwise you will
#get an error message
api/xml?xpath=*/artifact[contains(fileName,"MyApp") and contains(fileName,".ear")]/relativePath/text()
#To download the artifact
#replace $relativePath with the actual output from one of the queries above
artifact/$relativePath
答案 2 :(得分:0)
根据肖恩·帕特里克·弗洛伊德斯的回答,尽管这个问题很老,但我想分享一个完整的代码示例,它将uniqueVersion写入maven属性。请记住,使用反射可以访问Maven的内部,因此在将来的maven版本中可能很容易分解。我针对Maven 3.2.5进行了测试。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<executions>
<execution>
<id>set-uniqueVersion-property</id>
<phase>deploy</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
<![CDATA[
def uniqueVersion = null;
println "Grabbing uniqueVersion...";
project.artifact.metadataList.each{
if(it.class.simpleName=='ProjectArtifactMetadata'){
def afi = it.class.superclass.superclass.getDeclaredField('artifact');
afi.accessible = true;
uniqueVersion = it.artifact.version;
}
};
project.properties['uniqueVersion'] = uniqueVersion;
println("Unique Version grabbed: $uniqueVersion");
]]>
</source>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
如果您想在其他maven插件中使用此属性,请确保在 set-uniqueVersion-property 执行 部署阶段之后执行这些操作。如果您希望将唯一版本写入文件,只需添加
即可new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion
正如Sean Patrick所说。