Jenkinsfile可以很好地打印参数



我们有一个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}"
}

最新更新