带Basic认证的自定义Gradle下载任务在Jenkins中执行失败
问题:Jenkins流水线中Gradle调用REST API返回401未授权错误
我们在Jenkins流水线中通过Gradle脚本调用REST API并将响应保存为JSON文件。本地用Insomnia测试API能得到200响应,但Jenkins执行时返回401错误,无法访问目标URL。
Jenkins流水线代码
node('windows_node') { def gitlabTokenList = CredentialsProvider.lookupCredentials(GitLabApiTokenImpl.class) def creds = gitlabTokenList.findResult { it.id == "API_TOKEN" ? it : null } def gitlabToken = creds.apiToken def concatGitlabToken = ':'+creds.apiToken def encoded_token = concatGitlabToken.bytes.encodeBase64().toString() println "encoded_token: "+encoded_token try { stage('Prepare Workspace') { cleanWs() checkout scm bat label: 'update Json', script: "gradlew.bat updateLibJson -PgitAccessToken=${encoded_token} --stacktrace" } } }
build.gradle配置
buildscript { repositories { maven { url 'http://XXXX.XX.XX/repositories/gradle-plugins-release/' } maven { url 'http://XXXX.XX.XX/repository/gradle-plugins/' } } dependencies { classpath 'de.undercouch:gradle-download-task:4.1.2' } } apply plugin: 'de.undercouch.download' task updateLibJson(type: Download) { group "Prepare" src 'https://XXX/_apis/git/repositories?api-version=7.0' dest 'lib_repos.json' header 'Authorization: Basic ', gitAccessToken println "after updateLibJsonn" }
解决建议
修正Base64编码格式:Jenkins中生成的Base64字符串可能包含换行符,导致认证失效。修改编码逻辑去除换行:
def encoded_token = concatGitlabToken.bytes.encodeBase64().toString().replaceAll(/[\r\n]/, "")调整Header拼接方式:Gradle Download任务的
header参数分开传递字符串可能出现拼接问题,改为直接传递完整的认证头:header "Authorization: Basic ${gitAccessToken}"核对凭证一致性:临时在Jenkins中打印完整的
gitAccessToken值(调试完成后删除),和Insomnia中使用的编码后token对比,确认传递过程中没有被截断或修改。排查节点网络问题:确认Jenkins的windows_node节点能正常访问目标API地址,没有代理、防火墙或网络策略拦截请求,导致凭证无法正确送达服务器。
尝试Bearer认证(针对Azure DevOps API):目标API属于Azure DevOps,除Basic认证外,也支持PAT的Bearer认证,无需Base64编码:
- Jenkins中直接传递原始PAT:
def gitlabToken = creds.apiToken // 无需拼接冒号和Base64编码,直接传递token bat label: 'update Json', script: "gradlew.bat updateLibJson -PgitAccessToken=${gitlabToken} --stacktrace" - 修改Gradle任务的header:
header "Authorization: Bearer ${gitAccessToken}"
- Jenkins中直接传递原始PAT:
内容的提问来源于stack exchange,提问作者RCB
相关产品推荐
相关产品推荐

