我在Jenkinsfile中有这样的选择属性,如下所示:
properties(
[parameters([
choice(choices: ["app1", "app2"].join("\n"),
description: 'global parameter',
name: 'globalParam'),
choice(choices: ["foo", "bar", "baz"].join("\n"),
description: 'job-specific parameter',
name: 'localParam')
])
]
)
这有效,但我有多个作业(=多个Jenkisnfiles)都使用相同的globalParam
数组,所以当我想添加另一个选择(例如'app3'
)时,我必须更新每个Jenkins文件。
有没有办法在多个Jenkins文件之间共享这样的全局参数?
事实上,在多个Jenkins文件中也有一些其他“全局值”,所以我已经考虑过使用一个全局YAML文件来存储这些值 - 所以我可以在readYAML
-block中使用node{}
来填充我的变量。但我不知道是否/如何在我的properties()
-block中使用这个yaml。
编辑1:我也尝试过:
import org.yaml.snakeyaml.Yaml
def myyaml = new Yaml().load(new FileReader('../../properties.yml'))
properties( ... )
但是我得到了
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new org.yaml.snakeyaml.Yaml
Edit2:根据@herm的建议,我尝试使用库插件:
import groovy.json.JsonSlurperClassic;
def propsText = libraryResource 'my/lib/properties.json'
def jsonSlurper = new JsonSlurperClassic()
def properties = jsonSlurper.parseText(propsText)
def jobEnv = 'release'
properties(
[parameters([
choice(choices: properties.params.modules.keySet().join("\n"),
description: properties.props.module.description[jobEnv],
name: 'globalParam'),
choice(choices: ["foo", "bar", "baz"].join("\n"),
description: 'job-specific parameter',
name: 'localParam')
])
]
)
我可以在Jenkins UI中看到正确的选择参数! Based on this question,我批准了JsonSlurperClassic。但是工作仍然失败 - 没有错误消息(并且没有待批准)。所以有什么问题?
是的,您可以使用全局共享库插件,并在库中包含这些参数
最后,它有效:
我在vars
文件夹中添加了一个库:
// vars/jsonParse.groovy
import groovy.json.JsonSlurperClassic;
@NonCPS
def call(def json) {
return new groovy.json.JsonSlurperClassic().parseText(json)
}
我的json文件位于resources/some/project/properties.json
而我的詹金斯文件:
def propsText = libraryResource 'some/project/properties.json'
def properties = jsonParse(propsText)
def jobEnv = 'release'
properties(
[parameters([
choice(choices: properties.params.modules.keySet().join("\n"),
description: properties.props.module.description[jobEnv],
name: 'globalParam'),
choice(choices: ["foo", "bar", "baz"].join("\n"),
description: 'job-specific parameter',
name: 'localParam')
])
]
)
编辑:
可悲的是,我无法为Declarative Pipeline
解决这个问题。