我使用 CAKE 0.22.0。
在我的一个构建步骤中,我添加了一个 Finally
子句。在 Finally
中,我调用了 RunPowershellScript
方法,该方法依次执行驻留在版本控制中的 Powershell 脚本。
在我的主源存储库的本地克隆中进行测试时,一切都成功运行,在任何阶段都没有抛出异常。
但是,在 TeamCity 上,RunPowershellScript
方法抛出 System.NullReferenceException
并显示错误消息 Object reference not set to an instance of an object.
:
我登录到我的构建代理并能够 100% 确信 PowerShell 脚本运行没有问题。
问题: 1. 为什么在构建代理上成功执行了 PowerShell 脚本却抛出异常? 2. 为什么我无法在本地重现错误?
附录 1:
回应Matt's comment我决定通过将 $ErrorActionPreference
设置为 Stop
来检查我的脚本是否抛出了任何非终止错误。
我的脚本运行完成,没有在我的本地机器上抛出任何错误(终止或其他)。当我登录到我的构建代理时,我还可以看到脚本已成功运行至完成。所以我现在真正不明白的是,为什么即使 PowerShell 脚本运行 100% 正常,但 TeamCity 上的构建还是失败了。
附录 2:
在远程构建代理上再次构建失败(抛出相同的异常)后,我再次登录进行调查。在我的 Powershell 脚本中,我有一个字典,其中键是 string
,值是 string[]
。我还有一个 for
循环,它枚举提供的键的所有值。
这一次,我能够验证枚举在数组中的第一项之后停止,并在此时抛出异常。以前,即使枚举了数组中的所有项目,也会抛出异常。 CAKE 的 Powershell 加载项中是否存在错误?
当我通过直接调用 Powershell 脚本(即 不是 通过使用 CAKE 的 Powershell 加载项)来测试它时,完成了所有值的枚举,没有任何问题。当我通过在本地计算机上运行 build.cake
对其进行测试时,它也成功运行完成。
因此在我看来,异常消息仅在 TeamCity 构建期间由 CAKE 抛出,无论 PowerShell 脚本是否成功执行。
最佳答案
我怀疑 TeamCity 正在寻找来自 poweshell 脚本的返回代码。您可能需要让它返回 0。
您可以通过添加:
EXIT 0;
到你脚本的结尾。如果 0 不起作用,请尝试 1。
关于c# - CAKE 在 TeamCity 构建期间抛出异常,但无法在本地重现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46771517/