无法在 GitLab CI YAML 中打印包含双引号的字符串

Posted

技术标签:

【中文标题】无法在 GitLab CI YAML 中打印包含双引号的字符串【英文标题】:Unable to print string containing double quotes in GitLab CI YAML 【发布时间】:2017-06-07 08:43:33 【问题描述】:

我正在使用CI Lint tester 尝试找出如何存储预期的 JSON 结果,稍后我将其与curl 响应进行比较。这些都不起作用:

尝试 1

---
  image: ruby:2.1
  script:
  - EXPECT_SERVER_OUTPUT='"message": "Hello World"'

失败:

在第 4 行第 5 列解析块映射时未找到预期的键

尝试 2

---
  image: ruby:2.1
  script:
  - EXPECT_SERVER_OUTPUT="\"message\": \"Hello World\""

失败:

jobs:script 配置应该是一个哈希

我也尝试过使用 echo 的各种组合,但没有有效的解决方案。

【问题讨论】:

【参考方案1】:

您可以使用 literal block scalar1 样式表示法并将变量定义和后续脚本行2 放在单独的行中,而不必担心引用:

myjob:
  script:
    - |
      EXPECT_SERVER_OUTPUT='"message": "Hello World"'

或者你可以转义嵌套的双引号:

myjob:
  script:
    - "EXPECT_SERVER_OUTPUT='\"message\": \"Hello World\"'"

但您也可能只想使用variables,例如:

myjob:
  variables:
    EXPECT_SERVER_OUTPUT: '"message": "Hello World"'
  script:
    - dothething.sh

1请参阅this answer 了解有关此符号和相关符号的说明

2有关多行命令的更多信息,请参阅this section of the GitLab docs

【讨论】:

您可以使用有关第一个示例(折叠的多行字符串)的信息来扩展答案,很难猜测它现在的作用。【参考方案2】:

我让它像这样工作:

  script: |
   "EXPECT_SERVER_OUTPUT='\"message\": \"Hello World\"'"
   echo $EXPECT_SERVER_OUTPUT

【讨论】:

以上是关于无法在 GitLab CI YAML 中打印包含双引号的字符串的主要内容,如果未能解决你的问题,请参考以下文章

gitlab-ci.yaml:在多行 python docker 镜像中运行 python

无法在GitLab CI docker-in-docker中对neo4j数据库运行测试

GitLab CI 的多行 YAML 字符串 (.gitlab-ci.yml)

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

如何在 GitLab YAML 文件中生成随机数

如何使用 JAVA_OPTS 在 gitlab-ci.yaml 中设置 Gradle 代理变量