Jenkins Pipeline Script - 评估 batch/powershell 的标准输出



我想在 jenkins 管道脚本中评估 powershell/bat 调用。 Powershell 脚本文件使用 bat 脚本(在管道脚本中定义(调用。

我可以将ps/bat脚本的返回标准输出到变量中,现在我在正确评估它时遇到了问题。

这是脚本:

pipeline {
agent any
stages {
stage('Checkout') {
steps {
// Powershell Skript auschecken
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: 'someUser', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: 'someid', depthOption: 'infinity', ignoreExternalsOption: true, local: 'localPath', remote: '${CopySkript}']], quietOperation: true, workspaceUpdater: [$class: 'CheckoutUpdater']])              
}
}

stage('CopyPitchDBFrontend') {
steps {
script {

def myBat = new StringBuilder()
myBat.append("%SystemRoot%\\syswow64\\WindowsPowerShell\\v1.0\\powershell.exe -File %WORKSPACE%\\myScript.ps1 -dbTargetPath \\123.123.123.123\myfile.file -dbSvnPath http://myserver.com/repo/trunk/myfile.file")

def result = bat(
returnStdout    : true,
script: "${myBat.toString()}"
)

echo result.trim()
if (result.trim() == "0")
{
echo 'Myresult: Success'
currentBuild.result = 'SUCCESS'
}
else if (result.trim() == "-1"){
echo 'My result: Failure -1'
currentBuild.result = 'FAILURE'
}
else{
echo 'My result: Failure unknown'
currentBuild.result = 'FAILURE'
}
}
}           
}
}
}

下面是成功脚本调用的控制台输出。 我的意思是脚本返回 0(见第二行(。

some text
0
[Pipeline] echo
My result: Failure unknown
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: FAILURE

执行跳转到 if 的 else 分支,我不明白。(result.trim() == "0"),不是吗? 我也试过(result.trim() == 0)但结果是一样的。

结果值是怎么回事?

也许有更好的方法可以做到这一点?

如果您尝试计算命令的退出代码,那么最简单的方法是利用bat方法的returnStatus参数。这将以整数类型的形式返回命令的状态值。然后,您可以按如下方式调整代码:

Integer result = bat( // fine tune type specification
returnStatus: true,
script:       "${myBat.toString()}"
)
if (result == 0) { // integer comparison now
echo 'My result: Success'
currentBuild.result = 'SUCCESS'
}
else if (result == -1){ // integer comparison now
echo 'My result: Failure -1'
currentBuild.result = 'FAILURE'
}
else {
echo 'My result: Failure unknown'
currentBuild.result = 'FAILURE'
}

这将更容易,并按预期为您工作。请注意 bat 方法的相关文档。

由于returnStdout: true您的"某些文本"实际上是返回的内容的一部分,显然它不是"0",因此是 else 分支。您可能希望将returnStdout替换为returnStatus

最新更新