TFS 2013 默认模板运行 PowerShell 脚本并记录输出。

10

使用VS 2013从构建过程内运行PowerShell脚本变得非常简单了。不幸的是,所有write-host命令都没有被记录到TFS构建日志中。

因此,在构建完成后,我无法查看日志文件并了解PowerShell脚本的实际执行情况。

日志文件只会显示:

Run optional script after MSBuild 00:03
Run optional script before Test Runner 00:00
Run VS Test Runner 00:00
Run optional script after Test Runner 00:00
...

ActivityLog.AgentScope.1.xml日志文件更加健谈,但仍然缺乏足够的信息。

Run optional script after MSBuild00:00:03
InputsEnvironmentVariables: 
Enabled: True
Arguments: 
FilePath: $/CMP04/Some/Project/Main/Web/.scripts/CI/CI.ps1

OutputsResult: 0

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -NoProfile -NonInteractive -File "D:\ws_build\1\CMP04\IP-Main\src\Some\Project\Main\Web\.scripts\CI\CI.ps1"

有什么办法可以将调试信息输出到 TFS 构建日志中吗?

当然我可以创建一个额外的日志文件,但那是备选计划 :)

编辑:write-host 日志被记录到代理的日志 XML 中。 write-verbose 没有记录。


没有在文件夹中找到日志?尝试使用诊断构建。 - KMoraz
我确实有日志。这个问题是关于它们实际包含了什么 - 或者更准确地说,没有包含什么。 - lapsus
你尝试过使用 Verbosity=Diagnostic 运行吗? - KMoraz
在2013年,不再有这样的选项了。我相信。 - lapsus
1
Ok,Write-host 出现在构建代理的日志文件中。Write-verbose 没有出现。 - lapsus
5个回答

21

在VS 2013中,显式设置默认构建模板的冗长度已经消失了;取而代之的是每个构建记录诊断信息。原始数据会被转储到代理的xml日志中,就像你提到的那样,它会出现在Build Drops文件夹中。不过要想得到一个良好的视图,你必须从Team Web Access中访问它;你不能再从Visual Studio中访问,因为在Visual Studio中查看这些诊断日志通常会导致VS挂起。

因此,要在Team Web Access中查看诊断日志,你可以:

  • 如果使用VS 2013,则只需右键单击“构建资源管理器”中的构建并选择“在浏览器中打开”。

或者

  • 从Team Web Access的团队项目页面中,选择“构建”选项卡,找到您感兴趣的构建,双击它,然后选择“诊断”选项卡。

以下是我在TFS 2013 Update 2上进行实验时发现的内容:

在构建摘要和日志视图中(仅有的两个可用于VS内部的视图),只有Write-Error消息会显示出来。在您的PowerShell脚本中使用Write-Error不会将构建标记为“失败”,而是会导致它“部分成功”。

在“诊断”视图中,Write-Host、Write-Output、Write-Warning和Write-Error都会显示出来。但即使您将-Verbose和-Debug开关作为PowerShell脚本参数传递,Write-Verbose和Write-Debug也不会显示出来。


在 TFS 2013 Update 3 上表现相同。感谢您对发现的详细描述。 - JamesQMurphy
非常感谢。找到这个对我非常有帮助。我已经花了几个小时来尝试解决这个问题。 - FOO
在诊断选项卡中查看Write-Host的输出结果非常好,但是在构建过程中如何获取Write-Host的输出呢? - SmudgerDan
2
要显示 Write-Verbose 的详细输出,必须在构建定义中为脚本设置 -verbose 标志。 要使此标志工作,必须在脚本中设置 [CmdletBinding()] 属性。 我从此脚本中得到了这个提示:https://tfsbuildextensions.codeplex.com/SourceControl/latest#Scripts/GatherItemsForDrop.ps1(但我没有尝试过) - bitbonk
在脚本中设置“[CmdletBinding()]”,并在构建定义中使用“-verbose”参数即可解决问题。在构建的诊断Web视图中,我可以看到很多关于我的Write-Verbose cmdlet的“VERBOSE: ...”消息。 - gReX

4
如果您正在使用TFS 2013默认模板,您可以在“团队Web访问”下的构建中检查诊断日志,选择要显示日志的构建,然后您将看到三个选项:
概要日志诊断
点击诊断链接,您将看到非常详细的日志,包括PowerShell脚本输出。
Moises。

1

您可以使用BuildExplorer查看更详细的构建日志。

声明:我是此项目的维护者。


1
我也曾遇到这个问题。2013年,我有4行写有“debug”信息。你必须只使用Write-Host来进行调试。如果你的一行是例如Write-Verbose,则所有的Write-Host都不会显示在构建的诊断选项卡中。我已在TFS2013 Update 2中测试过此方法。
你可以同时使用Write-HostWrite-Warning

我刚刚在同一个PowerShell脚本中多次使用了Write-Host、Write-Output、Write-Verbose、Write-Warning、Write-Error和Write-Debug进行测试,它们都显示在诊断日志中,除了Write-Verbose和Write-Debug。这两个似乎从未被记录。 - deadlydog

0

如果你想捕获Write-Host,你可以使用Start-Transcript。除了TFS之外,你还需要考虑记录什么以及如何记录。


1
Start-transcript没有工作。它创建了日志文件和一切,但实际上没有写入任何内容。但是当我手动运行脚本时就可以写入。我需要进行调查。 - lapsus

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