Jenkins使用ansicolor着色sh命令报错,returnStdout触发相同错误
问题分析与解决方案
让我们一步步拆解你遇到的问题,核心原因主要集中在Groovy字符串转义规则和Jenkins sh步骤的语法规范上,下面分场景说明:
一、AnsiColor插件使用时的报错原因
你当前的写法里有两个关键问题:
- Groovy的字符串转义坑:在Groovy的双引号/多行字符串(
"""包裹)中,\会被当作转义字符处理,所以你写的\033并不会被解析为ANSI颜色的起始符(ASCII 27),反而会被Groovy转义成无效字符,导致shell执行时出错。 - 对AnsiColor插件的误解:其实你完全不需要手动在sh脚本里加ANSI转义序列——这个插件的作用是让Jenkins识别并渲染shell命令本身输出的颜色。比如只要git开启了颜色输出,插件就会自动把带颜色的输出显示在Jenkins控制台里。
修正后的AnsiColor正确用法
如果想让git branch输出带颜色,先临时开启git的颜色配置,再用插件包裹即可:
node { stage ('Pulling code from Bitbucket') { git branch: 'master', credentialsId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', url: 'git@bitbucket.org:xxxxx/test.git' wrap([$class: 'AnsiColorBuildWrapper', colorMapName: 'xterm']) { // 临时开启git全局颜色输出 sh 'git config --global color.ui always' // 直接执行git branch,插件会自动处理颜色输出 sh 'git branch' } } }
如果一定要手动添加自定义ANSI颜色,要么用Groovy单引号字符串(不会转义\),要么用Unicode转义符\u001b代替\033(Groovy会正确解析):
// 方式1:单引号字符串,避免Groovy转义 sh '\033[35mgit branch\033[0m' // 方式2:Unicode转义的双引号字符串 sh "\u001b[35mgit branch\u001b[0m"
二、returnStdout用法的报错原因
你注释里的代码有明显的语法错误:
- 引号未闭合:
script: 'git branch ""这里的单引号没收尾 - sh步骤的参数写法错误:当使用命名参数(比如
returnStdout: true)时,不能把参数包裹在字符串里,要直接传递参数Map。
正确的returnStdout写法应该是这样:
node { stage ('Pulling code from Bitbucket') { git branch: 'master', credentialsId: '2bbc73c4-254e-45bd-85f4-6a169699310c', url: 'git@bitbucket.org:xxxxx/test.git' script { def branchOutput = sh(returnStdout: true, script: 'git branch').trim() println "${branchOutput}" } } }
如果修正语法后还是出现和AnsiColor相同的错误,那大概率是之前的脚本里残留了转义字符处理问题,或者节点shell环境有冲突。
三、通用排查小技巧
如果以上修正后仍报错,可以试试这些方法:
- 直接在Jenkins节点的终端执行
echo -e "\033[35mTest Color\033[0m",验证节点shell是否支持ANSI转义 - 检查AnsiColor插件是否正确安装,版本是否和你的Jenkins版本兼容
- 用
sh 'echo -e "\033[35mTest Color\033[0m"'做最小化测试,排查是否是git命令本身的问题
内容的提问来源于stack exchange,提问作者Chanafot
相关产品推荐
相关产品推荐

