YAML无效-可能是引号问题

时间:2018-08-26 23:42:58

标签: yaml gitlab-ci quoting

我从Gitlab CI / CD管道yaml invalid获取错误信息。问题是由.gitlab-ci.yml脚本的第五行引起的:

   - 'ssh deployer@gitadam.ga \'rm /var/www/html/hosts/production/current/temp__*\''

脚本部分

script:
    - 'pwd'
    - 'whoami'
    - 'ls temp__*'
    - 'ssh deployer@gitadam.ga \'rm /var/www/html/hosts/production/current/temp__*\''
    - 'if ls temp__* 1> /dev/null 2>&1; then for file in temp__*; do scp $file deployer@gitadam.ga:/var/www/html/hosts/production/current/; done; fi'

如何修线?

2 个答案:

答案 0 :(得分:3)

您只需在单引号和结尾加上引号,而无需使用蛮力将其全部删除。 这可能会导致其他错误(尽管您的情况并非如此),并且您的情况还不足以获得所需的结果。¹

真正的问题是,您尝试以错误的方式对单引号标量内的单引号进行转义。在单引号标量中可以并且需要转义的唯一字符是单引号。因此,不能像您一样使用反斜杠来完成此操作,因为这样,反斜杠也需要在单引号标量内进行转义。

要在单个带引号的标量中转义单个引号,您需要将其加倍/重复。²

YAML specification中,措词略有不同,效果相同:

  

单引号样式由周围的“'”指示符指定。因此,在单引号标量内,需要重复这样的字符。这是在单引号标量中执行转义的唯一形式。尤其可以自由使用“ \”和“””字符。

因此,要更改第5行,只需将两个反斜杠都更改为单引号即可。

script:
    - 'pwd'
    - 'whoami'
    - 'ls temp__*'
    - 'ssh deployer@gitadam.ga ''rm /var/www/html/hosts/production/current/temp__*'''
    - 'if ls temp__* 1> /dev/null 2>&1; then for file in temp__*; do scp $file deployer@gitadam.ga:/var/www/html/hosts/production/current/; done; fi'
在YAML中

double 中标有引号的标量中,您可以使用反斜杠进行转义以获取双引号,还可以输入所有特殊字符,或使用YAML功能。但是single quotes are not escapable that way。如果使用双引号,则第五行需要删除其反斜杠:

    - "ssh deployer@gitadam.ga 'rm /var/www/html/hosts/production/current/temp__*'"

保留报价有多种原因。如果您的任何标量都以特殊字符(对于YAML)开头,则需要引号。标量以字母(A-Za-z开头是不够的:如果标量恰好具有特殊的序列,例如嵌入了注释开始序列(space + octothorpe)或值指示符(冒号+ space)序列,那么您还必须使用引号。

使用单引号比不使用单引号更安全,并且在使用单引号时,您唯一需要了解的是如何将其转义。有时它们可​​能是多余的,但是它们是在YAM中定义标量字符串的最简单方法(关于需要考虑的异常数量)。


¹如果要删除前导和尾随单引号,则也需要删除第5行中的反斜杠。

²此处“ it”是指单引号,当然不是整个标量。

答案 1 :(得分:2)

您可能应该在没有引号的情况下尝试一次,然后再在此处发布。

但是是的,似乎是因为这个原因。

script:
  - pwd
  - whoami
  - ls temp__*
  - ssh deployer@gitadam.ga 'rm /var/www/html/hosts/production/current/temp__*'
  - if ls temp__* 1> /dev/null 2>&1; then for file in temp__*; do scp $file deployer@gitadam.ga:/var/www/html/hosts/production/current/; done; fi

GitLab的ci语法也具有内置的linter

enter image description here