Jenkins Console 页中文显示乱码的问题

发布时间 2023-08-13 18:46:02作者: Professor哥

背景:

Jenkins Server 为Helm安装,使用的是 Bitnami 的 chart,当前app版本为 Jenkins 2.401.2

添加一台 Agent,该 Agent 的语言默认为 zh_CN.UTF-8

Pipeline 使用 docker 的形式运行每个任务。

表现形式:

  1. 在 Jenkins 管理页面添加并配置 Agent ,使用SSH方式连接Agent,在连接日志界面有中文字符,无法正常显示。

  2. 在 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

问题排查:

  1. 怀疑为Agent运行环境的LANG环境变量设置错误导致,当在 Jenkins 系统配置里面添加环境变量 LANG=zh_CN.UTF-8 没有效果

  2. 在 Jenkins 系统管理 --> 系统配置 --> 全局属性 --> 环境变量 中新增 LANG=zh_CN.UTF-8 后,也没有效果。

  3. 怀疑是 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 文件,发现预留了 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

中文已经正常显示。