You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带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编码:

    1. Jenkins中直接传递原始PAT:
      def gitlabToken = creds.apiToken
      // 无需拼接冒号和Base64编码,直接传递token
      bat label: 'update Json', script: "gradlew.bat  updateLibJson -PgitAccessToken=${gitlabToken} --stacktrace"
      
    2. 修改Gradle任务的header:
      header "Authorization: Bearer ${gitAccessToken}"
      

内容的提问来源于stack exchange,提问作者RCB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:12:47