Jenkins PowerShell插件总是成功构建

3qpi33ja  于 2023-05-06  发布在  Jenkins
关注(0)|答案(7)|浏览(188)

我正在使用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吗?

hc2pp10m

hc2pp10m1#

从1.3开始,插件将不会处理异常,例如缺少命令的异常。你可以用try/catch来实现:

try
{
    asdf
}
catch
{
    write-host "Caught an exception"
    exit 1
}

MSDN更多

h43kikqp

h43kikqp2#

对我来说,我希望脚本在Jenkins中遇到错误时立即停止并失败。这是通过将以下内容添加到脚本的开头来实现的:
$ErrorActionPreference =“停止”
这里讨论:如何在第一个错误时停止PowerShell脚本?][1]
[1]:How to stop a PowerShell script on the first error?。..................

ndh0cuux

ndh0cuux3#

根据插件的最新版本(Version 1.3 Sept 18 2015),您必须使用$LastExitCode才能使构建失败。
版本1.3(2015年9月18日)

  • PowerShell现在以非交互模式运行,以防止交互提示挂起生成
  • PowerShell现在运行时将ExcectionPolicy设置为“Bypass”,以避免执行策略问题
    *脚本现在使用$LastExitCode退出,导致非零退出代码将构建标记为失败
  • 添加了可用环境变量的帮助和列表(包括英语和法语翻译)
0lvr5msh

0lvr5msh4#

我想在这里补充一下,我刚刚遇到了一个怪癖:你必须有这powershell脚本结束与exit而不是return.
我的Jenkins烟斗看起来像:

script {
  result = powershell(returnStatus: true, script: '''...if(error condition) { return 1 }''')
  
  if(result) { error }
}

我使用的是if(error condition) { return 1 },当1在jenkins控制台中显示为返回值时,它 * 没有 * 失败构建。当我使用if(error condition) { exit 1 }时,构建失败了。
我认为这是对这个线程的一个有益的补充-需要使用exit而不是return。但我不明白这部分:管道检查result是否为非零。exitreturn在使用return时导致if(result) { error }无法正常工作的powershell指令中有什么区别?

**2021年2月16日更新:**回到这里,根据我的经验添加更多注解:我认为我所做的和很多人所做的混淆了事情,就是使用returnStdoutreturnStatus,而不是检查它们和/或不完全理解返回的内容。

如果你使用其中任何一个参数,Jenkins都不会根据它们的值为你做任何事情。你必须自己检查并采取相应的行动。另一方面,如果你不使用它们,Jenkins会识别出一个失败的代码,如果有一个代码返回,就会使管道失败。
想想看:如果你设置了returnStatus,你将从步骤中得到退出代码作为返回值,而不是Jenkins本身需要担心的东西。如果您设置returnStdout,您将获得stdout流-并且 * 没有 * 任何错误代码或来自stderr的任何内容。因此,您必须检查您想要的返回,否则您将无法获得预期的行为。
我一直在做的事情实际上是不设置这些参数中的任何一个,并确保在我的管道中运行的任何和所有PowerShell脚本开始时设置$ErrorActionPreference = 'Stop'。这样,任何powershell故障都会自动按预期使管道失败,而不必检查它。

xfb7svmp

xfb7svmp5#

这就是我如何实现RRIROWER的解决方案。希望能帮上忙。

<yourscript>.ps1; exit $lastexitcode

确保您的powershell脚本退出所需的值。
运行"exit <value>"作为最后一行。

eh57zj3b

eh57zj3b6#

最终,我不得不在Jenkins中采用以下配置,因为这里的解决方案都不适合我。克里斯·纳尔逊的回答让我走上了正确的道路。我们正在远程调用chef-client,所以我们必须做一些小魔术来让远程PS会话与本地会话对话,然后将状态传递给Jenkins。

  • $res给出chef-client的输出。
  • $lastsuccess是真还是假取决于PS的约定规则。

当然,你必须提供你自己的环境变量!:)

Write-host "Deploying $env:Computer with $env:Databag data bag... "
 $secstr = ConvertTo-SecureString $env:Password -AsPlainText -Force 
 $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $env:User, $secstr
 $s = New-PSSession -ComputerName $env:Computer  -Credential $cred
 $res = Invoke-Command -Session $s -ScriptBlock { try {chef-client} catch {exit 1}}
 $lastsuccess = Invoke-Command -Session $s -ScriptBlock {$?}
 Remove-PSSession $s
 write-host " --- "
 write-host $res
 write-host " --- "
 if($lastsuccess)
 {
  write-host "chef deployment completed"
  exit 0
 }
 write-host "chef deployment had errors"
 exit 1
jm81lzqq

jm81lzqq7#

下面的示例显示Powershell cmdlet不设置$LASTEXITCODE。因此,它只在运行可执行文件时有用。

$LASTEXITCODE = 0 # Success
try {
  CommandDoesntExist
} catch {
  # Exit code is unchanged
  Write-Error $Error[0]
  Write-Host "Exit Code $LASTEXITCODE"
}

>> Error Message...
>> Exit Code 0

对于纯PowerShell,您需要处理错误并自己提供退出代码。为了避免在try/catch中嵌套整个脚本,可以使用trap。本地try/catch仍然可以用于处理您预计会失败的块。

# Global error handling avoids nesting all
# code in a try/catch/finally.
trap { Write-Error $Error[0]; exit 1 }

# Block specific error handling
try {
  throw "Worst case scenario"
} catch {
  write-host "Handled error doesn't trigger trap"
}

# Finally example
try {
  throw "Worst case scenario"
} finally {
  write-host "I still cleanup"
}

exit 0

相关问题