直接调用 Build vNext 任务

Call Build vNext task directly

构建 vNext 任务是对之前构建过程的重大改进。不过,一个缺点是我无法使某些任务成为有条件的。我可以为每个组合创建一个额外的构建,但这显然很难扩展,如果我们必须更改构建的其他部分,则会导致大量额外的工作。

相反,我更希望能够编写自己的 PowerShell 任务来调用现有的构建任务。这至少有一个缺点(如果没有构建专门要求 vso 任务,构建代理将不会下载它),但考虑到我们使用的是本地 TFS 和构建代理,我可以接受这一点。

我尝试执行如下操作:

$path = get-item "$env:AGENT_HOMEDIRECTORY\Tasks\NuGetPackager[=10=].1.56\NuGetPackager.ps1"
& "$path" -searchPattern $searchPattern -outputDir "$packageFolder" -configurationToPackage $configurationToPackage -nugetAdditionalArgs "$nugetAdditionalArgs -version $nugetVersion" 

遗憾的是,这会导致以下错误:

2016-04-12T09:50:22.3652811Z ##[error]import-module : Could not load file or assembly 'Microsoft.TeamFoundation.DistributedTask.Agent.Interfaces,  
2016-04-12T09:50:22.3652811Z ##[error]Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find 
2016-04-12T09:50:22.3652811Z ##[error]the file specified.
2016-04-12T09:50:22.3652811Z ##[error]At C:\Agent1\Tasks\NuGetPackager[=11=].1.56\NuGetPackager.ps1:19 char:1

现在我在网上找到的一个解决方案表明我可以将寻找的 dll 添加到 GAC,但我真的、真的不想这样做。同样清楚的是,当直接从 TFS 调用时,任务工作得很好,那么我缺少什么配置?

我尝试将包含 dll 的文件夹添加到路径中,甚至在 PowerShell 中显式调用 SetDllDirectory,但这些都没有帮助。

环境:Windows构建代理和 TFS 服务器上的 Server 2012 R2。 TFS 2015 更新 1.

2015 RTM 到 Update 2 的构建代理使用的 Powershell 任务主机是一个自定义主机,它执行创造性的操作来解析程序集和处理 input/output。无法从代理外部调用这些任务。

此外,相当多的构建任务是使用 Node 实现的,因此您必须检测哪个是哪个并相应地调用它们。

正在构建任务 migrated to a new vsts-task-lib,这将支持代理外调用。这些将完全满足您的需求。

与此同时,您可以执行现有任务(在大多数情况下它们是一个简单的清单加脚本)并向任务添加一个 string 参数,您可以在其中粘贴一个变量,然后您可以视为条件。您需要替换所有标准任务。然后再次推动它们。如果您保持 ExtensionID 和 Task GUID 相同,它们将作为就地替换。这可能是最简单的方法来做你想做的事,而不必执行各种取消任务 UI 的黑客攻击。只需将版本号设置得高得离谱,例如 100.0.1.83。这样您将始终使用您的版本。

注意: 新构建应该是可重复的,因为多次调用同一个构建它们总是产生相同的结果。条件操作可以在存储在源代码管理中的自定义 powershell 脚本中捕获。这些可以作为工作流的一部分执行。