svnhook处理中文乱码

背景

通过 jenkins + svn 做 CI,每次开发 commit 代码后,自动触发svn hook post-commit ,执行 curl 来调用 jenkins pipeline,curl 传递传递 svnlog 参数,svnlog 为对应需求的编号和摘要,摘要含有中文。

在jenkins pipeline 中对 由 svnhook 传递来的 svnlog 输出,中文显示乱码:
file

post-commit 脚本内容如下:

AUTHOR=`svnlook author /data/repository/view/`
LOG_MESG=`svnlook log /data/repository/view/`
LM=`echo ${LOG_MESG} |sed 's/ /%20/g'`
VER=`svnlook youngest /data/repository/view/`

params=`svnlook changed /data/repository/view |awk '{print $2}' |awk '{split($0, a, "/");print a[1]","a[2]}'|awk '!($1 in a){a[$1];print $1}' |awk NF`
for param in $params
do
  arr=(`echo $param |awk '{split($0,a,","); print a[1],a[2]}'`)
  if [[ ${arr[0]} != "" ]];then
    if [[ ${arr[0]} == "6001_feigai" ]];then
      arr[0]="01_SIT"
    elif [[ ${arr[0]} == "8002" ]];then
      arr[0]="03_SIM"
    fi
    curl -k -X POST http://xxx.xxxx.xxxx:8081/job/${arr[0]}/job/${arr[1]}/buildWithParameters -d OnlyRestart=false -d jarsto=\"\" -d "author=${AUTHOR}" -d  "logmsg=${LOG_MESG}" -d "svnrev=${VER}" --user scm:**********
  fi
done

开始以为是jenkins接收到参数后,参数编码解码有问题,通过 tcpdump 抓包发现,svnhook调用curl发送请求时参数就已经乱码了。

手动在svnserver 上执行调用 post-commit ,中文传递正常。

问题原因

环境变量中的语言设置问题,svnhook调用时的环境变量 $LANG 不对,和我直接通过 xshell ssh 到 svnserver 上的 $LANG 不一样,导致中文乱码。

解决方法

在 post-commit 脚本前,增加 LANG 的环境变量设置 :export LANG=zh_CN.UTF-8 也可以设置其他编码,按需设置。