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

如何通过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的用户名密码类型凭证来存储这些敏感信息:

  1. 在Jenkins后台创建一个用户名密码凭证,ID设为appd-eum-credentials,用户名填Example account,密码填你的License Key。
  2. 修改流水线代码,从凭证中读取信息:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:07