使用“:”的脚本命令导致 .gitlab-ci.yml 执行错误

Posted

技术标签:

【中文标题】使用“:”的脚本命令导致 .gitlab-ci.yml 执行错误【英文标题】:Script command using ":" causing error in .gitlab-ci.yml execution 【发布时间】:2020-07-06 02:03:29 【问题描述】:

在我的.gitlab-ci.yml 文件下方:

image: docker:latest

services:
    - docker:dind

stages:
    - deploy_dev_env

Deploy DEV Environment:

    stage: deploy_dev_env

    script:

        - curl -v -H "Content-Type: multipart/form-data" -X PUT -F uploadInput=@schema/schema.xml -F overwrite=true -F xmlaEnabledFlag=true -F parameters="DataSource=outputDS" -F parameters="EnableXmla=true" -u $PENTAHO_DEPLOY_USER:$PENTAHO_DEPLOY_PASSWORD http://$PENTAHO_HOST/pentaho/plugin/data-access/api/datasource/analysis/catalog/sca

这个非常简单的脚本会导致错误,因为 "Content-Type: multipart/form-data" 片段中的冒号 (:)。

在脚本中运行 CI Lint 我得到以下信息:

Status: syntax is incorrect

jobs:deploy dev environment:script config should be a string or an array containing strings and arrays of strings

如果我将 "Content-Type: multipart/form-data" 替换为 "Content-Type multipart/form-data"(删除“:”),我的 .gitlab-ci.yml 文件的语法是正确的。

这是一个错误还是我应该以不同的方式重新编写我的 curl 命令?

【问题讨论】:

【参考方案1】:

Docs 警告 yaml 脚本中的特殊字符:

注意:有时,脚本命令需要用单引号或双引号括起来。例如,包含冒号 (:) 的命令需要用引号括起来,以便 YAML 解析器知道将整个内容解释为字符串而不是“键:值”对。使用特殊字符时要小心::、、、[、]、,、&、*、#、?、|、-、、=、!、%、@、`。

其中一个选项是使用yaml block scalar

Deploy DEV Environment:
    stage: deploy_dev_env
    script: >
        curl -v -H "Content-Type: multipart/form-data" -X PUT -F uploadInput=@schema/schema.xml -F overwrite=true -F xmlaEnabledFlag=true -F parameters="DataSource=outputDS" -F parameters="EnableXmla=true" -u $PENTAHO_DEPLOY_USER:$PENTAHO_DEPLOY_PASSWORD http://$PENTAHO_HOST/pentaho/plugin/data-access/api/datasource/analysis/catalog/sca

或使用其他方式escape colon in yaml。

【讨论】:

根据您对文档的回答和链接,我使用单引号来包装命令。它就像一个魅力。【参考方案2】:

由于之前的 yaml 语法,我遇到了这个问题,我找到的解决方法是

将“Content-Type: application/json”作为环境变量存储在 CICD 设置中 例如

Key: HEADER
Value: Content-Type: application/json

在你的脚本中

- curl -v -H "$HEADER" -X PUT -F uploadInput=@schema/schema.xml -F overwrite=true -F xmlaEnabledFlag=true -F parameters="DataSource=outputDS" -F parameters="EnableXmla=true" -u $PENTAHO_DEPLOY_USER:$PENTAHO_DEPLOY_PASSWORD http://$PENTAHO_HOST/pentaho/plugin/data-access/api/datasource/analysis/catalog/sca

【讨论】:

这是一个选项。谢谢。

以上是关于使用“:”的脚本命令导致 .gitlab-ci.yml 执行错误的主要内容,如果未能解决你的问题,请参考以下文章

jenkins执行shell脚本 命令被解析成两行了 导致自行不成功

linux脚本运行后把脚本删了会怎么办

管道到头部导致从 python 调用的 shell 脚本中的管道损坏

Python导入Julia导致冻结脚本的其他部分

56/14 shell脚本 后台启动 程序1 + “tail -f log“, ctrl +c 导致程序1中断

56/14 shell脚本 后台启动 程序1 + “tail -f log“, ctrl +c 导致程序1中断