詹金斯哈德森建设问题

时间:2014-06-10 15:25:50

标签: ant jenkins

我是Nexus和Ant的新手。 我通过Jenkin Hudson构建了由ant驱动的作业,成功地生成了组件。我们有SVN作为源存储库。

这里的问题是,当我运行Hudson作业时,所有组件都会再次创建到nexus存储库中。假设我的应用程序中有5个罐子,我只更改了一个对应于特定jar的类文件。不是仅创建具有变化的罐子,而是每次都创建所有5个罐子。

是否有一些设置为Jenkins可以帮助我实现我正在寻找的东西..或者这是需要通过ant build.xml控制的东西吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的设置会比您允许我们了解的更多。

首先,您说 Ant ,但您使用的是 Maven 存储库。你在用常春藤吗?或者,您是否使用<wget>任务下载jar?

如何将您的jar 部署到Maven资源库?你使用Ant插件,Jenkins插件,还是使用mvn deploy:deploy-file?您是在Jenkins工作定义中执行此操作还是使用Promoted Build PluginRepository Connector Plugin之类的内容?

最后,究竟是什么问题?将jar部署到Nexus存储库是一个问题吗?詹金斯工作重建所有五个罐子是一个问题吗?而且,为什么这是一个问题?如果将jar重新部署到Nexus存储库有什么问题?需要花费太多时间吗?如果jar的校验和没有改变,你能否配置Nexus不运行部署?

另外,为什么要在一个项目中建造五个罐子。你可以把它变成五个独立的Jenkins工作,并且只构建源变更的罐子吗?


附录

  

应用程序构建了战争外部的单一战争和一堆罐子。他们仍在战争之外。我有一个java Web应用程序XXX。在此应用程序上运行构建作业时,我将获得abc.war和aaa.jar,bbb.jar,ccc.jar。 build.xml中提到了要创建的jar。

以下是我们处理此问题的方法。您可能需要一些设置。

首先,我们使用Ivy和Ant。 Ivy允许我们使用Maven依赖管理而无需完全重构我们的构建过程。

每个jar都是我们Jenkins服务器中的一个单独项目。当jar的代码改变时,jar会重建。不知道你的存储库和项目是如何构建的,你可能更难做到这一点。

如果您的战争设置为为每个jar调用单独的build.xml,那么执行此操作应该不会太难。如果您有一个build.xml,但每个jar的单独目标,并且每个jar的源代码都在一个单独的树中,那么它将会有点过时。您可以设置Jenkins以检出/更新整个项目源代码,但只查看特定目录中的源代码以查看是否需要重建。如果所有罐子的源代码以复杂的方式混合在一起,那就更难了。

我们使用Jenkins Promoted Build Plugin将构建的jar部署到我们的Maven存储库。这使我们可以更灵活地决定何时部署jar。我们的标准做法是在每次构建后部署快照版本(让开发人员使用最新功能),但在我们的战争中使用发行版本。

当部署了一个新版本的jar时,我们会对其进行设置,以便自动重建任何依赖于该战争的项目。

当我们构建战争时,我们不构建jar,而是使用<ivy:retrieve>从我们的存储库中检索所需的jar。

所以:

  • 如果jar的源本身已经改变,我们只构建jar。
  • 我们通过下载所需的罐子来建立战争。如果不清除每个构建之间的缓存,则只下载更改的jar。
  • 如果其中一个依赖的罐子被修改过,我们会设置Jenkins来启动战争构建。
  • 当战争建立时,它只会下载更改后的jar,然后构建任何类等等。
  • 如果您正确构建项目,Ant将只构建已更改的内容。但是,我们进行了清理和Subversion更新,因此我们重建整个项目,但不必重新下载整个项目。由于战争只需要下载已更改的jar,并构建他们使用的java代码,无论如何都不需要很长时间来重建战争。

我希望这会有所帮助。

还有一件事......

你可以尝试不在Jenkins的构建之间清理你的构建碎片。在Jenkins中仅使用仅使用来更新尚未更改的源文件。 Ant将自动不重建尚未更改的内容。这意味着未更改的*.java文件将不会重新编译,如果*.jar文件的组件未更改,则不会重建这些文件。

但是,您必须确保build.xml是防弹且结构良好的。否则,你最终会受到很多伤害。在我目前工作的前六个月,我重新编写了所有build.xml文件,以确保它们结构良好,并且可以避免构建。您可能需要做很多工作才能使其正常工作。