【问题标题】:Capturing the Unique Maven SNAPSHOT build number捕获唯一的 Maven SNAPSHOT 内部版本号
【发布时间】:2023-04-04 04:35:02
【问题描述】:

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

【问题讨论】:

  • 不知道怎么轻易暴露。以防万一, - Maven Versions Plugin 有一个 versions:lock-snapshots 目标,允许将解锁的快照依赖版本解析为锁定的时间戳版本。也许你可以围绕这个建立一个解决方案。
  • 感谢 Pascal,这是一个有趣的插件,或许可以解决我的问题。我一定会调查的。
  • 使用快照的替代方法是让第一个 Hudson 作业在 WAR 文件的名称中包含 SVN 修订号,然后使用参数化触发器插件触发第二个作业,并使用“预定义”参数value 是内置的 ${SVN_REVISION} 属性。然后,第二个 Hudson 作业可以使用此值生成要从 Maven 存储库下载的 WAR 文件的名称。

标签: maven-2 hudson


【解决方案1】:

查看我的答案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 中获取它。

【讨论】:

    【解决方案2】:

    有点晚了,但我刚刚注意到您遇到的问题与我所面临的完全相同。我需要能够在 AIX 机器上部署在 Windows 机器上生成的任意构建工件。部署过程需要在 AIX 机器上本地运行。因此,我在 AIX 机器上定义了从服务器,它们从 Windows 机器上运行的构建作业下载构建工件。主人在 Windows 盒子上。

    简而言之。构建作业归档必要的工件并使用其构建 URL 作为参数触发部署作业(它实际上是一个“运行参数”,但字符串也可以工作)。部署作业使用wget 来确定工件URL(它搜索包含某些文本的工件ID,例如不带版本的工件名称),并再次使用wget 下载工件。 wget 保存它没有版本,这样我所有的部署脚本都可以在未版本化的名称上运行。您也可以使用第一步来了解工件名称。

    wget 使用远程 API(xml 版本)。如果您不想使用 wget,有一个命令行工具可以为您完成连接。

    您可以通过将以下字符串附加到构建作业的运行 URL 并在您的网络浏览器中使用生成的 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
    

    【讨论】:

      【解决方案3】:

      根据 Sean Patrick Floyds 的回答,尽管这个问题很老,但我想分享一个完整的代码示例,它将 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
      

      正如肖恩·帕特里克所说。

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 1970-01-01
        • 2016-05-14
        • 2013-09-06
        • 2017-05-05
        • 1970-01-01
        • 2016-08-26
        • 2020-03-02
        • 1970-01-01
        相关资源
        最近更新 更多