Jenkins Console 页中文显示乱码的问题
背景:
Jenkins Server 为Helm安装,使用的是 Bitnami 的 chart,当前app版本为 Jenkins 2.401.2
添加一台 Agent,该 Agent 的语言默认为 zh_CN.UTF-8
Pipeline 使用 docker 的形式运行每个任务。
表现形式:
-
在 Jenkins 管理页面添加并配置 Agent ,使用SSH方式连接Agent,在连接日志界面有中文字符,无法正常显示。
-
在 pipeline 中有任务输出包含中文字符的时候,会在 Console 界面返回乱码字符。
stage("prepare"){
steps {
sh "export LANG=zh_CN.UTF-8"
echo "INFO: 查找需要编译发布的模块列表 ...."
echo "INFO: GIT_COMMIT:${GIT_COMMIT} GIT_PREVIOUS_COMMIT:${GIT_PREVIOUS_COMMIT} GIT_PREVIOUS_SUCCESSFUL_COMMIT:${GIT_PREVIOUS_SUCCESSFUL_COMMIT}"
sh "env"
}
}
另外:在Console界面查看 env
环境变量中显示 LANG=C.UTF-8
节点的语言配置如下:
JOB_BASE_NAME=main
PATH=/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
BUILD_ID=28
BUILD_TAG=jenkins-finance-main-28
JENKINS_URL=http://192.168.22.211:7083/
LANG=C.UTF-8
GIT_URL=https://x.x.x.x/youku/finance.git
问题排查:
-
怀疑为Agent运行环境的LANG环境变量设置错误导致,当在 Jenkins 系统配置里面添加环境变量
LANG=zh_CN.UTF-8
没有效果。 -
在 Jenkins 系统管理 --> 系统配置 --> 全局属性 --> 环境变量 中新增
LANG=zh_CN.UTF-8
后,也没有效果。 -
怀疑是 Jenkins Server 端的运行时环境设置错误。
查看 系统管理 --> 环境信息 变量的值发现问题:
file.encoding ANSI_X3.4-1968
配置正确的 JVM 参数
1. 排查 Pod 的环境变量配置:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/instance: jenkins
app.kubernetes.io/name: jenkins
topologyKey: kubernetes.io/hostname
weight: 1
containers:
- env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: BITNAMI_DEBUG
value: "false"
- name: JENKINS_USERNAME
value: admin
- name: JENKINS_PASSWORD
valueFrom:
secretKeyRef:
key: jenkins-password
name: jenkins
- name: JENKINS_HOME
value: /bitnami/jenkins/home
- name: JENKINS_SKIP_BOOTSTRAP
value: "no"
- name: JENKINS_HOST
- name: JENKINS_EXTERNAL_HTTP_PORT_NUMBER
value: "80"
- name: JENKINS_EXTERNAL_HTTPS_PORT_NUMBER
value: "443"
- name: JENKINS_PLUGINS_LATEST
value: "true"
- name: JENKINS_PLUGINS_LATEST_SPECIFIED
value: "false"
- name: JENKINS_SKIP_IMAGE_PLUGINS
value: "false"
- name: JENKINS_OVERRIDE_PLUGINS
value: "false"
image: docker.io/bitnami/jenkins:2.401.2-debian-11-r6
imagePullPolicy: IfNotPresent
发现并没有通过环境变量的方式传入 JVM 参数 file.encoding
。
2. 排查 Helm 的 values.yaml 文件
发现Bitnami预留了 javaOpts: []
配置参数,默认值留空。
## @param jenkinsHome Jenkins home directory
##
jenkinsHome: /bitnami/jenkins/home
## @param javaOpts Custom JVM parameters
##
javaOpts: []
## @param disableInitialization Skip performing the initial bootstrapping for Jenkins
##
disableInitialization: "no"
## @param command Override default container command (useful when using custom images)
3. 配置 javaOpts 参数
## @param javaOpts Custom JVM parameters
##
## javaOpts: []
javaOpts:
- -Dfile.encoding=UTF-8
4. 重新安装 Jenkins Chart
>_ helm upgrade -n jenkins jenkins -f values.yaml bitnami/jenkins:12.2.5
验证问题
安装升级 Helm Chart 后,查看 系统管理 --> 环境信息 变量的值
值,已经变为 UTF8
。
重连 agent 节点,观察日志:
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS, mixed mode, sharing)
[08/13/23 10:35:27] [SSH] Checking java version of /builds/jdk/bin/java
Couldn't figure out the Java version of /builds/jdk/bin/java
bash:行1: /builds/jdk/bin/java: 没有那个文件或目录
[08/13/23 10:35:27] [SSH] Checking java version of java
[08/13/23 10:35:28] [SSH] java -version returned 11.0.19.
[08/13/23 10:35:28] [SSH] Starting sftp client.
[08/13/23 10:35:28] [SSH] Copying latest remoting.jar...
Source agent hash is 25B899E9C1FD1001F55EF1A8DB224323. Installed agent hash is 25B899E9C1FD1001F55EF1A8DB224323
Verified agent jar. No update is necessary.
Expanded the channel window size to 4MB
[08/13/23 10:35:28] [SSH] Starting agent process: cd "/builds" && java -jar remoting.jar -workDir /builds -jar-cache /builds/remoting/jarCache
8月 13, 2023 6:35:28 下午 org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
信息: Using /builds/remoting as a remoting work directory
8月 13, 2023 6:35:28 下午 org.jenkinsci.remoting.engine.WorkDirManager setupLogging
信息: Both error and output logs will be printed to /builds/remoting
<===[JENKINS REMOTING CAPACITY]===>channel started
Remoting version: 3107.v665000b_51092
Launcher: SSHLauncher
其中中文字符已经正常显示。
运行流水线任务,查看输出日志的中文是否正常:
Running 29 on http://192.168.22.211:7083/
[Pipeline] echo
Running 29 on http://192.168.22.211:7083/
[Pipeline] echo
INFO: 查找需要编译发布的模块列表 ....
[Pipeline] echo
INFO: GIT_COMMIT:3fe9568191bb5a6544d43b9d352f14df04f21d7c GIT_PREVIOUS_COMMIT:3fe9568191bb5a6544d43b9d352f14df04f21d7c GIT_PREVIOUS_SUCCESSFUL_COMMIT:04ca72711d1a95d08f63e11c0cf2c7bfa9c82097
[Pipeline] sh
+ env
JENKINS_HOME=/bitnami/jenkins/home
GIT_PREVIOUS_SUCCESSFUL_COMMIT=04ca72711d1a95d08f63e11c0cf2c7bfa9c82097
中文已经正常显示。
总结
网上大多此类问题,都归类为Agent端的 LANG 语言环境变量问题设置错误导致,其实也有可能是 Jenkins Server 接收流水线任务日志上报,没有正确解析为 UTF-8 字符导致的。
此次问题的根因出现在 Jenkins Server 的运行时环境,没有正确设置Java运行环境字符编码为 UTF-8 。