GitLab Job执行curl报unmatched brace in URL position 1错误
GitLab CI执行curl命令报unmatched brace错误排查
问题现象
执行GitLab Job时,curl上传文件步骤报错:
curl: (3) unmatched brace in URL position 1: { ^
使用的原始CI配置如下:
upload: stage: upload dependencies: - checkout - detect-mx-version - build needs: [ "checkout", "detect-mx-version", "build" ] before_script: - apk add curl - apk add jq script: - > curl -v -F "file=@/<<LOCATION_OF_PACKAGE>>.mda" -X POST -H "Username: ${PROJECTS_SVN_USER}" -H "ApiKey: ${API_KEY}" "https:<<URL_TO_BE_UPLOADED/upload?name=${BRANCH}-${REVISION}-${CI_PIPELINE_ID}.mda" { read body read code echo $code echo $body } >> out.json
转义双引号后问题仍未解决。
错误原因
- YAML多行语法使用错误:
script下用了>折叠标量,该语法会将所有换行替换为空格,原本单独写的大括号代码块会被直接拼接到curl命令的末尾,被curl识别为URL位置的参数,触发括号不匹配报错。 - Shell语法缺失:curl命令和后续大括号包裹的响应读取代码块之间没有管道符
|连接,即使YAML解析正常,shell也会把大括号识别为curl的传入参数,而非后续执行的命令组。 - Shell命令组语法不符合规范:shell中
{}作为命令组使用时,{后必须加空格,组内最后一个命令后必须加分号或换行,原写法不满足语法要求。 - URL格式错误:curl请求地址中
https:后缺少双斜杠//,正确前缀应为https://。
修正后的配置
upload: stage: upload dependencies: - checkout - detect-mx-version - build needs: [ "checkout", "detect-mx-version", "build" ] before_script: # 加--no-cache避免拉取索引时的冗余网络请求 - apk add --no-cache curl - apk add --no-cache jq script: # 换用|块标量保留shell命令的换行结构,避免命令被拼接错乱 - | curl -v -F "file=@/<<LOCATION_OF_PACKAGE>>.mda" -X POST \ -H "Username: ${PROJECTS_SVN_USER}" \ -H "ApiKey: ${API_KEY}" \ # 修正URL前缀为https:// "https://<<URL_TO_BE_UPLOADED/upload?name=${BRANCH}-${REVISION}-${CI_PIPELINE_ID}.mda" \ # 加管道符将curl输出传递给后续命令组 | { read body read code echo "$code" echo "$body" } >> out.json
额外注意
如果需要同时获取curl的HTTP状态码和完整响应体,上述用read按行读取的方式只能拿到前两行内容,更稳妥的写法是通过curl内置参数实现:
# 示例:将响应体写入out.json,同时返回HTTP状态码 curl -v -F "file=@/<<LOCATION_OF_PACKAGE>>.mda" -X POST \ -H "Username: ${PROJECTS_SVN_USER}" \ -H "ApiKey: ${API_KEY}" \ -o out.json \ -w "%{http_code}" "https://<<URL_TO_BE_UPLOADED/upload?name=${BRANCH}-${REVISION}-${CI_PIPELINE_ID}.mda"
内容的提问来源于stack exchange,提问作者Wat7
相关产品推荐
相关产品推荐

