【问题标题】:Merging two yaml files in a Jenkins Groovy pipeline在 Jenkins Groovy 管道中合并两个 yaml 文件
【发布时间】:2020-01-13 17:30:25
【问题描述】:

在我的 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

【问题讨论】:

标签: jenkins groovy yaml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 2018-05-05
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2017-11-11
    相关资源
    最近更新 更多