如何在 TeamCity 中构建多个相关的 .NET 解决方案?

How to Build Multiple Dependent .NET Solutions in TeamCity?

我们有一个应用程序,其组件是在多个 Visual Studio 解决方案 (.sln) 中开发的。有时会添加或删除解决方案。 DLL 等构建输出被复制到共享文件夹中。来自其他解决方案的项目引用这些 DLL。这是一个简化的示例:解决方案 A 和 B 各包含两个项目。方案B的项目B2引用了方案A的项目A2。

旁注:我们正在用 NuGet 包替换共享驱动器;然而,下面的问题仍然很明显。

TeamCity 支持构建依赖项。此 video 演示如何手动设置。

但是,我们希望 TeamCity 自动(!!)解决项目之间的依赖关系。因此,在上面的示例中,我们希望 TeamCity 首先构建解决方案 A,然后再构建解决方案 B。我们如何配置 TeamCity 以自动获取这些依赖项而无需手动维护它们?

遗憾的是它不能自动。可以考虑自己写插件。

您通常会设置快照依赖项,在您的示例中,B 构建将具有对 A 构建的快照依赖项。

在您移至 NuGet 的情况下,它将恢复解决方案引用的任何内容。您可能希望像上面那样具有快照依赖性但不是必需的,每个解决方案都会确定它需要什么。

更新 1 - 自动化

我想你应该可以用 Rest API, documentation is not very clear but I did find this gist 来完成它,它有一个添加和删除快照的例子。

您可能需要制定一些项目设置的约定,以便更容易匹配项目。

您还应该检查 plugins page 以获取抽象了 API 的库。

我在 JetBrains Developer Community 中问过这个问题。 JetBrain 对此的评论:

[...] it is not a TeamCity-specific issue since I expect that you should be able to reproduce such a build procedure locally on developer machines. [...] the .net ecosystem itself doesn't provide a solution. There is [...] the option to write your own plug-in for msbuild or generate solutions (.sln files). [...]

换句话说:即使使用最新版本 TeamCity 9 也没有自动的方法来立即解决所描述的问题。从完全手动设置到自定义工具,有多种选择:

  • 将多解方法改为单解。
  • 更改为 NuGet 而不是手动设置程序集引用。
  • 在 TeamCity 中手动设置依赖项。
  • 编写自己的插件;另见 JonSquared's .
  • 编写生成单个解决方案 (SLN) 的自定义工具,该解决方案可以被 TeamCity 消化。

与将程序集放在共享驱动器上相比,NuGet 无疑是一种更好的方法,所以我很高兴看到您正在朝着这个方向前进。

至于在构建依赖项目后自动构建消费项目,您有几个选项可以触发构建。要么:

  1. 使用 NuGet 构建触发器 这允许在添加新包版本时触发构建。
  2. 设置项目之间的构建依赖关系。

下一部分很棘手,您有几个(艰难的)选择。 您面临的挑战是包是在 packages.config 中定义的,虽然您可以使用 NuGet 更新来更新包,但您需要决定是否希望 TeamCity 签入更改。因此,关于您可以做什么的一些想法是:

  1. 检查包更新是否可用(使用 NuGet 更新),如果有则构建失败。这用作通知开发人员然后手动更新包并处理可能出现的任何集成问题。
  2. 更新软件包并签入 packages.config。这应该在新的构建配置上完成,该配置在新的依赖项可用时触发。由于这将创建签入,因此您现有的项目构建将 运行 使用新的 packages.config。

我建议您从 1) 开始,然后在您对工作流程有信心并且没有出现问题时继续进行 2)。

你要做的事情很艰难,所以我希望我已经给了你更多的解决方案供你考虑。但我认为这是一项有价值的练习,可以帮助您长期 运行。不幸的是,没有一种适合所有人的尺寸,因此您必须试验并使您的流程成熟。

虽然 TeamCity 是一个很棒的系统,但它在您尝试使用它的方式上确实存在不足。我建议看看 ThoughWorks GO。它更适合您想要实现的目标,但不幸的是不如 TeamCity 直观和成熟。 http://www.go.cd