TFS 2010多个解决方案和通过门控检入构建

7
我有两个解决方案,分别在它们对应的文件夹中,例如:
  1. SolutionA\SolutionsA.sln
  2. SolutionB\SolutionB.sln
每个解决方案都配置了Gated Check-in构建;即两个构建定义GatedSolutionA和GatedSolutionB。
现在的情况是,如果我一起检入两个文件夹中的更改,TFS会显示一个对话框来选择要针对更改集运行的构建(下拉菜单有GatedSolutionA、GatedSolutionB)。我的更改集在Solution B中有破坏性更改,在Solution A中有非破坏性更改。即构建GatedSolutionB将失败,但GatedSolutionA将通过。
当我选择GatedSolutionA来构建我的更改集时,TFS会检查它,这反过来会使Solution B处于破碎状态,并且Gated check-in的目的对于Solution B而言也失去了意义。
如果我将触发器更改为构建定义的CI,则TFS会排队两个构建。
我想要的是相同的行为,即所有Gated构建都排队,如果其中一个失败,则应拒绝更改集。
注意:我不想为两个解决方案创建单个构建定义。此外,我知道我们可以通过创建两个单独的更改集来避免发生此问题,但通常情况下,开发人员不知道他们正在为其他解决方案检查文件。

2019年更新

自从TFS和Azure DevOps开始使用GIT和Pull request - 使用分支策略(在主分支上)可以添加多个构建检查,例如对于路径SolutionA\*中的更改,可以配置BuildA排队并进行检查,同样对于路径SolutionB\*中的更改,可以配置BuildB排队并进行检查,因此对于具有这两个路径更改的提交将会排队这两个构建进行检查。使用GIT值得等待。

分支策略:https://learn.microsoft.com/en-us/azure/devops/repos/git/branch-policies?view=azure-devops#build-validation

注意:文档未更新以显示路径过滤器,并且在此处提出了github缺陷https://github.com/MicrosoftDocs/vsts-docs/issues/3235。因此,该过滤器在Azure DevOps和Server中可用。


我可以问一下,为什么您不想为两个解决方案创建一个构建定义呢?在我看来,这似乎是唯一的解决方案。 - Duat Le
我们为每个解决方案设置了CI构建。一个开发者一次只能在一个解决方案上工作。当开发者提交不打算提交的更改时,我遇到了这个错误,因为您可能知道,如果从Visual Studio的解决方案资源管理器中提交更改,则默认情况下会包括所有文件。 - scorpio
抱歉,我仍然不确定您是否回答了我的问题。您可以拥有多个CI构建定义,但是您是否可以为两个解决方案使用一个Gated-checkin构建定义? - Duat Le
在场景中,我们只讲解了一个小型的解决方案,但在现实世界中,我有大约100个解决方案。而且事实上,我所解释的方法可以被用作黑客攻击来破坏任何构建。 - scorpio
4个回答

3

@Gchaves发现了解决该问题的方法,您可以转到“编辑构建定义”,并在“工作区”选项卡中,如果将“源代码控制文件夹”配置为内部文件夹,则可以配置SolutionA所在的文件夹。

例如,如果您有这个文件系统:

  1. Projects\SolutionA\SolutionA.sln
  2. Projects\SolutionB\SolutionB.sln

现在,如果您将“源代码控制文件夹”和“构建代理文件夹”配置为Projects\SolutionA,则仅在尝试检入SolutionA时才会触发门控检入,并且仅编译SolutionA.sln(为此,您必须仅指向Process Tab ->1.Required->ProjectsToBuild中的SolutionA.sln)。

然后,您可以在同一工作区下独立地构建、检入和标记多个解决方案:)


1
在构建定义的“进程”选项卡中,您可以选择多个sln进行构建。

1
天蝎座不是不想要一个构建定义来构建所有解决方案吗? - Duat Le

0
解决这个问题的一个方法是为开发人员映射单独的工作区,以用于不同的解决方案。如果解决方案之间没有代码重叠,并且您想要防止开发人员在构建另一个解决方案时检入一个解决方案,则应该使用不同的工作区。
例如,对于SolutionA,您可以使用WorkspaceA,对于SolutionB,您可以使用WorkspaceB,那么挂起的更改对话框将仅显示适当工作区中所做的更改。
正如您所说,您知道可以通过使用单独的变更集来避免此问题。这是如何“强制”开发人员使用两个单独的变更集并避免“开发人员不知道…”的情况。
为他们创建工作区并撤销他们的“创建工作区”权限,以便他们无法创建包括两个区域的工作区。

0

我知道你说过你“不想为两个解决方案创建单一的构建定义”,但这实际上是你唯一可行的选择。我的建议是有两个分支,一个用于功能开发,另一个用于集成。让你的开发人员在功能分支中工作,并为这些解决方案使用门控式检入(或CI)构建。定期将功能分支中的更改合并到一个集成分支中,该分支具有单个门控式检入构建定义,可以构建所有解决方案。这将使你的集成分支构建保持干净。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接