我们有一个Jenkinsfile,其参数声明如下:
def params = [string(name: 'ENVIRONMENT', value: environment),
string(name: 'VERSION', value: version),
string(name: 'REGION', value: region)]
我想呼应这些,例如
DEPLOYING: ENVIRONMENT=STAGING, VERSION=1.3.0, REGION=EU
但是调用echo "$params"
打印:
[@string(name=ENVIRONMENT,value=STAGING), @string(name=VERSION,value=1.3.0), @string(name=REGION,value=EU)]
我尝试迭代数组-例如:
params.each { echo it }
抛出UnsupportedOperationException: no known implementation of class java.lang.String is using symbol ‘string’
params.each { echo it.name }
抛出RejectedAccessException: No such field found: field org.jenkinsci.plugins.structs.describable.UninstantiatedDescribable name
如何才能很好地打印params
数组?
编辑-来自Matt Schuchard的回应:
def params = [string(name: 'ENVIRONMENT', value: "STAGING"),
string(name: 'VERSION', value: "1.3.0"),
string(name: 'REGION', value: "EU")]
print "$params"
params.each() { param, value ->
print "Parameter: ${param}, Value: ${value}"
}
返回(即值全部为空(:
[@string(name=ENVIRONMENT,value=STAGING), @string(name=VERSION,value=1.3.0), @string(name=REGION,value=EU)]
Parameter: @string(name=ENVIRONMENT,value=STAGING), Value: null
Parameter: @string(name=VERSION,value=1.3.0), Value: null
Parameter: @string(name=REGION,value=EU), Value: null
您可以使用Groovy映射迭代器lambda方法(如each
(对params
映射进行迭代。示例如下:
params.each() { param, value ->
print "Parameter: ${param}, Value: ${value}"
}
如果您决定直接在pipeline
块中使用它,那么在使用声明性DSL时,需要将它放置在script
块中。
有必须是更好的方法,但以下方法有效
迭代参数数组:
1. Cast each parameter to a regular String
2. Extracted the value between @string( VALUE )
3. Split the key/value pairs first by comma ','
4. Then split each side of the above by equals '='
5. Concatenate the second argument
def pretty(params) { def s = "" params.each { param -> def a = ("${param}" =~ /^@string((.+))$/)[ 0 ][ 1 ] def b = a.split(",") s = s + b[0].split("=")[1] + "=" + b[1].split("=")[1] + "n" } return s }
返回:
ENVIRONMENT=STAGING
VERSION=1.3.0
REGION=EU
params
的目标是参数化构建吗
如果是这种情况,您可以使用parameters
指令
parameters
指令提供了用户应在触发管道时提供
这些的值用户指定的参数可通过params
对象。
递减管道:
声明性管道支持开箱即用的参数,允许在运行时通过parameters指令。
parameters {
string(name: 'ENVIRONMENT', defaultValue: 'STAGING', description: 'Environment to test. e.g: production/develop'),
string(name: 'VERSION', defaultValue: '1.3.0', description: 'Version to run'),
string(name: 'REGION', defaultValue: 'EU', description: 'Region')
}
脚本管道:
使用脚本化管道配置参数是完成属性步骤,可以在Snippet中找到发电机
properties([
parameters([
string(name: 'ENVIRONMENT', defaultValue: 'STAGING', description: 'Environment to test. e.g: production/develop'),
string(name: 'VERSION', defaultValue: '1.3.0', description: 'Version to run'),
string(name: 'REGION', defaultValue: 'EU', description: 'Region')
])
])
现在,这些参数可以作为params
变量
的成员访问,因此,您可以简单地使用:
params.each() { param, value ->
print "Parameter: ${param}, Value: ${value}"
}