我使用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.为什么我无法在本地重现错误?
在回复Matt's comment时,我决定通过将$ErrorActionPreference
设置为Stop
来检查我的脚本是否抛出了任何非终止错误。
我的脚本运行完成而不会在我的本地计算机上抛出任何错误(终止或以其他方式)。当我登录到构建代理程序时,我还可以看到脚本已成功运行完成。所以我现在真正不理解的是为什么在TeamCity上构建失败,即使PowerShell脚本运行100%。
在远程构建代理上发生另一次构建失败后(抛出相同的异常),我再次登录进行调查。在我的Powershell脚本中,我有一个字典,其中键是string
s,值是string[]
s。我还有一个for
循环,它枚举了所提供密钥的所有值。
这次,我能够验证枚举在数组中的第一项之后停止,并且此时抛出了异常。以前,即使数组中的所有项都是枚举的,也会抛出异常。 CAKE的Powershell加载项中是否存在错误?
当我通过直接调用Powershell脚本(即使用CAKE的Powershell加载项而不是)来测试它时,枚举完成的所有值都没有任何打嗝。当我在本地计算机上运行build.cake
进行测试时,它也成功运行完成。
所以在我看来,只有在TeamCity构建期间,CAKE才会抛出异常消息,无论PowerShell脚本是否成功执行。
答案 0 :(得分:1)
我怀疑TeamCity正在寻找poweshell脚本的返回代码。您可能需要让它返回0.
您可以通过添加:
来完成此操作EXIT 0;
到脚本的末尾。如果0不起作用,请尝试1.