当前位置: 首页 > 面试题库 >

如果其他语句在Jenkins管道脚本中无法正常工作(groovy)

赫连晋
2023-03-14
问题内容

我有管道脚本(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

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

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

sh使用(expr) as Integer以下命令将step 的结果转换为整数:

branch_exists_in_angular = sh(script: 'git ls-remote --heads $ANGULAR_REPO $EXTRA_BRANCH | wc -l', returnStdout: true) as Integer

它会使你的变量是一个类型的Integer,然后if (0)将评估对falseif (1)将评估到true



 类似资料:
  • 问题内容: 我能够运行以下shell脚本,但无法从Jenkins管道代码运行。 尝试1。 输出: 尝试2: 尝试过sh“”“ 输出 : 美元符号后的非法字符串体字符;解决方案:要么转义文字美元符号,要么将值表达式括起来 有人能帮我吗? 问题答案: 这应该工作。 您还需要在调用下面的新subshel​​l时转义$

  • 我知道这不是一个应该在这里问的问题。请帮我解决这个问题。 我试图在下面查询中使用case语句,但是我找不到我在其中所做的错误。请你帮帮我.. 我得到的错误如下 SQL]选择tsc_accessory_details_for_repaired_and_qc_pass_phone_list.ccord(tsc_accessory_details_for_repaired_and_qc_pass_pho

  • 问题:- 在我的Jenkins脚本管道部分中有以下代码。我已经在Manage Jenkins下添加了我的私人Docker注册表URL和凭据-- Jenkins表单错误- 代码:-

  • 由于一些公司的变化,我们被迫改用詹金斯作为CI工具。虽然这似乎不是一个坏主意,但由于缺乏对非Java应用程序的支持,尤其是对管道(旧的工作流)插件的支持,以及我们对Jenkins知识的缺乏(目前还没有),我们遇到了很多麻烦。 但是出现错误: java.lang.IllegalArgumentException:预期的命名参数,但在org.jenkinsci.plugins.workflow.cps

  • 我使用Jenkins在docker容器中使用以下命令 码头工人拉詹金斯/詹金斯 docker run-p8080:8080--name=jenkins master jenkins/jenkins 获取此错误 calc.py/var/jenkins_home/workspace/pythoncalculator@tmp/耐用-b7e99e01/脚本。sh:1:/var/jenkins\u home

  • 问题内容: 这正是我想要做的 我用表格打开一个页面,该表格包含有关用户的信息 我的getText()元素指示表中的用户数(例如“列表中的11个用户”) 我删除“列表中的用户”部分,并将字符串转换为整数,以便稍后在for循环中使用 我需要通过用户名(第9列)查找某些用户,并获取数字,该数字是该用户信息所在的行数(这就是我被卡住的地方) 我转到该行的第一列(该行将成为该特定用户的编辑按钮),然后单击它