如果返回状态为错误,则在 Jenkins 声明式管道中获取输出 bat

问题描述 投票:0回答:1

我正在尝试获取 bat 脚本的输出,无论返回状态如何。

String spectralOutput
try {
  spectralOutput = bat(script: '''
    @spectral lint "%WORKSPACE%\\SelfContained\\*.json" --ruleset "%WORKSPACE%\\spectral\\.spectral.json"
    ''', returnStdout: true, encoding: 'UTF-8')
} catch (hudson.AbortException e) {
  spectralOutput = spectralOutput.replace('\n', '<br>')
  // Parse Spectral output
  if (!spectralOutput.contains('0 errors')) {
    echo spectralOutput
    currentBuild.result = 'FAILED'
  }
  echo spectralOutput
}

这给了我一个错误

java.lang.NullPointerException: Cannot invoke method replace() on null object

因此,如果 bat 脚本有错误退出代码,它可能会引发异常,并且 SpectrumOutput 中不会存储任何内容...有没有办法始终将输出存储在 SpectrumOutput 中,而不管退出代码如何?

我应该将脚本通过管道传输到文本文件,然后读取该文本文件吗?

returnStatus 和 returnStdout 好像不能一起使用。

jenkins groovy jenkins-pipeline
1个回答
0
投票

这是众所周知的 Jenkins 特质。您必须以两种可能的方式之一修改您的脚本:

  1. 制作一个防故障脚本。
    bat
    比听起来更容易 - 在末尾添加
    exit 0
    。这样脚本总是会成功,并且您会得到 STDOUT。
  2. 如果由于某种原因您需要退出代码,您将不得不使事情变得复杂一些。将输出重定向到临时文件并将
    returnStdout
    替换为
    returnStatus
    。该步骤始终会成功,您可以检查退出代码并对其做出反应。您必须添加
    readFile
    step 才能获取脚本输出。

如果您希望该步骤显示为失败(并且您应该),则必须使用第二种方法,但删除

returnStatus
并让它失败。然后用
try/catch
catchError
step 将其包围。

© www.soinside.com 2019 - 2024. All rights reserved.