9

我们有几个产品有很多共享代码并且必须维护几个版本。

为了解决这个问题,我们使用了很多 Eclipse 项目,有些包含库 jar,有些包含共享源代码(在几个项目中,以避免获得具有大量依赖项的巨大堆,同时能够从头开始编译所有内容以确保源代码和二进制文件是持续的)。我们使用 projectSet.psf 管理这些项目,因为它们可以直接从 CVS 中拉出所有项目并留下一个准备充分的工作区。我们不直接进行 ant 构建或使用 maven。

我们现在希望能够将所有这些项目及其各种版本放入一个持续集成工具中——我喜欢 Hudson,但这只是个人喜好问题——这本质上意味着我们需要一种自动的方式来检查项目以一个新的工作区,并按照每个项目的项目文件中的描述编译源文件夹。Hudson 没有提供这样的方法来构建项目,所以我一直在考虑最好的方法是什么。

想法已经

  • 查找或编写一个能理解 projectSet.psf 并映射到 cvs-checkout 和编译标签的 ant 插件/转换器。
  • 从 Eclipse 中创建 build.xml 文件并使用它们。我试过这个,发现结果很冗长,而且绝对位置不适合自动工具将文件放在他们想要的位置。
  • 编写一个理解 projectSet.psf 的 Hudson 插件以派生配置并构建它。
  • 只要硬着头皮手动创建和更新 CI 配置就可以了——我不喜欢这样 :)

我真的很想听听其他人的经历,所以我可以决定如何处理这个问题。


编辑:另一种选择可能是使用更了解 Eclipse 项目和/或项目集的 CI。我们不信教——这只是让东西运行起来而不必自己做所有事情的问题。巡航控制可能是一个更好的选择吗?其他的?


编辑:发现 ant4eclipse 有一个“团队项目集”设施。 http://ant4eclipse.sourceforge.net/


编辑:使用 ant4eclipse 和 ant-contrib ant 扩展来构建一个完整的工作区作为 sjgned 可运行 jar 文件,类似于 Eclipse 3.5M6 中的可运行 Jar 工具。我仍然依赖 Eclipse 来创建初始的空工作区,并提取 ProjectSet,所以这是下一个障碍。


编辑:以双重配置结束,即 Hudson 从 CVS 中提取与 ProjectSet.pdf 文件中列出的相同的模块集(需要具有相同的标签),从而使它们彼此相邻。然后 ant4eclipse 可以很好地与嵌入在主模块中的 projectSet.psf 文件配合使用。警告:必须手动更新 Hudson 中的模块列表,并且之后似乎需要手动清理工作空间,以便让 Hudson “发现”现在比以前有更多的项目。几个月来,这对我们来说效果很好,但是让所有的东西都在 ant 文件中工作是相当乏味的。


编辑:在哈德逊的 CVS 项目中,使用 ant4eclipse 和 Ctrl-A、Ctrl-C 在项目面板中使用 Ctrl-V 的“使用团队项目”已经证明工作得很好,我们可以忍受(对于成熟的项目,这个很少改变)。我正在等待 ant4eclipse 1.0 的发布——http://www.ant4eclipse.org/ 目前处于里程碑 2——看看有多少本土功能可以被 ant4eclipse 东西取代。

编辑:ant4eclipse 在 M4 中是截至 20100609 的,所以http://www.ant4eclipse.org/node?page=1上的时间表有所下滑。


编辑:在长时间使用我们的 ant4eclipse 方法后,我的结论是构建脚本变得非常粗糙并且难以维护。Team ProjectSet 工具(ant4eclipse 用来定位项目)也适用于基于 CVS 的存储库,但在我们迁移到 git 之后就不行了(这本身就是一件大事)。新项目很可能基于 maven,因为这在 Jenkins 中得到了很好的支持。

4

3 回答 3

3

我不完全确定我理解这个问题,但听起来根本问题是你有很多项目,其中一些依赖于其他项目。一些更接近依赖树“叶子”的项目需要能够使用更多“核心”项目的“稳定”(或先前“发布”)版本。

我使用Hudsonantivy解决了这个问题。我遵循 Clark 在Pragmatic Project Automation中演示的模式(他没有演示依赖问题和解决方案,他使用 CruiseControl 而不是 hudson。)

我有一个手写的 ant 构建文件(我们称之为“cc-build.xml”,因为我们的 CruiseControl 根。)该文件负责从 CM 存储库中刷新项目的工作空间并标记内容以供将来使用参考。然后它将控制权交给每个项目的开发人员提供的另一个手写的 ant 构建文件 (build.xml)。该项目负责传统的构建步骤(编译、打包等)。它需要将可安装的工件、单元测试报告等吐出到 Hudson 工件目录。根据我的经验,自动生成的构建文件(通过 Eclipse 或其他类似的 IDE)永远不会接近获得足够健壮以在 CI 场景中使用的能力。

