如何让Hudson自动构建&安装发布工件,而不仅仅是快照?

时间:2010-10-19 19:20:07

标签: git maven-2 hudson maven-release-plugin

我正在我的笔记本电脑上开发几个mavenised项目,并定期推送到github。我在云中设置了一个私有哈德森服务器,用于轮询git存储库以获取更新,从而执行构建 - 到目前为止一直很好。

不幸的是,当我在我的笔记本电脑上执行'mvn release:prepare'来执行释放(比如'1.5')时,发生的两次提交(将1.5-SNAPSHOT改为1.5,然后将1.5改为1.6-SNAPSHOT)一起推入我的git repo - 而Hudson显然构建了最近的一个,即1.6-SNAPSHOT - 并且完全忽略了1.5版本。

这没关系,但项目依赖于彼此,我想在我的poms中声明非快照版本。但是,当项目B依赖于项目A的1.5版本时,在Hudson框中的哈德森用户的本地maven存储库中找不到它 - 因为它从未构建过 - 因此项目B的构建失败。

如果我能让Hudson变得更聪明,当它看到maven发行版飞过时,强制构建并安装该特定版本,然后继续构建稍后的快照提交,那就太棒了。

我一直在浏览Hudson插件,特别是'M2 Release Plugin':

http://wiki.hudson-ci.org//display/HUDSON/M2+Release+Plugin

- 但是,该插件似乎更适合手动选择你想要推广到更多官方Maven Repo的构建,而不是强迫Hudson自动构建&安装它遇到的每个版本构建。

更新:我的一些基本要求让我重新思考我想在这里实现的目标 - 抱歉不提前表达它们:

  • 大多数项目都是开源的或最终打算开放,我希望任何人能够git clone任何单个项目,签出发布标签,并在没有mvn install的情况下进行需要任何其他repo的依赖,但maven central。
  • 为了获得一致的结果(在我的笔记本电脑,哈德逊服务器以及其他人的结账中),这显然表明了在我的poms中声明非快照依赖项的偏好(至少对于发布版本而言)。
  • 这让我走上了试图让Hudson'mvn install'发布工件的道路,因为他们嗖嗖地过去了,所以后来Hudson建筑项目B不会失败,因为它找不到项目A的发布版本(哪个是这个问题的来源)

此外:

  • 我使用sonotype的精彩oss托管,这需要GPG签名 - 而且我不想让我的GPG密钥存储在我手里拿不到的任何硬件上:) - 所以在Hudson服务器上将其整理好云不是一种选择。
  • 在心理上,让Hudson服务器发布版本对我来说有点陌生 - 我真的只想把它用于CI。

3 个答案:

答案 0 :(得分:2)

您现在需要的是实际执行该版本。引用Maven - Guide to using the release plugin

  

执行发布

     

该插件将提取文件修订版   与当前版本相关联。   Maven将编译,测试和打包   版本化的项目源代码到   一件神器。 最终的可交付成果   然后将被释放到   适当的maven存储库

     

release:perform目标将:

     
      
  1. 提取在新标记名称下版本化的文件修订版。
  2.   
  3. 在提取的实例上执行maven构建生命周期   项目
  4.   
  5. 将版本化工件部署到适当的本地和远程   存储库即可。
  6.   

参考

答案 1 :(得分:0)

您可以指定用于确定是在本地还是远程部署构建的配置文件:

<project>
    <profile>
        <id>local-deploy</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <distributionManagement>
            <repository>
                <id>local-repo</id>
                <name>My Local Repo</name>
                <url>file://my/local/repo/dir</url>
            </repository>
        </distributionManagement>
    </profile>
    <profile>
        <id>remote-deploy</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <property>
                <name>remote.repo.url</name>    
            </property>
        </activation>

        <distributionManagement>
            <repository>
                <id>remote-repo</id>
                <name>My Remote Repo</name>
                <url>${remote.repo.url}</url>
            </repository>
        </distributionManagement>
    </profile>
</project>

然后您可以安全地运行release:perform目标,并通过传入remote.repo.url的值,您还可以选择远程部署。

答案 2 :(得分:0)

我已经更新了我的问题描述以提及我在我的poms中声明非快照依赖项的偏好(至少对于发布版本),以便获得一致的结果(在我的笔记本电脑,哈德森服务器和其他人的检查 - 我真的希望其他人能够检查我的代码,并且在寻找不可知的快照依赖关系时不知所措。

它希望在我的依赖项中使用非快照版本导致这个问题--Hudson的正常行为并没有使“发布”版本变得容易,至少没有等待依赖项的发布版本循环到maven central。

但是,我已经决定,如果我想要忠实于我的基本要求 - 人们可以轻松签出并构建我的代码 - 那么我就必须这样做:即等待maven central同步。 / p>

我只想坚持发布版本(否则我永远不会得到任何完成!),因此很乐意使用快照版开发 - 直到我实际< strong>做想要发布一个版本,此时我希望所有deps都能在maven central中正确使用。

直到最近我还没有意识到有任何方法可以强制执行此操作,但谷歌更多地发现了''执行者'插件:

http://maven.apache.org/enforcer/enforcer-rules/requireReleaseDeps.html

- 将'onlyWhenRelease'标志设置为true,看起来应该完全强制执行我想做的事。

回答我原来的标题问题('如何让Hudson自动构建和安装发布工件,而不仅仅是快照?'),我的答案是:

  1. 似乎没有完全无关紧要的方法让Hudson这样做(没有Hudson的副作用也试图对它检测到的每个签到进行'释放',这可能需要额外的'profile'配置来阻止实际发布的正常行为,例如GPG签名)
  2. 不要那样做。