2010-07-09 44 views
3

我正在寻找一种方法来捕获在构建的'mvn deploy'阶段生成的唯一SNAPSHOT内部版本号。我希望能够将此版本(在Hudson构建期间)传递到用于部署到应用程序服务器的另一个进程。这里的关键是能够捕捉到精确的Maven的快照版本号,如:捕获独特的Maven SNAPSHOT内部版本号

foobar-0.4-20100707.060244-11.war 

我已经注意到,如果你存档Maven构建工件,哈德森被捕获此信息,但目前还不清楚我怎么能公开这个变量并把它传递给另一个工作(这是我想要做的)。我可以在哈德森家目录中看到这个变量,像这样:

/hudson/jobs/JOB_NAME/builds/24/org.ace.widgets$foobar/archive/org.ace.widgets/foobar/0.4-20100707.060244-11 

任何Maven和/或哈德森专家在那里,有任何线索如何公开快照版本号?哈德森在做什么?

+0

我不知道如何轻松暴露它。以防万一, - [Maven Versions Plugin](http://mojo.codehaus.org/versions-maven-plugin/)有一个['versions:lock-snapshots'](http://mojo.codehaus。 org/versions-maven-plugin/lock-snapshots-mojo.html)目标允许*解锁未锁定的快照依赖版本到锁定的时间戳版本*。也许你可以围绕这个建立一个解决方案。 – 2010-07-10 14:16:52

+0

感谢帕斯卡,这是一个有趣的插件,可能能够解决我的问题。我一定会考虑这一点。 – porterhouse91 2010-07-12 13:46:51

+0

使用快照的另一种方法是,第一个Hudson作业将SVN修订版编号包含在WAR文件的名称中,然后使用参数化触发器插件触发第二个作业,并使用“预定义”参数(其值为内置$ {SVN_REVISION}属性。第二个Hudson作业然后可以使用该值生成要从Maven回购站下载的WAR文件的名称。 – 2010-12-07 23:59:03

回答

2

查看我的回答to this slightly different problem我使用GMaven在部署完成后访问项目元数据。他们的共同之处在于您必须访问唯一的内部版本号。所以,这样以后已经阅读项目的元数据(部署后),你可以适应脚本它存储的唯一版本在Maven属性:

pom.properties['uniqueVersion'] = uniqueVersion 

如果应用程序服务器部署的过程也是一个Maven插件,访问此属性,否则将其存储为使用像这样的文件:

new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion 

现在你可以使用shell脚本从目标/ uniqueVersion.txt把它捡起来左右。

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 
0

基于肖恩·帕特里克Floyds答案,即使这个问题是旧的,我想与大家分享其写入uniqueVersion成行家财产的完整代码示例。请记住,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插件内此属性,请确保他们处决的设置uniqueVersion属性执行后,在部署阶段做。如果您喜欢将独特版本写入文件,只需添加

new File(pom.build.directory, "uniqueVersion.txt").text = uniqueVersion 

正如Sean Patrick所述。

相关问题