YAML中使用cat EOF写入XML时流水线执行单行报错如何解决?
问题根源
你遇到的报错是YAML块标量语法选择错误导致的:你使用的>是YAML的折叠块标量符,会自动把块内所有换行符替换为空格,最终将整个脚本拼接为单行。而bash的here document(<<EOF)语法要求结束标记EOF必须单独占一行,因此会出现解析错误。
直接修复方案
把>替换为YAML的字面量块标量符|,它会完整保留块内所有换行符,完全符合here document的语法要求。
修改后的script段示例:
script: - | cat > settings.xml << EOF <?xml version="1.0" encoding="UTF-8"?> <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <servers> <server> <username>$USERNAME</username> <password>$PASSWORD</password> <id>central</id> </server> </servers> </settings> EOF
其他更稳妥的XML生成方案
如果担心here document出现缩进、特殊字符解析异常,可以选用以下两种方案:
- 用
printf命令格式化输出,不依赖here document的换行规则:
printf '<?xml version="1.0" encoding="UTF-8"?> <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <servers> <server> <username>%s</username> <password>%s</password> <id>central</id> </server> </servers> </settings>' "$USERNAME" "$PASSWORD" > settings.xml
- 提前将settings.xml模板提交到代码仓库,流水线运行时用
sed替换占位符即可:
# 模板文件中对应位置预先写入{{USERNAME}}、{{PASSWORD}}占位符 sed -i "s/{{USERNAME}}/$USERNAME/g; s/{{PASSWORD}}/$PASSWORD/g" settings-template.xml mv settings-template.xml settings.xml
注意事项
如果你的账号密码包含$、反引号、\这类shell特殊字符,建议在注入变量前先对特殊字符做转义处理,避免bash解析异常。
内容的提问来源于stack exchange,提问作者placplacboom
相关产品推荐
相关产品推荐

