首页 > 解决方案 > 将 contains 与 Jenkins 表达式和 env var 一起使用

问题描述

我正在尝试创建一个Jenkinsfile来处理产品与开发环境中的不同步骤。我试图将anyOf模式与expression检查JOB_URL环境变量以确定要遵循的构建服务器/构建指令一起使用。

Jenkinsfile 最终看起来像下面这样:

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') }
        }
    }
    ...
}

预期行为:

实际行为:

JOB_URL是的,我已检查以确保dev不包含prod_server.com.

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

我只知道groovy通过 Jenkins,并且对 Jenkins 管道语法有点陌生,所以也许我误解了这里的行为,但根据我从 Jenkinsexpression文档中了解到的情况:

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

作为健全性检查,我确认groovy文档说contains应该返回一个boolean.

标签: jenkinsgroovy

解决方案


您可以在表达式中使用正则表达式比较器来检查以下环境变量之一:

  • 内置:JENKINS_URLBUILD_URL源内置 var
  • 插件提供JOB_URL(存在但找不到源)

注意:环境变量通过保留的环境变量映射env使用 env 变量)公开,例如server_url = env.JENKINS_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.JENKINS_URL = ${env.JENKINS_URL}"
            }
        }
        stage('In Prod') {
            when {
                allOf {
                    expression { params.P1 == 'x' }
                    expression { params.P2 == 'y' }
                    expression { env.JENKINS_URL ==~ /.*prod_server.com.*/ }
                }
            }
            steps {
                echo "Prod"
            }
        }
        stage('In Dev') {
            when {
                allOf {
                    expression { params.P1 == 'x' }
                    expression { params.P2 == 'y' }
                    expression { env.JENKINS_URL ==~ /.*dev_server.com.*/ }
                }
            }

            steps {
                echo "DEV"
            }
        }
    }
}

推荐阅读