捕获Unique Maven SNAPSHOT内部版本号

时间:2010-07-09 18:25:42

标签: maven-2 hudson

我正在寻找一种方法来捕获在构建的“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内部版本号?哈德森在做什么?

3 个答案:

答案 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所说。