在多个Jenkins文件中使用相同的属性

时间:2017-12-14 13:29:15

标签: jenkins jenkins-pipeline

我的Jenkins文件中有选择属性,如下所示:

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')时,我必须更新每个 Jenkinsfile。

有多种方法可以在多个Jenkins文件之间共享这样的全局参数吗?

事实上,还有一些其他的全球价值观"在多个Jenkins文件中使用,所以我已经考虑过使用一个全局 YAML -file来存储这些值 - 所以我可以在readYAML - 块中使用node{}来填充我的变量。但我不知道是否/如何在properties() - 块中使用此yaml。

EDIT1: 我也尝试过:

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。 但是工作仍然失败 - 没有错误消息(并且没有待批准)。 那么问题是什么?

2 个答案:

答案 0 :(得分:0)

是的,您可以使用全局共享库插件,并在库中包含这些参数

答案 1 :(得分:0)

最后,它有效:

我在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解决这个问题。