8

我们目前正在运行 Jenkins (Hudson) CI 服务器来构建和打包我们的 .net Web 项目和数据库项目。一切都很好,但我想开始编写单元测试,然后只有在单元测试通过时才通过构建。我们正在使用内置的 msbuild 任务来构建 Web 项目。使用以下论点...

MsBuild Version           .NET 4.0
MsBuild Build File    ./WebProjectFolder/WebProject.csproj  
Command Line Arguments    ./target:Rebuild /p:Configuration=Release;DeployOnBuild=True;PackageLocation=".\obj\Release\WebProject.zip";PackageAsSingleFile=True

我们需要对我们的代码运行自动化测试,这些代码在我们在机器上构建时会自动运行(可能是构建后事件),但也会在 Jenkins 为该项目进行构建时运行。

如果您像这样运行它,它不会构建单元测试项目,因为 Web 项目不引用测试项目。测试项目将引用 Web 项目,但我很确定这将扼杀我们的自动化构建,因为它们主要用于构建和打包我们的部署。运行这些测试应该是自动化构建和打包过程中的一个步骤。

选项 ...

  1. 创建两个 Jenkins 作业。一个运行测试......如果测试通过另一个构建被触发,它构建和打包 web 项目。将构建后事件放在测试项目上。
  2. 构建解决方案而不是项目(确保解决方案包含所需的测试)并将构建后事件放在将运行 nunit 控制台以运行测试的任何测试项目上。然后使用命令行将所有需要的文件从每个 bin 和 content 目录复制到一个包中。
  3. 只需在 jenkins 中构建测试项目,而不是在 jenkins 中构建 web 项目。测试项目将引用 Web 项目(取决于您正在测试的内容)并构建它。

问题 ...

  1. 有两份工作,没有一份。要调试的两件事不是一件。一种是查看测试是否通过,另一种是构建和编译 Web 项目。测试可以通过,但如果您正在测试的东西没有使用它,则构建可能会失败......
  2. 这需要我们确切地知道构建中的内容。现在 msbuild 为我们完成了这一切。如果您有多个团队在每次创建一个额外的文件夹时都在处理一个项目,那么您必须担心可能脆弱的命令行语句。
  3. 这似乎破坏了我们这里的主要目的。测试应该是这个过程中的一个步骤,而不是这个过程中最重要的事情。我也不是 100% 确定触发构建与正常构建相同,它是否与正常构建做所有相同的事情。以相同的方式移动所有正确的文件将它们全部移动到相同的目录等。

初始问题。

我们希望在构建主项目时运行我们的测试。但是将构建后事件添加到针对测试项目运行的 Web 项目不起作用,因为 Web 项目不引用测试项目并且不会触发该项目的构建。我可以继续……但这已经足够了……

我们花了大约一周的时间试图让这项工作很好地完成,但没有成功。如果您觉得可以得到更好的回应,请随时编辑此内容...

4

1 回答 1

9

在 Jenkins/Hudson,有很多工作是很正常的。一些用于编译触发的版本控制更改,一些用于运行(单元)测试,由成功构建触发,一些用于执行更多测试(集成),由成功的早期测试触发,一些用于部署,由成功通过所有测试触发。

Look at plugins like join, build pipeline, parametrized trigger and more to help out with this.

This will also allow things to happen in parallel, by using multiple nodes. Trying to cram everything in one job is not the way to go.

于 2012-10-25T10:57:32.737 回答