如何在Jenkins中设置默认编码?

14

我有一个Python脚本,输出非ASCII字符。在命令行中(LANG为en_US.UTF-8)运行正常,但一旦我尝试在Jenkins中运行它(从相同的shell启动),它会失败,表现为ASCII终端的典型方式:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 37: ordinal not in range(128)

我已经尝试在“执行 shell”构建步骤中以以下方式调用脚本:

export LANG=en_US.UTF-8

然而,它似乎忽略了这一点。将以下内容放入我的Python脚本中:
print "Encoding = %s" % sys.getdefaultencoding()

无论我做什么,都给我这个结果:
Encoding = ascii

那么有什么方法可以强制Jenkins使用UTF-8吗?


我对这个问题的更一般答案很感兴趣。我认为下面的Python hack不适用于Python 3.x... - hwjp
如果您正在使用Jenkins管道,请使用pipeline { agent {label 'nodename'} environment { LC_ALL = 'en_US.UTF-8' LANG = 'en_US.UTF-8' LANGUAGE = 'en_US.UTF-8' ... } - LC 웃
6个回答

13

没关系,我找到了如何做:

export PYTHONIOENCODING=UTF-8

1
你在 Jenkins 的哪里设置了这个? - Michael Küller
在调用Python脚本之前,在“执行shell”构建步骤中添加该行。Python不会查看LANG环境变量,但会查看PYTHONIOENCODING变量。 - Karl
您不需要为每个脚本都这样做。相反,在Jenkins > 管理Jenkins > 配置系统 > 环境变量 > 添加中设置PYTHONIOENCODING为UTF-8。无需重启Jenkins即可生效。 - twasbrillig

4

如果您想在Jenkins安装中设置系统级别的编码,可以将其添加为全局属性键值对(Jenkins -> Manage Jenkins -> Configure System),其中name=LANGvalue=<insert your locale here>(在我的情况下等于en_GB.UTF-8)。这样,您就可以避免为每个Jenkins作业设置语言环境。


1
对于Jenkins 2.60.2版本:在尝试了所有选项后,我开始尝试组合。将PYTHONIOENCODING:UTF-8存储为环境变量最终起作用了。 - TemporalWolf
谢谢TemporalWolf,这个解决方案对我很有帮助。之前我卡住了好一段时间。 - twasbrillig

3
如果您正在使用Jenkins Pipeline,您需要在管道中设置编码,如下所示:
pipeline {
    agent {label 'node name'}
    environment {
        LC_ALL = 'en_US.UTF-8'
        LANG    = 'en_US.UTF-8'
        LANGUAGE = 'en_US.UTF-8'
    }
    stages {
        stage ('XXXX') {
            steps {
                 echo 'Hello'
            }
         }
    }
}

2

export PYTHONIOENCODING=UTF-8

这个对我来说没有用,然而

export LC_CTYPE=en_US.UTF-8

有用。


1

-1

另一个解决方案是使用Python 3

brew update
brew install pyenv
pyenv install 3.7.3
pyenv local 3.7.3
make virtualenv

这个错误只会在使用Python 3时出现,所以这并没有什么帮助。 - exhuma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接