You need to enable JavaScript to run this app. YAML中使用cat EOF写入XML时流水线执行单行报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 01:06:08