我有管道脚本(groovy),我尝试在其中使用if和else条件,但其行为异常。似乎总是返回false。
这是我的管道脚本示例(片段):
def branch_exists_in_node = 1 def branch_exists_in_common = 0 def branch_exists_in_extra = 0 if(branch_exists_in_node == 1) { NODE_BRANCH = env.BRANCH_NAME }else { NODE_BRANCH = "master"; } if(branch_exists_in_common == 1) { COMMON_BRANCH = env.BRANCH_NAME }else { COMMON_BRANCH = "master" }
但是,即使值是1,在这里它总是求值为false。语法是否存在问题?
当我做上述变量的回声时,它打印得很好。
echo "${branch_exists_in_angular}" //0 echo "${branch_exists_in_node}" //1 echo "${branch_exists_in_common}" //0
更新:这是我最小的詹金斯管道脚本,请帮忙
def EXTRA_BRANCH def ANGULAR_BRANCH def NODE_BRANCH def COMMON_BRANCH def branch_exists_in_angular def branch_exists_in_node def branch_exists_in_common def branch_exists_in_extra pipeline { agent { label 'nimbus-cloud' } options { gitLabConnection('gitlab') timeout(time:1, unit: 'HOURS') } environment { WORK_DIR = "${WORKSPACE}/${BUILD_NUMBER}" EXTRA_REPO = "git@gitlab.example.com:tools/extra.git" COMMON_REPO = "git@gitlab.example.com:tools/common.git" ANGULAR_REPO = "git@gitlab.example.com:tools/angular.git" NODE_REPO = "git@gitlab.example.com:tools/node.git" EXTRA_BRANCH = "${env.BRANCH_NAME}" } stages { stage('PREDEPLOYMENT: Cleanup and Setting up the VM. '){ steps { running("${JOB_NAME}") echo "Deleting previous images. " sh 'docker rmi -f $(docker images -a -q) | echo "Not able to delete some images"' dir("$WORKSPACE"){ sh 'rm -rf *' } // setting up echo "BRANCH NAME IS ${env.BRANCH_NAME}" script { EXTRA_BRANCH = env.BRANCH_NAME // this will be different across all the repos // Check if above branch is already there on every repo -- for angular try { sshagent(['my-git-ssh']){ branch_exists_in_angular = sh(script: 'git ls-remote --heads $ANGULAR_REPO $EXTRA_BRANCH | wc -l', returnStdout: true) echo "${branch_exists_in_angular}" branch_exists_in_node = sh(script: 'git ls-remote --heads $NODE_REPO $EXTRA_BRANCH | wc -l', returnStdout: true) echo "${branch_exists_in_node}" branch_exists_in_common = sh(script: 'git ls-remote --heads $COMMON_REPO $EXTRA_BRANCH | wc -l', returnStdout: true) echo "${branch_exists_in_common}" } } catch(Exception e){ echo "WARN: something unexpected occured. " echo "${e}" } // below lines prints as expected echo "${branch_exists_in_angular}" // 0 echo "${branch_exists_in_node}" // 1 echo "${branch_exists_in_common}" //0 if(branch_exists_in_angular) { ANGULAR_BRANCH = env.BRANCH_NAME }else { ANGULAR_BRANCH = "master"; } if(branch_exists_in_node) { NODE_BRANCH = env.BRANCH_NAME }else { NODE_BRANCH = "master"; } if(branch_exists_in_common) { COMMON_BRANCH = env.BRANCH_NAME }else { COMMON_BRANCH = "master" } } echo ANGULAR_BRANCH // prints master = expected echo NODE_BRANCH // prints master but expected is checkout branch name feature-test echo COMMON_BRANCH // prints master expected } post { success { echo "Success: VM Cleaned up for testing. " } failure { echo "Error: Some error occured while cleaning up the system. " failure("${JOB_NAME}") } } } } }
请记住,sh(returnStdout: true, script: ...)返回的String变量branch_exists_in_angular是字符串而不是数字。在Groovy(包括Jenkins Groovy CPS环境)中,以下表达式始终求值为true:
sh(returnStdout: true, script: ...)
String
branch_exists_in_angular
true
if ('0') { echo "0 is 0" } if ('1') { echo "1 is 1" }
sh使用(expr) as Integer以下命令将step 的结果转换为整数:
sh
(expr) as Integer
branch_exists_in_angular = sh(script: 'git ls-remote --heads $ANGULAR_REPO $EXTRA_BRANCH | wc -l', returnStdout: true) as Integer
它会使你的变量是一个类型的Integer,然后if (0)将评估对false和if (1)将评估到true。
Integer
if (0)
false
if (1)