在 Jenkins Groovy 管道中合并两个 yaml 文件



在我的 Jenkins 管道中,我有一个需要应用于多个环境的 yaml 文件,以及我想注入或合并到默认文件中并作为新文件写入的特定于环境的 yaml 文件。

我在这里看了readYaml和writeYaml: https://jenkins.io/doc/pipeline/steps/pipeline-utility-steps/但是我没有找到合并多个文件的好方法。

我想实现的目标的一个简单示例如下:

# config.yaml
config: 
num_instances: 3
instance_size: large
# dev-overrides.yaml
config:
instance_size: small
# dev-config.yaml (desired output after merging dev-overrides.yaml in config.yaml)
config
num_instances: 3
instance_size: small

readYaml的 Jenkins 实现使用 SnakeYAML 作为处理器并支持 YAML 1.1。您可以使用合并运算符来实现您的目标。但是合并运算符已在 YAML 1.2 中删除。因此,即使它目前可用,我也不建议使用此功能。

相反,我会将对象与一些 Groovy 代码合并,如下所示:

Map merge(Map... maps) {
Map result = [:]
maps.each { map ->
map.each { k, v ->
result[k] = result[k] instanceof Map ? merge(result[k], v) : v
}
}
result
}

def config = readYaml text: """
config: 
num_instances: 3
instance_size: large
"""
def configOverrides = readYaml text: """
config:
instance_size: small
"""
// Showcasing what the above code does:
println "merge(config, configOverrides): " + merge(config, configOverrides)
// => [config:[num_instances:3, instance_size:small]]
println "merge(configOverrides, config): " + merge(configOverrides, config)
// => [config:[instance_size:large, num_instances:3]]
// Write to file
writeYaml file: 'dev-config.yaml', data: merge(config, configOverrides)

灵感来自 https://stackoverflow.com/a/27476077/1549149

最新更新