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

Jenkins-Groovy操作Jfrog Artifactory下载构件时MD5校验异常求助

解决Jenkins Groovy脚本下载Jfrog构件时MD5校验不匹配的问题

我来帮你梳理下这个MD5校验失败的问题,这通常是文件传输或处理环节出现了异常,咱们一步步排查:

你的上传&下载代码

stage("Upload Artifact to Jfrog"){ 
    def server = Artifactory.server 'JfrogTAArtifactory' 
    def uploadSpec = """{ 
        "files": [ 
            { 
                "pattern": "${env.WORKSPACE}\\${artifactsfoldername}\\API-${env.BUILD_NUMBER}.zip", 
                "target": "internal-repo/folderName/subFolder/", 
                "props": "type=zip;status=ready" 
            } 
        ] 
    }""" 
    def buildInfo = server.upload(uploadSpec) 
    server.publishBuildInfo(buildInfo) 
} 

stage("Download Artifacts"){ 
    def server = Artifactory.server 'JfrogTAArtifactory' 
    File folder = new File(downloadArtifactsPath) 
    FileUtils.cleanDirectory(folder) 
    def downloadSpec = """{ 
        "files": [ 
            { 
                "pattern": "internal-repo/folderName/subFolder/API-${env.BUILD_NUMBER}.zip", 
                "target": "${downloadArtifactsPath}/", 
                "explode":"true", 
                "flat": "true" 
            } 
        ] 
    }""" 
    def buildInfo = server.download(downloadSpec) 
    server.publishBuildInfo(buildInfo) 
}

遇到的异常

java.io.IOException: Calculated MD5 checksum is different from original, 
Original: '09bb61772231822ebd37a2751c818f60' 
Calculated: '7e32b3f7e8149fbc8013fd7992f345e5' 
at org.jfrog.build.extractor.clientConfiguration.util.DependenciesDownloaderHelper.validateMd5Checksum(DependenciesDownloaderHelper.java:439)

可能的解决方案

1. 排查explode参数的影响

你在下载配置里设置了"explode":"true",这个参数会让Artifactory自动解压下载的zip包。但MD5校验是针对原始zip包的,解压过程中如果有文件权限变更、换行符转换(Windows和Linux的换行差异)等情况,可能会导致校验时的计算值和原始值不匹配。

建议先把explode改成false,先完整下载zip包,再用Groovy手动解压,比如:

// 下载zip包(不自动解压)
def downloadSpec = """{ 
    "files": [ 
        { 
            "pattern": "internal-repo/folderName/subFolder/API-${env.BUILD_NUMBER}.zip", 
            "target": "${downloadArtifactsPath}/", 
            "flat": "true" 
        } 
    ] 
}"""
// 手动解压zip包
def zipFile = new File("${downloadArtifactsPath}/API-${env.BUILD_NUMBER}.zip")
def destDir = new File(downloadArtifactsPath)
ant.unzip(src: zipFile, dest: destDir)

2. 确认路径和文件完整性

  • 打印downloadArtifactsPath的实际值,确认路径没有空格或特殊字符(Windows路径容易出现转义问题):
    stage("Download Artifacts"){ 
        println "Download path: ${downloadArtifactsPath}"
        // 其余代码...
    }
    
  • 登录Jfrog Artifactory界面,找到上传的API-${env.BUILD_NUMBER}.zip,查看它的MD5值是否和异常信息中的Original值一致。如果不一致,说明上传环节就出了问题,可能是本地zip包被修改,或者上传路径错误传错了文件。

3. 临时跳过校验(仅用于排查)

如果想先确认文件能否正常下载,可以在downloadSpec中添加"checksumPolicy": "ignore"跳过校验,但这只是临时方案,建议找到根本原因后再恢复校验:

{
  "files": [
    {
      "pattern": "internal-repo/folderName/subFolder/API-${env.BUILD_NUMBER}.zip",
      "target": "${downloadArtifactsPath}/",
      "explode":"true",
      "flat": "true",
      "checksumPolicy": "ignore"
    }
  ]
}

4. 检查目录清理操作的影响

你用FileUtils.cleanDirectory(folder)清理了目标目录,可能导致目录权限变化,使得下载的文件写入时被篡改。可以暂时注释掉这行代码,测试下载是否正常;如果正常,再检查目录的读写权限是否足够。

内容的提问来源于stack exchange,提问作者Gowtham.K.Reddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:41