Jenkins Groovy - readyaml 和 writeyaml 删除 yaml 文件中的双引号

时间:2021-06-02 12:13:49

标签: jenkins groovy jenkins-pipeline jenkins-groovy snakeyaml

我有一个名为 original.yml 的 yaml 文件,其内容如下:

version: '2'
services:
  vendor-app:
    image: vendor/vendor-app@sha256:f9db328fe5eed87f89cc0390a91c65eb92351fedda8a0c833b30c9147bd7ba07
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "2"
    volumes:
    - /my_vol
    labels:
      io.rancher.container.pull_image: always
      com.vendor-app.builder.version: "3bc55d00c"
      com.vendor-app.built: "Mon, 01 Jan 2021 19:32:24 -0000"

  myservice:
    image: myregistry/myservice
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "2"
    volumes:
    - /my_vol2
    labels:
      io.rancher.container.pull_image: always

我有另一个 yaml 文件,我将它称为 vendor.yml,我会定期从供应商那里获得,内容如下:

version: '2'
services:
  vendor-app:
    image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "20"
    volumes:
    - /my_vol
    labels:
      com.vendor-app.builder.version: "7766jjc"
      com.vendor-app.built: "Fri, 14 Dec 2018 20:50:35 -0000"

我想将 image 中的 original.yml 中的 image 替换为 vendor.yml 中的 labels,并将 vendor.yml 中的 labels 与现有的 {{ original.yml 中的 1}}。基本上最终结果应该如下:

services:
  vendor-app:
    image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "2"
    volumes:
    - /my_vol
    labels:
      io.rancher.container.pull_image: always
      com.vendor-app.builder.version: "7766jjc"
      com.vendor-app.built: "Fri, 14 Dec 2018 20:50:35 -0000"

  myservice:
    image: myregistry/myservice
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "2"
    volumes:
    - /my_vol2
    labels:
      io.rancher.container.pull_image: always

通过这样做,我几乎达到了我的目标:

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 latest_yml = readYaml file:"vendor.yml"
def current_yml = readYaml file:"original.yml"
def new_yml = readYaml file:"original.yml"

current_yml.services['vendor-app'].image = latest_yml.services['vendor'].image
current_yml.services['vendor-app'].labels =  latest_yml.services['vendor-app'].labels
writeYaml file:"beforemerge.yml", data: current_yml

println "merge(new_yml, current_yml): " + merge(new_yml, current_yml)
writeYaml file:"aftermerge.yml", data: merge(new_yml, current_yml)

几乎,因为这就是我在aftermerge.yml中得到的:

services:
  vendor-app:
    image: vendor/vendor-app@sha256:ba065e9a04478fc17fd5b61b8c558616b7e9acba105668ef786f084545c32778
    logging:
      driver: json-file
      options:
        max-size: 50m
        max-file: '2'
    volumes:
    - /my_vol
    labels:
      io.rancher.container.pull_image: always
      com.vendor-app.builder.version: 7766jjc
      com.vendor-app.built: Fri, 14 Dec 2018 20:50:35 -0000
  myservice:
    image: myregistry/myservice
    logging:
      driver: json-file
      options:
        max-size: 50m
        max-file: '2'
    volumes:
    - /my_vol2
    labels:
      io.rancher.container.pull_image: always

正如你所看到的,它有点弄乱了格式...... com.vendor-app.builtcom.vendor-app.builder.version 的双引号已经消失了,这显然会在我使用更新的 yaml 文件时造成严重破坏(此处的示例是 docker-compose.yml 的修订版本)。 max-sizemax-file 周围的引号也更改为仅用于 max-file 的单引号 ??奇怪...

为什么要这样做,我如何使逻辑保留引用? 有没有更好的方法来做到这一点?我真正想要做的就是从 imagelabels 中获取值,并使用它们来更新 vendor.yml 中的相同值(在 {{1 }},附加到 original.yml 中的当前值以及更新)。

任何帮助将不胜感激,谢谢。

0 个答案:

没有答案