我的 自动化构建平台使用的是jenkins+ gradle + python实现的。其中,jenkins负责管理搭建构建环境,管理构建历史等,gradle负责打包android 的 apk,打包完后使用python将apk上传到服务器,然后在走接口更新版本信息等。这是整个流程,但是在传递从jenkins输入的中文版本信息到python里面更新接口的时候发现服务端记录是乱码,并且返回结果传递回gradle的时候也是乱码,头疼了几天解决。
首先,推荐一个查看乱码是啥格式的方法,我解决这些问题就是使用的这个。就是将乱码复制到一个新的文件里面,使用notepad++打开,右下角就有编码格式了。
首先查看jenkins的编码:
在 jenkins系统管理 ->系统信息:
这通过这俩个参数可以看到jenkins默认使用的编码是GBK,然后jenkins执行gradle的task的时候使用的是命令行,那命令行的编码是不是也有影响呢,保险起见还是看下吧,查看命令行编码使用:chcp 命令,如图:
936代表是 编码:GBK
也可以在命令行顶部右键->属性查看,如图:
也可以看到 936 GBK 。那么jenkins和命令行的编码格式是一样了。
然后是在gradle执行中的乱码问题:
刚开始因为字符串在gradle里使用的时候是使用命令行调用python更新接口脚本的,所以认为没有问题,结果中文发现还是乱码,复制乱码出去看了下编码,发现是gb2312格式,那么gradle就使用的别的格式的编码,但是这里我取巧了,直接使用gb2312来解析,然后传递给python,如下:
这里说个别的问题,就是如果直接使用gradle.properties里面的变量。比如说要在gradle脚本里面使用,那么,得使用
来解析中文字符串才不会有乱码,但是如果使用命令行传过来的参数的话编码和命令行的保持一致就行。
然后就是 命令行执行python脚本传递中文的编码问题了:
python我使用的2.7,默认编码是ascii 编码,直接解析坑定不行,上面我们知道命令行使用的是gbk格式,那么就使用gbk来解析传递进来的参数就好了,如图:
在执行玩操作后,要将结果返回,这个地方也会有编码问题,使用如下方式就好:
这样整个流程上的编码问题就解决了。