groovy :: составная инструкция if, не принимающая значение true

#groovy

#groovy

Вопрос:

привет, я пытаюсь понять проблему, при которой given if (version_exists != '' amp;amp; env.force_build == true) оценивается как true, даже если env.force_build имеет значение false

 pipeline {
    agent { label 'master' }
    parameters {
        string(defaultValue: 'DEV', description: '', name: 'ENV', trim: true)  
        string(defaultValue: 'sys', description: '', name: 'platform_type', trim: true)
        string(defaultValue: 'yyy', description: '', name: 'dev_app_host', trim: true)
        string(defaultValue: 'xxx.dv.local', description: '', name: 'dev_xbar_host', trim: true)
        string(defaultValue: '1.0.0.23', description: '', name: 'VERSION', trim: true)
        booleanParam(defaultValue: false, description: 'force build if possible', name: 'force_build')
    }
    environment {
        git_credential_id = '1234'
        app_name = 'application'
        app_module_name = 'dvmt_event_processor'
        app_git_url = 'ssh://git@oooo:7999/data/application.git'
        dna_common_git_url = 'ssh://git@oooo:7999/data/dna-common.git'
        ansible_git_url = 'ssh://git@oooo:7999/data/operations-ansible.git'
        pip_port = '9700'
    }
    
    stages {
        stage('checkout from SCM') {
            .....
        }
        stage('build') {
                steps {
                    script {
                        // version_exists == dvmt_event_processor-1.0.0.23-py2.py3-none-any.whl
                        // force_build == false

                        def version_exists = ''
                        version_exists = sh(script: "ssh -o StrictHostKeyChecking=no ansible@pypi server ls /var/pypi/packages/dev/ | grep ${env.app_module_name}  | grep ${env.VERSION}" , returnStdout: true)


                        if (version_exists != '' amp;amp; env.force_build == true) {
                                ......
                                // evaluating to true no matter what
                            }
                        }
                        else if (version_exists != '' amp;amp; env.force_build == false ) {
                            echo "version already exists, just deploying"
                            ......


                        }
                        else {
                                echo "starting full build"
                                .........
                        }
                    }
                }
            }
        stage('Test') {
            steps {
                echo 'Testing...'
                .............
            }
        }
    }
}
  

консоль Дженкинса o / p

 dvmt_event_processor-1.0.0.23-py2.py3-none-any.whl

[Pipeline] echo
false
[Pipeline] echo
starting full build
  

Ответ №1:

env.force_build выводится как логическое значение, но это строка.

 "false" == true
// → false
"false" == false
// → false
  

Всегда отлаживайте подобные проблемы с помощью соответствующих инструментов. Используйте .inspect()
или даже .dump() для получения информации, какие данные у вас есть под рукой:

 "false".inspect()
// → 'false'
"false".dump()
// → <java.lang.String@5cb1923 value=[102, 97, 108, 115, 101] coder=0 hash=97196323>
  

Обратите внимание на кавычки вокруг false .inspect() примера.

Чтобы преобразовать строку в логическое значение с помощью groovy, вы можете использовать String.toBoolean() :

 "false".toBoolean() == true
// → false
"false".toBoolean() == false
// → true