Jenkins Groovy步骤中if条件不生效问题求助
问题分析与解决
核心问题
你脚本里的exists变量是在sh块的Shell环境中定义的,但Shell进程的局部变量无法被外层的Groovy脚本访问。你看到的echo "${exists}"输出False是假象——这个exists要么是Groovy上下文里之前定义的变量,要么是Jenkins对未定义变量的默认输出,和Shell里设置的exists完全无关。
当Groovy中的exists未定义时,"${exists}"会被解析为空字符串,空字符串不等于"False",所以if ("${exists}" != "False")条件始终为true,导致build步骤被执行。
修复方案
方案1:通过命令退出状态判断命名空间是否存在
利用sh步骤的returnStatus参数捕获kubectl命令的执行结果(0表示成功,非0表示失败):
stage('Remove servers') { when { expression { params.DO_REMOVE == true } } steps { script { parallel RemoveSource: { def nsExists = sh( script: """ export KUBECONFIG=${source_config} kubectl get ns ${source_namespace} """, returnStatus: true ) if (nsExists == 0) { build job: 'RemoveFCC', parameters: [ string(name: 'Branch', value: Branch), booleanParam(name: 'build_ansible', value: false), string(name: 'pipeline', value: 'yes') ] } else { echo "Server does not exist. skipped fcc run" } }, RemoveTarget: { def nsExists = sh( script: """ export KUBECONFIG=${target_config} kubectl get ns ${target_namespace} """, returnStatus: true ) if (nsExists == 0) { build job: 'RemoveFCC', parameters: [ string(name: 'Branch', value: Branch), booleanParam(name: 'build_ansible', value: false), string(name: 'pipeline', value: 'yes') ] } else { echo "Server does not exist. skipped fcc run" } } } } }
方案2:捕获命令输出做明确判断
如果需要更直观的输出判断,可以捕获kubectl命令的输出:
stage('Remove servers') { when { expression { params.DO_REMOVE == true } } steps { script { parallel RemoveSource: { def nsStatus = sh( script: """ export KUBECONFIG=${source_config} kubectl get ns ${source_namespace} --no-headers 2>/dev/null || echo "NOT_EXISTS" """, returnStdout: true ).trim() if (nsStatus != "NOT_EXISTS") { build job: 'RemoveFCC', parameters: [ string(name: 'Branch', value: Branch), booleanParam(name: 'build_ansible', value: false), string(name: 'pipeline', value: 'yes') ] } else { echo "Server does not exist. skipped fcc run" } }, RemoveTarget: { def nsStatus = sh( script: """ export KUBECONFIG=${target_config} kubectl get ns ${target_namespace} --no-headers 2>/dev/null || echo "NOT_EXISTS" """, returnStdout: true ).trim() if (nsStatus != "NOT_EXISTS") { build job: 'RemoveFCC', parameters: [ string(name: 'Branch', value: Branch), booleanParam(name: 'build_ansible', value: false), string(name: 'pipeline', value: 'yes') ] } else { echo "Server does not exist. skipped fcc run" } } } } }
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

