jenkins在windows上中文乱码问题

需求

项目需要,我采用jenkins + python + vs2017来实现自动打包的流程,之前都是用现成的,这一次是自己实践,搭建过程就省略了,教程太多,jenkins控制台的乱码问题,倒是让我比较困扰,所以记录一下。

问题现象

jenkins中开始打包任务之后,发现在vs2017编译之后输出的日志中,中文部分都是乱码。

无效解决

  1. 在网上发现一个方式,在系统设置的语言设置中,将当前系统的编码选择为beta版Unicode编码,重启系统,启动jenkins,可以看到中文确实展示正常,但是,此时我们的代码中各种错误,是因为之前都是使用gbk编码,现在整个系统都变成了Unicode编码,所以报错,一般的大工程中,去修改代码是不现实的,所以这个方法pass
  2. 又发现一个比较古老的方式,在系统环境变量中设置JAVA_TOOL_OPTIONS路径,配置上utf-8,然后在jenkins的系统设置,在全局属性添加LANG和utf-8的键值对,这个方法也不起作用,java使用的Unicode编码,现在jenkins基本和java保持抑制了
  3. 以及还有在python中头部添加“coding=utf-8”这种方法,也不起作用。现在的python3.x之后,默认都是utf-8的编码
  4. 还看到一个方法,就是在终端里面使用chcp 65001来设置,但是我尝试发现,这个也不起作用

思考

后来我又尝试了另一种方案,我把输出的日志内容写到文件中,发现其编码是gbk,所以我将这个日志内容转换成了utf-8,但是输出的中文还是乱码。
然后结合上面第一个解决方案,发现关键就在于windows控制台输出编码和utf-8的冲突,所以还是要从系统控制台编码上入手,才应该可能解决。

最终解决

最终我发现了一个帖子,从里面找到了一下几个东西:

sys.getdefaultencoding()    #系统编码          ===>  utf-8
sys.getfilesystemencoding() #文件编码          ===>  utf-8
sys.stdin.encoding          #控制台输入流编码   ===>  gbk
sys.stdout.encoding         #控制台输出流编码   ===>  gbk
sys.stderr.encoding         #控制台错误流编码   ===>  gbk

所以现在,就知道了乱码的根源,无论我们的日志是什么编码,都将按照gbk来输出,然后jenkins这边会以utf-8来解析,所以乱码出现了,紧接着就找到了python中专门设置编码的方法,如下:

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

我的场景中需要用的就这两个,所以将这两个流的编码设置为utf-8,再次实验,完美解决乱码问题。

参考

主要感谢下面这个文章的大神

修改控制台输入输出以及错误流的编码提示

你可能感兴趣的:(jenkins)