GitLab流水线执行脚本报错:非法URL与语法错误求助
错误原因分析及修复方案
1. curl报错:(3) URL using bad/illegal format or missing URL
- 问题出在第一条
repo_id赋值语句的jq语法错误:.id被写在了jq的引号外面,正确写法应该将.id包含在jq的过滤表达式内。原代码中'.[] | select(.path | test($regex))'.id的写法会导致jq执行失败,repo_id无法获取到有效的仓库ID(可能为空或错误字符串),后续curl用这个无效值拼接URL时,就会出现URL格式非法的问题。
2. 脚本第13行语法错误:Syntax error: "fi" unexpected (expecting "then")
- 这是第一条命令语法错误引发的连锁反应:由于jq命令写法错误,整个
$(curl ... | jq ...)的命令替换没有正确闭合,shell解析脚本时会破坏if [[ ... ]]的结构,误以为if的条件部分未完成,因此将fi识别为不符合语法的意外关键字。
修复后的脚本
#!/usr/bin/env bash tag=1.66.0-test image=vm/search-quote-service private_token=glpat-pwd project=2134 echo $project # 修复jq表达式,将.id移至引号内的过滤逻辑中,同时改用-r参数输出纯文本结果 repo_id=$(curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories" | jq -r --arg regex ".*\\$image$" '.[] | select(.path | test($regex)).id') echo $repo_id if [[ $(curl --header "PRIVATE-TOKEN: $private_token" "https://gitlab.com/api/v4/projects/$project/registry/repositories/$repo_id/tags/$tag" | jq -r '.name') == "$tag" ]]; then echo "$tag exists" else echo "$tag does not exist" fi
补充说明:将jq -c改为jq -r可以让输出的repo_id是纯数值(不带引号),避免后续URL拼接时引入多余引号导致的问题。
内容的提问来源于stack exchange,提问作者gcpdev-guy
相关产品推荐
相关产品推荐

