首页 > 解决方案 > yaml 在命令中包含 json

问题描述

我正在尝试在 yaml 中添加带有 json 的命令(gitlab ci 部署)

  script:
    - gradle buildZip
    - aws s3 cp build/distributions/converter-1.0.zip s3://xxx/converter/fan-converter-${CI_BUILD_REF}.zip
    - aws s3 put-object-tagging --bucket xxx --key converter/fan-converter-{$CI_BUILD_REF}.zip --tagging '{"TagSet": [{ "Key": "tmp", "Value": "1" }]}'

似乎 yaml 不太喜欢这部分--tagging '{"TagSet": [{ "Key": "tmp", "Value": "1" }]}'

标签: jsonyaml

解决方案


这是因为你有一个:in 后跟空格。这是映射键的 YAML 语法。环境'不会保护您,因为它位于 YAML 标量内,因此会被解析为内容。

修复它的最佳方法是使用块标量,其中 YAML 根本不解析特殊字符:

script:
  - gradle buildZip
  - >-
    aws s3 cp build/distributions/converter-1.0.zip
    s3://xxx/converter/fan-converter-${CI_BUILD_REF}.zip
  - >-
    aws s3 put-object-tagging
    --bucket xxx
    --key converter/fan-converter-{$CI_BUILD_REF}.zip
    --tagging '{"TagSet": [{ "Key": "tmp", "Value": "1" }]}'

>开始一个折叠的块标量,以下-阻止添加最后的换行符。所有行都通过空格字符连接。注意不要缩进超过第一行;这将在更缩进的行周围创建一个换行符。

标量一直持续到遇到父缩进级别的内容。我将先前的值设为另一个块标量来证明这一点。

您也可以将所有内容写在一行中,但这似乎更具可读性。


推荐阅读