我正在使用Jenkins PowerShell插件来构建一个项目。
然而,我发现Jenkins总是认为我的构建成功,无论我在Windows PowerShell
命令中输入什么。
下面是一个例子:
正如您所看到的,asdf
不是一个法律的的命令。Jenkins应该在构建后给予我FAILURE
。
但控制台输出给我:
Started by user admin
Building in workspace C:\Users\Administrator\.jenkins\jobs\Test\workspace
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1'"
The term 'asdf' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1:1 char:5
+ asdf <<<<
+ CategoryInfo : ObjectNotFound: (asdf:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Finished: SUCCESS
我认为PowerShell的执行结果应该取决于$lastexitcode
。
这是PowerShell插件的bug吗?
7条答案
按热度按时间hc2pp10m1#
从1.3开始,插件将不会处理异常,例如缺少命令的异常。你可以用
try/catch
来实现:MSDN更多
h43kikqp2#
对我来说,我希望脚本在Jenkins中遇到错误时立即停止并失败。这是通过将以下内容添加到脚本的开头来实现的:
$ErrorActionPreference =“停止”
这里讨论:如何在第一个错误时停止PowerShell脚本?][1]
[1]:How to stop a PowerShell script on the first error?。..................
ndh0cuux3#
根据插件的最新版本(Version 1.3 Sept 18 2015),您必须使用$LastExitCode才能使构建失败。
版本1.3(2015年9月18日)
*脚本现在使用$LastExitCode退出,导致非零退出代码将构建标记为失败
0lvr5msh4#
我想在这里补充一下,我刚刚遇到了一个怪癖:你必须有这powershell脚本结束与
exit
而不是return
.我的Jenkins烟斗看起来像:
我使用的是
if(error condition) { return 1 }
,当1在jenkins控制台中显示为返回值时,它 * 没有 * 失败构建。当我使用if(error condition) { exit 1 }
时,构建失败了。我认为这是对这个线程的一个有益的补充-需要使用
exit
而不是return
。但我不明白这部分:管道检查result
是否为非零。exit
和return
在使用return
时导致if(result) { error }
无法正常工作的powershell指令中有什么区别?**2021年2月16日更新:**回到这里,根据我的经验添加更多注解:我认为我所做的和很多人所做的混淆了事情,就是使用
returnStdout
或returnStatus
,而不是检查它们和/或不完全理解返回的内容。如果你使用其中任何一个参数,Jenkins都不会根据它们的值为你做任何事情。你必须自己检查并采取相应的行动。另一方面,如果你不使用它们,Jenkins会识别出一个失败的代码,如果有一个代码返回,就会使管道失败。
想想看:如果你设置了
returnStatus
,你将从步骤中得到退出代码作为返回值,而不是Jenkins本身需要担心的东西。如果您设置returnStdout
,您将获得stdout
流-并且 * 没有 * 任何错误代码或来自stderr
的任何内容。因此,您必须检查您想要的返回,否则您将无法获得预期的行为。我一直在做的事情实际上是不设置这些参数中的任何一个,并确保在我的管道中运行的任何和所有PowerShell脚本开始时设置
$ErrorActionPreference = 'Stop'
。这样,任何powershell故障都会自动按预期使管道失败,而不必检查它。xfb7svmp5#
这就是我如何实现RRIROWER的解决方案。希望能帮上忙。
确保您的powershell脚本退出所需的值。
运行
"exit <value>"
作为最后一行。eh57zj3b6#
最终,我不得不在Jenkins中采用以下配置,因为这里的解决方案都不适合我。克里斯·纳尔逊的回答让我走上了正确的道路。我们正在远程调用chef-client,所以我们必须做一些小魔术来让远程PS会话与本地会话对话,然后将状态传递给Jenkins。
当然,你必须提供你自己的环境变量!:)
jm81lzqq7#
下面的示例显示Powershell cmdlet不设置
$LASTEXITCODE
。因此,它只在运行可执行文件时有用。对于纯PowerShell,您需要处理错误并自己提供退出代码。为了避免在try/catch中嵌套整个脚本,可以使用trap。本地try/catch仍然可以用于处理您预计会失败的块。