将contains与Jenkins表达式和env var一起使用

将contains与Jenkins表达式和env var一起使用,jenkins,groovy,Jenkins,Groovy,我正在尝试创建一个Jenkinsfile,以处理prod与dev环境中的不同步骤。我试图使用检查JOB\u URL环境变量的来确定要遵循哪个构建服务器/构建指令 Jenkins文件的最终外观如下所示: stage('In Prod') { when { allOf { expression { params.P1 == 'x' } expression { params.P2 == 'y' } exp

我正在尝试创建一个
Jenkinsfile
,以处理prod与dev环境中的不同步骤。我试图使用检查
JOB\u URL
环境变量的来确定要遵循哪个构建服务器/构建指令

Jenkins文件的最终外观如下所示:

stage('In Prod') {
    when {
        allOf {
            expression { params.P1 == 'x' }
            expression { params.P2 == 'y' }
            expression { env.JOB_URL.contains('prod_server.com') }
        }
    }
    ...
}
stage('In Dev') {
    when {
        allOf {
            expression { params.P1 == 'x' }
            expression { params.P2 == 'y' }
            expression { env.JOB_URL.contains('dev_server.com') }
        }
    }
    ...
}
预期行为:

  • 在Dev->run
    的Dev
    步骤中
  • 在Prod->run
    的Prod
    步骤中
实际行为:

  • 在Dev->Prod中运行
    ,在Dev中运行
  • 在Prod->run
    的Prod
    步骤中
是的,我已检查以确保
dev
上的
JOB\u URL
不包含
prod\u server.com

我也试过
!env.JOB_URL.contains('dev_server.com')
作为
prod
步骤的附加表达式,结果相同

我只知道足够的
groovy
来了解Jenkins,而且我对Jenkins管道语法有点陌生,所以我可能误解了这里的行为,但从Jenkins
表达式
文档中我了解到:

从表达式返回字符串时,它们必须是 转换为布尔值或返回null以计算为false。简单地 返回“0”或“false”仍将计算为“true”


作为一个健全性检查,我确认了
groovy
文档中说。

您可以在表达式中使用正则表达式比较器来检查作业URL。试着这样做:

pipeline {

    agent none

    parameters {
        string(name: 'P1', defaultValue: 'x', description: '')
        string(name: 'P2', defaultValue: 'y', description: '')
    }

    stages {

        stage('Init') {
            steps {
                echo "params = ${params.toString()}"
                echo "env.JOB_URL = ${env.JOB_URL}"
            }
        }
        stage('In Prod') {
            when {
                allOf {
                    expression { params.P1 == 'x' }
                    expression { params.P2 == 'y' }
                    expression { JOB_URL ==~ /.*prod_server.com.*/ }
                }
            }
            steps {
                echo "Prod"
            }
        }
        stage('In Dev') {
            when {
                allOf {
                    expression { params.P1 == 'x' }
                    expression { params.P2 == 'y' }
                    expression { JOB_URL ==~ /.*dev_server.com.*/ }
                }
            }

            steps {
                echo "DEV"
            }
        }
    }
}

我们确定这有效吗?我有一个类似的例子,但我总是得到“没有这样的属性:类的JOB\uurl:WorkflowScript”