如果其他语句在Jenkins管道脚本中无法正常工作(groovy) [英] If else statement not working properly in Jenkins pipeline script (groovy)

查看:113
本文介绍了如果其他语句在Jenkins管道脚本中无法正常工作(groovy)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有管道脚本(groovy),我试图在其中使用if和else条件,但其行为异常.似乎总是返回false.

I have the pipeline script (groovy) where i m trying to use if and else condition but its not behaving normally. Seems it always returns false.

这是我的管道脚本示例(片段):

Here is my sample (snip of) pipeline script:

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.

But here it always evaluating to false even if the value is 1. Is there any issue with the syntax?

当我对上述变量进行回显时,它可以很好地打印.

when i do echo of above variables, it prints well..

                    echo "${branch_exists_in_angular}" //0
                    echo "${branch_exists_in_node}" //1
                    echo "${branch_exists_in_common}" //0

更新: 这是我最小的詹金斯管道脚本,请帮忙

UPDATE: Here is my minimal jenkins pipeline script, please help

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:

Keep in mind that sh(returnStdout: true, script: ...) returns String so variables like branch_exists_in_angular are strings and not numbers. In Groovy (including Jenkins Groovy CPS environment) following expressions always evaluate to true:

if ('0') {
    echo "0 is 0"
}

if ('1') {
    echo "1 is 1"
}

使用(expr) as Integersh步骤的结果转换为整数:

Cast the result of sh step to an integer using (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.

It will make your variables to be a type of Integer and then if (0) will evaluate to false and if (1) will evaluate to true.

这篇关于如果其他语句在Jenkins管道脚本中无法正常工作(groovy)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