Jenkins Pipeline执行远程脚本报line 1: html: No such file or directory求助
排查解决思路
根因定位
从报错日志/home/jenkins/xxx/script.sh: line 1: html: No such file or directory可以直接判断:你调用Artifactory API的curl请求实际返回的不是纯文本版本号,而是HTML格式的内容(比如404页面、登录验证页、重定向页),后续代码把返回的HTML内容直接传入shell命令执行时,<html>标签被shell解析为输入重定向符,系统尝试读取名为html的文件所以报错。
你说手动执行curl正常,大概率是手动执行的环境和Jenkins agent运行环境存在差异。
具体排查步骤
- 第一步:打印API返回的原始内容确认异常
修改jenkinsUtils.groovy里的latestVersionOf方法,增加调试日志打印原始返回值,同时给curl加重定向跟踪、状态码输出参数:
运行Pipeline查看打印的返回内容,确认是不是返回了HTML页面。String latestVersionOf(group, artifact, version, repo) { script { def curlCmd = "curl -sL -w '\nHTTP_STATUS:%{http_code}' -u 'restapi:restapi' '${ARTIFACTORY_URL}/api/search/latestVersion?g=${group}&a=${artifact}&v=${version}&repos=${repo}'" def rawResp = sh ( returnStdout: true, script: curlCmd ).trim() println "Artifactory API原始返回值:\n${rawResp}" // 拆分状态码和返回内容 def respLines = rawResp.split('\n') def statusLine = respLines.last() if (statusLine != 'HTTP_STATUS:200') { error "Artifactory API请求失败,状态码:${statusLine},返回内容:${rawResp}" } return respLines[0..-2].join('\n').trim() } } - 第二步:核对Jenkins运行环境与手动执行环境的差异
- 确认Jenkins agent节点的网络是否可以正常访问Artifactory域名,有没有代理配置、防火墙限制、IP白名单限制
- 确认
restapi账号的密码最近是否有修改,权限是否被回收,是否有权限访问指定的MAVEN_CANDIDATES_REPO仓库 - 核对4个月内Artifactory是否有版本升级、API配置变更:部分版本的Artifactory搜索API要求指定请求头
Accept: text/plain才会返回纯文本版本号,否则默认返回HTML格式的搜索结果页,你可以在curl命令里加-H 'Accept: text/plain'参数验证
- 第三步:修复返回值处理逻辑
无论API返回是否正常,都建议对返回的版本号做特殊字符过滤,避免后续shell执行出现解析异常:
如果后续要把cspVersion = utilsScript.latestVersionOf('com.xyz.ria.parent', 'xyz-ria-parent', "${params.CSP_VERSION}_*", MAVEN_CANDIDATES_REPO).trim().replaceAll(/[<>&'"]/, '')cspVersion传入shell命令,记得给变量加双引号,避免shell解析特殊字符:sh "echo \"${cspVersion}\""
内容的提问来源于stack exchange,提问作者Nirmalya
相关产品推荐
相关产品推荐

