jenkins集群使用k8s部署,pipeline中文乱码的问题解决记录

一、问题定位

我们使用的是Jenkinsfile,存放在git中,而不是分散在各个项目中,好处是便于管理和维护。
见下图:


image.png

image.png

在jenkinsfile文件中写入中文,还有在获取构建人姓名的时候,出现中文乱码问题。

二、场景描述

先读取当前构建人的姓名(一般为中文汉字),然后调用后端Http接口发送消息通知响应的人群。

  • 获取构建人的信息
  • 调用http接口

1、获取构建人信息

需要安装jenkins 插件:build user vars plugin
具体的groovy语言写法见下:

String buildUser = ""

stage('Get UserInfo') {
            steps {
                wrap([$class: 'BuildUser']) {
                    script {
                        def BUILD_USER = "${env.BUILD_USER}"
                        def BUILD_USER_ID = "${env.BUILD_USER_ID}"

                        buildUser = BUILD_USER + "(" + BUILD_USER_ID + ")"
                    }
                }
            }
        }

http.imNotfiy(buildUser,...,...)

这里的变量buildUser如果包含中文,会出现乱码问题。。。
这里容易有个误区,以为在Jenkins全局配置里设置了字符集为utf-8就能解决该问题。


image.png

image.png

image.png

其实上述的设置是针对master节点,而非slave节点。而我们的pipeline是运行于slave节点上。我们得在节点设置中,对pod template增加环境变量才是正确的方式。


image.png
image.png
image.png
image.png
image.png
image.png

2、调用http接口

# 注意contentType必须为APPLICATION_JSON_UTF8,否则还会出现中文字符乱码的问题
def request(reqType, reqUrl, reqBody, reqFile = '', contentType = "APPLICATION_JSON_UTF8") {
    def response = httpRequest httpMode: reqType,
            contentType: contentType,
            consoleLogResponseBody: true,
            ignoreSslErrors: true,
            uploadFile: reqFile,
            requestBody: reqBody,
            url: "${reqUrl}",
            timeout: 600

    return response
}

三、总结

解决乱码需要做好两步:

1、pipeline在从节点上的中文乱码,依赖于环境变量设置为utf-8。

2、groovy语言的http调用中的contentType必须由 APPLICATION_JSON 修改为APPLICATION_JSON_UTF8。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容