如何通过Jenkins的httpRequest插件向AppDynamics上传多个Zip文件
没问题,我帮你把原来的curl上传逻辑转换成Jenkins流水线里用httpRequest插件实现的多文件上传方案,分步骤给你讲清楚:
1. 先把单文件上传的curl转换成httpRequest写法
首先,你的curl命令本质是一个带基本认证的PUT请求,上传单个二进制文件。对应的Jenkins流水线代码如下:
pipeline { agent any stages { stage('Upload Single dSYM to AppDynamics') { steps { script { // 处理基本认证:把账号和密钥转成Base64编码的token def appdAuthString = 'Example account:Example-License-Key-4e8ec2ae6cfe' def authToken = appdAuthString.bytes.encodeBase64().toString() httpRequest( url: 'https://api.eum-appdynamics.com/v2/account/Example+account/ios-dsym', method: 'PUT', // --upload-file 对应PUT请求 headers: [ 'Content-Type': 'application/octet-stream', 'Authorization': "Basic ${authToken}" ], file: 'UISampleApp.app.dSYM.zip', // 指定要上传的文件路径 consoleLogResponseBody: true, // 可选:在控制台打印响应内容 validResponseCodes: '200,201' // 定义可接受的成功响应码 ) } } } } }
2. 扩展到多文件上传
如果要上传多个Zip文件,最直接的方式是用循环遍历文件列表,逐个调用httpRequest上传。这里提供两种方式:
方式一:手动指定文件列表
适合你明确知道要上传哪些文件的场景:
pipeline { agent any stages { stage('Upload Multiple dSYMs') { steps { script { def appdAuthString = 'Example account:Example-License-Key-4e8ec2ae6cfe' def authToken = appdAuthString.bytes.encodeBase64().toString() // 定义要上传的所有Zip文件 def zipFiles = [ 'UISampleApp.app.dSYM.zip', 'AnotherApp.dSYM.zip', 'ThirdApp.dSYM.zip' ] // 循环上传每个文件 zipFiles.each { zipFile -> echo "开始上传文件:${zipFile}" httpRequest( url: 'https://api.eum-appdynamics.com/v2/account/Example+account/ios-dsym', method: 'PUT', headers: [ 'Content-Type': 'application/octet-stream', 'Authorization': "Basic ${authToken}" ], file: zipFile, consoleLogResponseBody: true, validResponseCodes: '200,201' ) echo "文件 ${zipFile} 上传成功!" } } } } } }
方式二:自动匹配目录下的所有Zip文件
适合你需要上传目录下所有符合特定规则的Zip文件(比如所有.app.dSYM.zip结尾的文件),更灵活:
pipeline { agent any stages { stage('Upload All dSYMs') { steps { script { def appdAuthString = 'Example account:Example-License-Key-4e8ec2ae6cfe' def authToken = appdAuthString.bytes.encodeBase64().toString() // 自动查找当前工作目录下所有符合模式的Zip文件 def zipFiles = findFiles(glob: '*.app.dSYM.zip') // 先检查是否找到文件,避免空循环 if (zipFiles.isEmpty()) { error('未找到任何需要上传的dSYM Zip文件!') } // 循环上传 zipFiles.each { zipFile -> echo "开始上传文件:${zipFile.name}" httpRequest( url: 'https://api.eum-appdynamics.com/v2/account/Example+account/ios-dsym', method: 'PUT', headers: [ 'Content-Type': 'application/octet-stream', 'Authorization': "Basic ${authToken}" ], file: zipFile.path, // 使用文件的完整路径 consoleLogResponseBody: true, validResponseCodes: '200,201' ) echo "文件 ${zipFile.name} 上传成功!" } } } } } }
3. 更安全的优化:用Jenkins凭证存储敏感信息
上面的代码里硬编码了账号和密钥,这在生产环境中不安全。建议用Jenkins的用户名密码类型凭证来存储这些敏感信息:
- 在Jenkins后台创建一个用户名密码凭证,ID设为
appd-eum-credentials,用户名填Example account,密码填你的License Key。 - 修改流水线代码,从凭证中读取信息:
pipeline { agent any // 从Jenkins凭证中加载账号和密钥 environment { APPD_CREDS = credentials('appd-eum-credentials') } stages { stage('Upload Multiple dSYMs Securely') { steps { script { // 生成认证token def authToken = "${APPD_CREDS.username}:${APPD_CREDS.password}".bytes.encodeBase64().toString() // 自动查找文件 def zipFiles = findFiles(glob: '*.app.dSYM.zip') if (zipFiles.isEmpty()) { error('未找到任何需要上传的dSYM Zip文件!') } // 注意:账号名里的空格需要URL编码,和curl里的Example+account对应 def encodedAccountName = URLEncoder.encode(APPD_CREDS.username, 'UTF-8') zipFiles.each { zipFile -> echo "开始上传文件:${zipFile.name}" httpRequest( url: "https://api.eum-appdynamics.com/v2/account/${encodedAccountName}/ios-dsym", method: 'PUT', headers: [ 'Content-Type': 'application/octet-stream', 'Authorization': "Basic ${authToken}" ], file: zipFile.path, consoleLogResponseBody: true, validResponseCodes: '200,201' ) echo "文件 ${zipFile.name} 上传成功!" } } } } } }
注意事项
- 确认AppDynamics的iOS dSYM API是否支持一次上传多个文件:根据官方文档,这个端点通常只接受单个文件上传,所以循环逐个上传是正确的做法。
- 如果你的文件路径不是在Jenkins工作目录下,需要指定完整的绝对路径。
- 可以根据需要调整
validResponseCodes,比如加上202(接受处理),具体看API的响应规范。
内容的提问来源于stack exchange,提问作者jos
相关产品推荐
相关产品推荐

