Jenkins中的中文显示异常问题一直是困扰用户的一道关卡,网上有很多教程,但大都是让你去设置环境变量为LANG=C.UTF-8或者LANG=en_US.UTF-8。那么这些到底能不能解决问题,这里我给大家趟了一趟浑水。
且看我为大家慢慢道来。
异常现象
工程配置文档如下
主要就是在build阶段显示下中文二字。
首先我们echo 123肯定是正常的。
在写入中文后,我们的Jenkins提示java.nio.charset.UnmappableCharacterException。这个就是字符不能正常处理的意思。
环境变量是否有效果
网上搜索得到的最多的建议是在Jenkins全局设置中增加一个环境变量LANG
但是这个并不生效。依然无法运行。
容器生产时直接带环境变量
考虑到因为是ssh链接的容器,环境变量可能要在启动容器的时候加进去,我重新修改了容器生产命令。
docker run -itd -p 49001:22 -e LANG="C.UTF-8" ubuntu_node:1.1 /usr/sbin/sshd -D
但这个依然无效
文件编码问题
查了很久的资料,在github上看到了一个issue,说的是Jenkins主机的编码要和分布式节点的编码一致,这样才能部署文件。
文中没有提供解决方法,但让我想到了要查看系统的文件编码。
我这里又通过ssh连接了个正常机器,发现在正常机器上并不会发生这个问题,说明这个是容器里面的问题。
对比两者的节点系统环境。
我发现系统属性里的最大差异就是正常机器file.encoding是UTF-8,而我的容器是一个ANSI_X3.4-1968。
这个可以通过增加jvm参数-Dfile.encoding=UTF8来解决。配置在SSH节点的 host key验证选项下方的高级内:
此时再去运行这个工程,发现可以运行成功了
总结
通过观察节点日志可以发现,这个选项是在远程链接remoting.jar文件的时候用到的。
说明系统里的语言包并不会作用在shell的链接里。这也是为什么我们这个节点没有预设的环境变量的主要原因。
Jenkins配置中去掉LANG,仍旧能够成功,说明这个问题的原因还是编码问题,和LANG是没有关系的。
(LANG的搜索为无,没有用到LANG)
关于语言包的问题,可以通过apt install language-pack-zh-hans和language-pack-en解决系统中确实没有中文语言的问题。