我从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'
如何修线?
答案 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