【问题标题】:How to escape a colon in .gitlab-ci.yml?如何在 .gitlab-ci.yml 中转义冒号?
【发布时间】:2021-06-22 14:12:28
【问题描述】:

我有这样一行:

sed -i 's/"host: TND_HOST"/"host: process.env.TND_HOST"/g' services/management/tnd.js

上面的选项会导致 linting 错误:

This GitLab CI configuration is invalid: (<unknown>): mapping values are not allowed in this context at line [...]

其他不起作用的选项是:

sed -i 's/host: TND_HOST/host: process.env.TND_HOST/g' services/management/tnd.js

sed -i "s/host: TND_HOST/host: process.env.TND_HOST/g" services/management/tnd.js

有什么办法可以克服这个问题并保持单线?

【问题讨论】:

    标签: yaml gitlab-ci


    【解决方案1】:

    由于您使用这两种类型的引号,因此将您的命令放在 yaml 模板中可能是最简单的。这样你就不需要逃避任何事情:

    stages:
      - lint
    
    .sed_template: &sed_template |
     sed -i 's/"host: TND_HOST"/"host: process.env.TND_HOST"/g' services/management/tnd.js
    
    some_job:
      image: someImage:latest
      stage: lint
      except:
        - master
      cache:
        key: ${CI_COMMIT_REF_SLUG}
        paths:
          - frontend/node_modules/
      script:
        - echo "firstLine"
        - *sed_template
        - echo "lastLine"
    

    它不再是一个单一的班轮,但我想它是最干净的选项,因为它使命令本身具有相当的可读性。 另一种选择是使用 folding style 将其缩小一点:

    stages:
      - lint
    
    some_job:
      image: someImage:latest
      stage: lint
      except:
        - master
      cache:
        key: ${CI_COMMIT_REF_SLUG}
        paths:
          - frontend/node_modules/
      script:
        - echo "firstLine"
        - >
            sed -i 's/"host: TND_HOST"/"host: process.env.TND_HOST"/g' services/management/tnd.js
        - echo "lastLine" 
    

    【讨论】:

    • 第二个选项看起来更清晰一些,我使用了它。非常感谢!
    【解决方案2】:

    您不必正式转义冒号。而是将您的命令参数与用单引号包裹的冒号放在变量中。您可以按照以下示例在参数字符串中使用其他变量。

    然后eval 带有如下变量的“字符串化”命令(示例是curl 触发外部部署,但应该适用于每个命令):

    deploy_job:
      variables:
        DEPLOY_CURL_COMMAND: 'curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $DO_APP_PLATFORM_API_TOKEN" https://api.digitalocean.com/v2/apps/$DO_APP_PLATFORM_STAGE_FRONT_APP_ID/deployments'
      script:
        - echo "Stage Deploy to DigitalOcean App Platform"
        - echo $DEPLOY_CURL_COMMAND
        - 'eval "$DEPLOY_CURL_COMMAND"'
    

    脚本中的所有引号、破折号和空格都非常精确。 YAML 非常无情。使用 GitLab 管道linter 检查语法。

    如果您使用项目/存储库级别variables,请不要忘记在设置变量并在未受保护的分支(这是分支默认状态)中使用它时取消选中protected 复选框(默认选中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多