命令行上传友盟dSYM(符号表)

2023-01-13  本文已影响0人  Accepted_

一、背景

当符号表过多时,友盟只能一个一个上传,很费时费力。找到了命令行批量上传符号表的方式。第一次使用,安装环境会比较麻烦,但也属于一劳永逸类的工作。本方法也可稍作修改后,用于Jenkins,打包上传后,自动上传符号表。

二、使用命令行上传dSYM操作步骤

注:安装以下环境和插件无需科学上网,网速快点就行。

1. 安装Python环境 (上传dSYM需要Python环境)

# 命令行输入python或python3 (任选其一)
$ python

$ python3

如果显示zsh: command not found: python 表示没有安装

没有安装python环境 如果显示如下图所示,表示安装过。(python和python3有一个通过就行) 安装过python环境

2. 安装pip命令 (安装Python插件需要pip)

2.1 去官网下载 https://pypi.org/project/pip/

pip官网
下载

2.2 下载完成后解压,命令行cd进入解压的文件夹内

# 进入文件夹
$ cd /Users/march/Downloads/pip-22.3.1
# 用python命令安装 pip
$ python3 setup.py install

3. 安装requests插件

# 控制台输入
$ pip install requests

4. 安装alibabacloud_umeng_apm20220214插件

# 控制台输入
$ pip install alibabacloud_umeng_apm20220214
# 如果显示 *** Read timed out. 就是网不好,多执行几次这个命令就好了
如果前面alibabacloud-xxx都拉下来了,但是有进度条的这个一直停在0.0,看看是不是连了VPN,请断开(如果可以再切换个网络)后再次尝试。 下载异常示例

5. 找到APP对应的access_key_idaccess_key_secretdata_source_id

图中红框处apiKeyaccess_key_idapiSecurityaccess_key_secret

6. 准备好上传符号表所需文件

6.1 准备好要上传的符号表 待上传的符号表示例

6.2 准备上传符号表所需命令文件 (共 3 个)

# 版本号
VERSION=$1
# Build号
BUILD_VERSION=$2

#上传友盟的版本号 版本号-Build号
UM_VERSION="'${VERSION}'-'${BUILD_VERSION}'"

# 上传DSYMS文件到友盟(⚠️这里根据实际dSYM个数进行增删)
upload_dsyms_to_um() {
    # 第一个是工程主Target的符号表,以app.dSYM结尾
    python3 um_upload_dsym_info.py ${UM_VERSION} "Demo.app.dSYM.zip"
    #其余为导出的其他符号表,以.dSYM结尾
    python3 um_upload_dsym_info.py ${UM_VERSION} "Masonry.framework.dSYM.zip"
    python3 um_upload_dsym_info.py ${UM_VERSION} "AFNetworking.framework.dSYM.zip"
}

# 压缩dSYM文件(⚠️这里根据实际dSYM个数进行增删)
zip_dsyms() {
    # 第一个是工程主Target的符号表,以app.dSYM结尾,注意区分
    zip -r Demo.app.dSYM.zip Demo.app.dSYM
    #其余为导出的其他符号表,以.dSYM结尾
    zip -r Masonry.framework.dSYM.zip Masonry.framework.dSYM
    zip -r AFNetworking.framework.dSYM.zip AFNetworking.framework.dSYM
}

# 压缩dsym
zip_dsyms
# 上传DSYMS文件
upload_dsyms_to_um
uploadAddress=$1
OSSAccessKeyId=$2
key=$3
policy=$4
signature=$5
callback=$6
fileName=$7

curl --location --request POST ${uploadAddress} \
--form signature=${signature} \
--form OSSAccessKeyId=${OSSAccessKeyId} \
--form policy=${policy} \
--form key=${key} \
--form callback=${callback} \
--form file=@"${fileName}"
# -*- coding: utf-8 -*-
import sys
import asyncio
import json
import os
import requests

from typing import List

from alibabacloud_umeng_apm20220214.client import Client as umeng_apm20220214Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_umeng_apm20220214 import models as umeng_apm_20220214_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient

class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client(
        access_key_id: str,
        access_key_secret: str,
    ) -> umeng_apm20220214Client:
        """
        使用AK&SK初始化账号Client
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config(
            # ⚠️您的 AccessKey ID,
            access_key_id='',
            # ⚠️您的 AccessKey Secret,
            access_key_secret=''
        )
        # 访问的域名
        config.endpoint = f'apm.openapi.umeng.com'
        return umeng_apm20220214Client(config)

    @staticmethod
    async def main_async(
        args: List[str],
    ) -> None:
        app_version = args[0]
        file_name = args[1]
        client = Sample.create_client('accessKeyId', 'accessKeySecret')
        get_sym_upload_param_request = umeng_apm_20220214_models.GetSymUploadParamRequest(
            app_version=app_version,
            data_source_id='⚠️data_source_id在这里',
            file_name=file_name,
            file_type=3
        )
        headers = {}
        try:
            response = await client.get_sym_upload_param_with_options_async(get_sym_upload_param_request, headers, util_models.RuntimeOptions())
            response_body = response.body.data
            upload_address = response_body.upload_address
            access_key_id = response_body.access_key_id
            key = response_body.key
            policy = response_body.policy
            signature = response_body.signature
            callback = response_body.callback
            os.system('./um_upload_dsym_tool.sh '+upload_address+' '+access_key_id+' '+key+' '+policy+' '+signature+' '+callback+' '+file_name)

        except Exception as error:
            # 如有需要,请打印 error
            UtilClient.assert_as_string(error.message)
            print(error)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(Sample.main_async(sys.argv[1:]))
    loop.close()
6.3 把上述三个文件放在和dSYM 同一个文件夹内 把三个文件和dSYM放在同一个目录下

7. 执行命令 上传符号表

打开控制台,执行命令

# 进入dSYMs目录下
$ cd /Users/march/Desktop/dSYMs
# 执行上传命令  传入 版本号 (例如1.0.0) 和 build号(例如1)
$ sh self_upload_dsyms.sh "1.0.0" "1"
上传成功示例

控制台输出code为200表示上传成功。可在友盟符号表列表查看。


API上传即为命令行上传的符号表
上一篇下一篇

猜你喜欢

热点阅读