Python实现优雅打包

大家在开发过程中,是否也有这样的场景,测试同学跑过来说,给我打个包吧;可能这时你正在“写bug”,好嘛,为了团队,停下来,stash本地修改,Studio打个包,整个过程6分钟左右,然后继续编码;过一会儿老板又来了。。。

本文就分享如何用Python打包来拯救你的时间。

说下思路

  • 首先用Python封装gradle打包脚本,配置server环境参数(兼容windows)
  • 打包前同步git远程仓库代码
  • 打包后上传蒲公英
  • 上传后获取apk相关信息,发送通知邮件

ps: 其实可以使用Jenkins集成环境来搞定上述所有需求。之前我们也用过Jenkins,整体都不错,唯一劣势是,当出现因为开发环境导致打包失败时,需要去打包服务器处理;但与其带来的效率来比,这些是值得的。本文介绍的Python打包就没更新打包环境的困扰,但不支持离线打包。

最终效果

邮件内容截图

邮件内容主要有几个:

  • build版本号 ,方便下载时选择正确版本
  • api环境
  • App发布详情页及下载二维码
  • 最近20条git提交日志(在发版前夕,测试团队尤其关心这个

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# python入口函数
if __name__ == '__main__':
print (sys.argv)
# 同步远程仓库代码
updateGitRepo()
# 执行打包
exeGradleCmd()
# 上传蒲公英并发送邮件
uploadPgyer()
# 看看git同步函数
def updateGitRepo():
print('update git repo start')
# 当前目录时rn仓库
ret = exeShellCmd('git pull')
hasError = 'error' in ret
# 如果更新失败,就抛异常(类似Java的throw),停止任务
if(hasError):
raise ValueError('git pull failed')
# 进入Android项目同步
ret = exeShellCmd('cd android && git pull')
hasError = 'error' in ret
if(hasError):
raise ValueError('git pull failed')
print('update git repo end')
return
# 执行shell命令并返回执行结果
def exeShellCmd(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
cmdRetBytes = popen.stdout.read()
cmdRetStr = str(cmdRetBytes, encoding='utf-8')
print(cmdRetStr)
return cmdRetStr

以上只贴了主函数和git同步函数代码实现,如果想了解代码细节及剩下的打包、上传和发送邮件等功能实现,请点击这里获取。

如何打包(终端执行以下命令)

1
2
3
4
5
6
7
8
# 默认打qa环境的包
$ python3 releaseApk.py
# 打线上环境的包
$ python3 releaseApk.py online
# 指定不发送邮件
$ python3 releaseApk.py noemail

打包命令提示(5.26更新)

1
2
3
4
5
6
7
$ python3 releaseApk.py -h
Usage:
releaseApk.py -m <message> -e <env>
-m, --message <message> 打包日志信息
-e, --env <env> 打包环境:[qa,online], 不传默认为qa。
noemail 不发邮件,默认要发送。

小结

作为一名安卓开发人员,打包是工作内容之一,尤其在测试阶段,频率还很高。为了节约时间和提高效率,就想着能否使用Python来打包,于是就尝试着实现了该想法,才有了这篇文章。由于我对Python不是很熟悉,可能实现还有不少问题,如果您有好的建议,请告诉我;有如何问题都可联系我,与君共勉~

参考、推荐

0%