python打包Android项目+上传服务器+通知测试
作为一名Android开发工程师,免不了要打apk给公司的测试人员进行测试。iOS那边每次打包完就上传,并且在企业微信发送消息到群里通知测试人员,感觉挺方便的。之前也浅学了一下python,于是花了两天撸了一个。下面分享下这个流程。
打包apk—》上传到内测分发平台(需要注册第三方平台)—》企业微信通知测试(需要服务端提供部分配置信息)
目标:自动完成以下操作
需要掌握知识点
- 编译打包apk命令
- 使用python请求接口
命令行编译打包apk
打包指令:.\gradlew :android:assembleDebug
# Android编译打包apk
def packApk():
os.chdir(AppConstVal.APP_PROJECT_PATH)
iRet = subprocess.call('.\gradlew ' + AppConstVal.APP_GRADLE_BUILD_TYPE + ' --stacktrace', shell=True) # 编译
print("打包完成", iRet)
AppConstVal是自定义的常量类,这里拼接字符主要是为了以后容易拓展,执行脚本的时候可以用过传入不同参数来决定打debug包还是打release包
上传到服务器
关键代码:
requests.post(url=BetaqrConstVal.baseUrl, params=params, headers=headers)
requests.post(uploadIconUrl, files=iconFile, data=iconParams)
# 上传apk ,分两步:1、获取apk上传url 2、上传apk到获取到的url中
def uploadApk():
uploadUrl = _getUploadAppUrl()
uploadApkAndShow(uploadUrl)
# 获取上传应用url
def _getUploadAppUrl():
# 获取上传的目标服务器
params = {"type": "android", "bundle_id": BetaqrConstVal.appBundleId, "api_token": BetaqrConstVal.apiToken}
uploadTokenResponse = requests.post(url=BetaqrConstVal.baseUrl, params=params, headers=headers)
jsonData = json.loads(uploadTokenResponse.text)
print("getUploadAppUrl()--->", jsonData)
return jsonData
def uploadApkAndShow(jsonData):
# 获取上传的目标服务器
uploadIconUrl = jsonData["cert"]["icon"]["upload_url"]
iconKey = jsonData["cert"]["icon"]["key"]
iconToken = jsonData["cert"]["icon"]["token"]
uploadApkUrl = jsonData["cert"]["binary"]["upload_url"]
key = jsonData["cert"]["binary"]["key"]
token = jsonData["cert"]["binary"]["token"]
iconPath = AppConstVal.APP_ICON_PATH
iconFile = {'file': open(iconPath, "rb")}
iconParams = {
"key": iconKey,
"token": iconToken,
}
uploadIconResult = requests.post(uploadIconUrl, files=iconFile, data=iconParams)
print("icon上传结果:", uploadIconResult.text)
print("=============apk正在上传,清耐心等待==============")
# 上传安装包
apkFile = {'file': open(AppConstVal.APP_APK_PATH, "rb")}
params = {
'key': key,
'token': token,
'file': AppConstVal.APP_APK_PATH,
'x:name': appData['name'],
'x:version': appData['versionShort'],
'x:build': appData['build'],
'x:changelog': appData['changelog'],
'file0': ('comeinbeta', open(AppConstVal.APP_APK_PATH, 'rb')),
}
e = MultipartEncoder(
fields={
'key': key,
'token': token,
'x:name': appData['name'],
'x:version': appData['versionShort'],
'x:build': appData['build'],
'x:changelog': appData['changelog'],
'file': (
'comein-beta-internal-debug.apk', open(AppConstVal.APP_APK_PATH, 'rb'), 'application/octet-stream'),
}
)
m = MultipartEncoderMonitor(e, my_callback)
uploadResult = requests.post(uploadApkUrl, data=m, headers={'Content-Type': m.content_type})
print("\napk上传结果:", uploadResult.text)
return
def my_callback(monitor):
progress = (monitor.bytes_read / monitor.len) * 100
print("\r 文件上传进度:%d%%(%d/%d)" % (progress, monitor.bytes_read, monitor.len), end=" ")
通知测试
这个就很简单了,根据企业微信的api,调用即可
# 发送企业微信通知同事
def notifyPerson(msg):
contact_list = {
"张三": "1878251xxxx",
}
# 企业微信通知的同事
mentioned_mobile_list = contact_list.values()
body = {
"msgtype": "text",
"text": {
"content": msg,
"mentioned_mobile_list": list(mentioned_mobile_list),
}
}
notifyResponseData = requests.post(NotifyConstVal.wx_send_url, json=body, headers=headers)
print("发送企业微信消息:", msg)
print("发送企业微信消息结果:", notifyResponseData.text)
return
Github
代码已经上传到github了,欢迎交流
https://github.com/KubyWong/assembleApkUpload