Jenkins流水线中Curl上传Checkmarx扫描PDF至Nexus误传文件夹问题
问题分析与修复方案
原代码存在几个关键问题,导致最终上传的是文件夹而非PDF文件:
workspace变量错误指定为单个PDF文件路径,后续cp ${workspace}*.pdf会生成无效路径,无法正确复制所有扫描生成的PDFfile变量直接赋值为文件夹路径,curl的--upload-file参数不支持上传整个文件夹,必须逐个处理单个文件
修正后的流水线代码
post { always { // Upload checkmarxs scan result to nexus repository script { // 修改为扫描结果所在的目录路径,而非单个PDF文件 def scanDir = "/var/lib/jenkins/jobs/Sec/checkmarxscan/workspace/Checkmarx/Scan/" def pdfDir = "pdf_files" sh "mkdir -p ${pdfDir}" // 复制Scan目录下所有PDF到目标文件夹 sh "cp ${scanDir}*.pdf ${pdfDir}/" def loadTXT = '' def buildNumber = env.BUILD_NUMBER def nexusUrl = 'https://nexus.com' def uploadBaseUrl = "${nexusUrl}/repository/Sec/ScanRelease-${buildNumber}/Scan" // 遍历pdfDir下的所有PDF文件,逐个上传到Nexus withCredentials([usernamePassword(credentialsId: 'nexus-login', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) { def pdfFiles = sh(script: "ls ${pdfDir}/*.pdf", returnStdout: true).trim().split('\n') pdfFiles.each { pdfFile -> // 提取文件名,用于构造Nexus上的目标文件路径 def fileName = pdfFile.split('/').last() loadTXT = sh(script: "curl -s -u ${USERNAME}:${PASSWORD} --upload-file ${pdfFile} ${uploadBaseUrl}/${fileName}", returnStdout: true) echo "已成功上传 ${fileName}" } } echo "所有PDF文件上传完成" } } }
关键修改说明
- 调整
scanDir变量指向扫描结果目录,确保cp命令能匹配到所有带时间戳的PDF文件 - 通过
ls命令获取目标文件夹内的PDF列表,使用each循环逐个处理上传 - 提取单个PDF文件名,保证Nexus仓库中的文件路径与本地文件名一致,避免上传混乱
- 增加单文件上传日志,方便后续排查上传状态
内容的提问来源于stack exchange,提问作者jaybiano
相关产品推荐
相关产品推荐

