带Token的Curl API调用Mac正常,Linux(Jenkins)下报404求助
问题
在MacBook上通过带Token认证的Curl调用SonarQube API可正常执行,但在Linux(Jenkins)环境下返回404错误。已尝试两种URL构造方式,均在Mac上生效但Linux下失败。
相关脚本
#!/bin/bash # set -v -e -o pipefail sonar_api() { #WORKS ON MAC but fails on LINUX # sq_url='https://sonar-sw.company.com/api/' # url="${sq_url}qualitygates/project_status?projectKey=aiinfra-pba&pullRequest=${GERRIT_CHANGE_NUMBER}-${GERRIT_PATCHSET_NUMBER}" sq_url='https://sonar-sw.company.com/api/qualitygates/project_status' url=$sq_url curl -vvv -u "${TOKEN}": \ -G $url \ --data-urlencode projectKey="pba" \ --data-urlencode pullRequest="${GERRIT_CHANGE_NUMBER}-${GERRIT_PATCHSET_NUMBER}" } sonar_api
Jenkins日志片段
{ [5 bytes data] * Mark bundle as not supporting multiuse < HTTP/1.1 404 < Server: nginx/1.12.2 < Date: Fri, 24 Mar 2023 19:05:15 GMT < Content-Type: application/json < Content-Length: 102 < Connection: keep-alive < { [102 bytes data] 100 102 100 102 0 0 126 0 --:--:-- --:--:-- --:--:-- 126 100 102 100 102 0 0 126 0 --:--:-- --:--:-- --:--:-- 126 * Connection #0 to host sonar-sw.company.com left intact [Pipeline] echo {"errors":[{"msg" [Pipeline] }
修复方案与排查思路
核心问题
Linux环境下的curl命令处理未加引号的URL变量时,若后续参数拼接出现特殊字符,或Jenkins环境变量未正确解析,会导致URL被拆分,请求路径错误触发404。
代码修复
给URL变量添加双引号,避免变量解析时的拆分问题,修正后的脚本如下:
#!/bin/bash # set -v -e -o pipefail sonar_api() { sq_url='https://sonar-sw.company.com/api/qualitygates/project_status' curl -vvv -u "${TOKEN}": \ -G "$sq_url" \ --data-urlencode "projectKey=pba" \ --data-urlencode "pullRequest=${GERRIT_CHANGE_NUMBER}-${GERRIT_PATCHSET_NUMBER}" } sonar_api
额外排查步骤
- 验证Jenkins环境变量:在任务中添加
echo "GERRIT_CHANGE_NUMBER=$GERRIT_CHANGE_NUMBER, GERRIT_PATCHSET_NUMBER=$GERRIT_PATCHSET_NUMBER",确认变量值是否正确传递 - 打印最终请求URL:在curl命令前添加
echo "Final URL: $sq_url?projectKey=pba&pullRequest=${GERRIT_CHANGE_NUMBER}-${GERRIT_PATCHSET_NUMBER}",对比Mac和Linux环境下的URL是否一致 - 检查Linux环境curl版本:执行
curl --version确认版本,不同版本的-G参数处理可能存在差异,必要时更新curl
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

