我试图创建一个Jenkinsfile
来处理产品与开发环境中的不同步骤。我试图使用anyOf
pattern with an 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') }
}
}
...
}
预期行为:
In Dev
步骤In Prod
步骤实际行为:
In Prod
和In Dev
步骤In Prod
步骤是的,我已经检查以确保JOB_URL
上的dev
不包含prod_server.com
。
我还尝试使用!env.JOB_URL.contains('dev_server.com')
作为prod
步骤的附加表达式,结果相同。
我只了解groovy
才能通过Jenkins,并且对Jenkins管道语法有些陌生,所以也许我对这里的行为有误解,但据我对Jenkins expression
文档的了解:
从表达式返回字符串时,它们必须是 转换为布尔值或返回null以求值为false。只是 返回“ 0”或“ false”仍将评估为“ true”。
作为健全性检查,我确认groovy
文档中说contains
should be returning a boolean
。
答案 0 :(得分:0)
您可以在表达式中使用正则表达式比较器来检查JOB_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"
}
}
}
}