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

问题描述 投票:1回答:2

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

jenkins jenkins-pipeline
2个回答
0
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.