此外,它使用 ivy 来解决它自己的依赖关系。Ivy 支持精确指定的依赖版本(例如“使用 1.1 版”),它支持“模糊版本”(例如“使用 1.1+ 版”或“在集成状态下使用最新版本”)。我们的项目通常开始指定一个非常正在进行开发的内部项目的“模糊”版本,当它们接近发布点时,它们“冻结”依赖版本,以便东西停止在它们下面移动。

非叶子项目(依赖于其他项目的项目)也使用 ivy 将其工件发布到我们内部的 ivy 存储库。该存储库保留依赖项的所有过去构建,因此任何项目都可以始终依赖任何其他先前版本。

最后,Hudson 中的每个项目都配置有一个构建触发器,当其任何依赖项目成功构建时,该触发器会导致重新构建。这导致它们使用(可能)新的 ivy 依赖版本再次构建。

值得注意的是,一旦你启动并运行它,自动构建输入的一致自动“标签”或“标记”对你来说将是至关重要的 - 否则对构建后问题进行故障排除将导致不得不解开一个寻找马蜂窝的原始来源。

为我们的环境完成所有这些设置需要付出相当多的努力(主要是设置 ivy 存储库和 ant 构建文件),但它已经为自己付出了很多倍的代价,因为它节省了手动管理依赖项和减少故障排除工作的麻烦。

于 2009-02-02T16:31:00.017 回答
1

编写一个理解 projectSet.psf 的 Hudson 插件以派生配置并构建它。

这对我来说似乎是成功的答案。

我使用 CruiseControl 而不是 Hudson,但根据我的经验,如果您可以创建一个插件来解决您的问题,它将很快得到回报。编写一个适合您的解决方案的插件通常很容易,而不是一个需要在类似情况下为每个人工作的插件。

于 2009-02-02T17:59:10.667 回答
1

我已经为我们的 CI 解决方案尝试了 Cruise Control (CC) 和 Hudson。我们(作为一家公司)决定选择 Hudson。但是对于您的问题“CC 是否支持 Eclipse 项目构建”,据我所知,答案是否定的。CC 支持更多不同的构建工具和源代码控制系统,但配置和使用有点困难。至于Hudson,配置和使用起来更简单。我们为 CC 和 Hudson 开发了我们的定制插件,用于我们构建周期中它们未按原样提供的部分。至于插件开发,如果你知道/使用 Maven,Hudson 也更简单。但是如果你对 Maven 不熟悉,首先你需要学习 maven 的基本用法,才能成功开发一个 Hudson 插件。但是一旦你了解了 maven 的基本用法,在 Hudson 中插件开发、测试甚至调试都会变得更简单。

对于您的具体问题,我可以考虑使用 Eclipse 插件的解决方案。您可以开发自己的 Eclipse 插件,例如从(可配置的)文件夹中获取 psf 文件,并使用 Eclipse 内部来处理这些 psf。我的意思是您可以使用现有的带有 psf 文件的 Eclipse 源代码,检查它的项目定义并编译这些项目。您的这个 Eclipse 插件可能有一个首选项页面(您可以通过 Eclipse -> Window -> Preferences 访问该页面)并配置它将使用哪个文件夹来查找 psf 文件。您的 Eclipse 插件还应该有一种无需用户交互即可启动 psf 处理的方法。为此,您可以使用 ipc 来触发您的进程。我的意思是你的 Eclipse 插件可以监听一个端口,您可以编写另一个 java 应用程序,该应用程序将通过此端口连接到您的插件并触发其进程。至于 CI 部分,您可以使用 CC 或 Hudson 并使用它们的外部流程执行支持。如果您使用的是 Windows,您可以编写一个 bat 文件(用于 Linux sh 文件),该文件首先启动安装了您的插件的 Eclipse。然后它会启动您的 java 应用程序,该应用程序将与您的 Eclipse 插件通信以触发您的进程。从您的 CI 工具中,您将需要运行您的 bat / sh 文件来触发您的进程。然后它会启动您的 java 应用程序,该应用程序将与您的 Eclipse 插件通信以触发您的进程。从您的 CI 工具中,您将需要运行您的 bat / sh 文件来触发您的进程。然后它会启动您的 java 应用程序,该应用程序将与您的 Eclipse 插件通信以触发您的进程。从您的 CI 工具中,您将需要运行您的 bat / sh 文件来触发您的进程。

于 2009-02-04T08:44:37.417 回答