在作业B中需要在作业A中创建的文件时,分成不同的作业是什么? (示例是使用MSBuild构建.NET应用程序)

时间:2010-08-19 17:27:00

标签: hudson

我正在考虑在哈德森建立工作岗位的最佳方式,以及划分什么 工作。我将使用.NET应用程序作为示例,因为这就是我 我现在正在努力,但我认为很多想法都是通用的。

这些是我想要执行的步骤,而不考虑 将事情分解为工作但仍在考虑什么 依赖关系是:(我希望你理解我的符号,< - 意思是 取决于和[X] = aaaaa意味着aaaaa是任务的描述 [X]。 )

  • [C] =在这种情况下使用Mercurial检查项目。
  • [C]< - [S] =在源文件上运行StyleCop以确保它们符合要求 我们的编码标准。
  • [C]< - [D] =使用DoxyGen或Sandcastle从我们的项目创建文档。
  • [C]< - [O] =运行代码任务插件以获得精彩的演示文稿 我们的TODO等评论。
  • [C]< - [B] =使用MSBuild和Release目标构建解决方案。 在这种情况下的结果将是库文件编译为DLL程序集 文件。我们想归档这些文物。
  • [B]< - [T] =对库文件运行NUnit测试。
  • [B]< - [F] =使用FxCop从中获取一些不错的静态代码分析 库文件。
  • [B]< - [W] =使用构建日志中的编译器警告插件 提取编译期间给出的所有警告。
  • [D],[B]< - [R] =发布,创建发布存档并将其上传到服务器。

如果我把所有这些分成不同的工作:

  • 如何获取我在步骤[C]中获得的已检出源代码 在步骤[S],[D],[O],[B]都需要源代码?
  • 我应该如何在步骤[W]中获取MSBuild日志文件 在步骤[B]生成?
  • 如何获取步骤[B]中生成的结果DLL工件 步骤[T]和[F]谁都需要它们?

如果我把所有步骤分成不同的项目,我的主要问题是 如何在不同项目之间获取这些文件,这些文件 以一种很好的方式(我当然可以转向硬编码文件路径, 但这似乎不灵活,但我可能错了。)

另一方面,如果我将它们分成不同的项目,我会得到 每个项目的复杂程度都低于我填写所有这些项目时的复杂程度 步入单个项目。如果我有可能很难维持 一个项目中有很多东西。我也无法逃跑 并行的并行项目,我想会加快整体 过程

2 个答案:

答案 0 :(得分:0)

我对'工作'有不同的理解。在我的情况下,我正在使用Hudson构建多个项目,对于某些项目,我有多个工作,但不是出于上述原因。

我使用像Ant或Maven这样的项目构建工具来制作我的构建的一些非常具体的步骤,例如你的[O]或[D]任务。对于更通用的步骤,我使用处理此过程的hudson插件,例如运行单元测试,部署工件。

我想你会发现很多这些插件都是跨语言的。

然而,Hudson这是一个令人惊叹的强大的持续集成工具,我可以说它是由Maven和它的插件完成的。代码覆盖率报告,findbugs报告,项目站点生成,javadoc生成,字节代码检测是我依赖Maven做的一些任务。

所以,当我想为每个构建创建一个不同的最终目标时,我使用不同的工作,而不是为了创建一个我希望成为最终工件集的元素链。

例如,我有一份工作,每小时构建我的应用程序并在出现任何错误时创建电子邮件报告,并且我为同一个项目生成第二份工作,生成该项目的版本,这个是手动调用的我用它来生成我必须组装的所有文档,报告和工件,以便稳定地发布我的项目。

希望我对哈德森的看法有所帮助。

答案 1 :(得分:0)

你列出了很多工作任务。为每项任务找一份工作通常没有意义。将它们分组更有意义。例如,根据我的经验,它不会为你买一件单独的结账工作。

请记住,更多的工作会使构建过程更加脆弱,并使维护更加困难和复杂。因此,首先设定您的目标/策略,然后将构建过程划分为单个作业。

我追求的理念是频繁登记到存储库以及每个签入都不应该破坏构建。这意味着我需要确保开发人员在签入后获得快速反馈。所以我需要一个工作C,B,T,W以及S这个顺序。如果您愿意,也可以使用此作业运行O和F.这个订单给你带来了什么?您可以获得有关最重要项目的快速反馈,并编译代码。第二个最重要的项目是,单元测试是否完成他们应该做的事情(单元测试)。然后针对不太重要的项目(编译器警告和编码标准)进行测试。之后,您可以运行统计信息。就个人而言,我会在夜间构建中运行O(ToDos)和F(代码分析),它运行整个版本。但是你也可以在每次签到时运行整个版本。

如果需要更快的工件,我只会将构建/发布过程分成更小的步骤。对我来说,当工作运行长达15分钟时通常是可以接受的。为什么?因为如果它中断(可能小于2分钟)我得到快速反馈,因为作业在此处停止并且不运行其他(现在无用的)任务。有时我会并行工作。对于并行执行和分割作业时,我主要使用标准依赖项(“作业后构建...”)到目前为止,触发依赖项目,但大多数情况下我使用parametrized trigger plugin。我越来越多地使用join plugin并行运行一些步骤,但只有两个部分都完成后才能继续。

要在两个作业之间传递文件,我曾经使用外部存储库(只是Windows上的共享目录),并将文件路径作为参数传递给下一个作业。我切换了行为,现在使用Hudson的归档工件函数,并将作业运行的URL传递给下一个作业,通过HTTP下载它们。这消除了在Unix上安装Windows共享的技术问题(即使CIFS做得非常好)。此外,您可以使用Clone Workspace SCM插件,如果您需要其他工作中的整个工作区,这将有所帮助。