| 编辑推荐: |
主要介绍了如何通过安装
Jenkins 的 AnsiColor 插件并用 ansiColor('xterm')
包裹流水线步骤,让 Shell/Python 输出的 ANSI 颜色码渲染成绿=成功、红=失败、黄=警告的彩色日志,从而快速定位构建状态、提升排错效率,希望对你的学习有帮助。
本文来自于Code自习室,由火龙果软件Alice编辑推荐。 |
|
在
Jenkins 自动化构建与部署过程中,控制台往往会输出海量的日志信息。如果所有日志都是单调的黑白文本,排查错误和定位关键节点将非常耗时。本文介绍如何通过
ANSI 转义序列 + AnsiColor 插件,让 Jenkins 流水线日志按状态着色——绿色成功、红色报错、黄色警告——大幅提升运维与开发的排错效率。
|
一、背景:为什么需要彩色日志
Jenkins 控制台日志的典型痛点:
| 场景 |
黑白日志的痛 |
| 流水线跑失败 |
滚动几万行日志找 ERROR,眼睛疲劳 |
| 并发跑多个 stage |
日志交错,分不清哪条属于哪步 |
| 长时间构建 |
翻"几屏"才确认是不是还在拉代码 |
| 关键节点定位 |
"构建开始/结束"埋在普通输出里 |
彩色日志的价值:
✅ 状态一眼可见:绿色 = 成功,红色
= 失败,黄色 = 警告
✅ 关键节点高亮:阶段性输出加色块,分隔清晰
✅ 错误快速定位:红色一行立刻吸引视线
✅ 降低心智负担:不再需要"逐行扫描"找关键字
二、依赖:AnsiColor 插件
Jenkins 默认会把 ANSI 转义序列当作普通字符串打印(你会看到一堆
\033[32m...),需要安装插件让 Jenkins 解析并渲染这些颜色码。
安装
- Jenkins → Manage Jenkins → Plugins → Available
plugins
- 搜索 AnsiColor
- 安装后重启 Jenkins
验证
Pipeline 中可用 ansiColor('xterm') {
... } 包裹步骤即说明安装成功。
三、ANSI 颜色转义码速查
| 转义码 |
颜色 |
用途建议 |
| \033[30m |
黑色 |
一般不用 |
| \033[31m |
红色 |
错误 / 失败 |
| \033[32m |
绿色 |
成功 / 完成 |
| \033[33m |
黄色 |
警告 / 提示 |
| \033[34m |
蓝色 |
信息 / 进度 |
| \033[35m |
紫色 |
调试 / 标记 |
| \033[36m |
青色 |
详情 / 子步骤 |
| \033[91m |
亮红 |
严重错误(醒目) |
| \033[92m |
亮绿 |
重要成功 |
| \033[93m |
亮黄 |
重要警告 |
| \033[0m |
重置 |
必须结尾加上
,否则后续全染色 |
语法:
echo
-e "\033[32m 绿色文本 \033[0m" |
- -e:启用转义字符解析(关键,没它颜色不生效)
- \033[32m:开始绿色
- \033[0m:重置颜色(恢复默认)
四、方案一:echo 输出彩色日志
直接在 sh 中用 echo -e 输出 ANSI 转义序列,配合
ansiColor 步骤让 Jenkins 解析。
pipeline
{
agent {
// 需要安装插件:docker-workflow
docker {
image
'python310:v1'
}
}
environment {
GIT_TOKEN
= '5FU-FwsRFqC8Ks799EQn' // 设置环境变量
VERSION
= '1.0.0'
}
parameters { // 设置参数
string(name:
'BRANCH', defaultValue: 'feature-jenkins', description:
'Branch to build')
}
stages {
stage('打印输出')
{
failFast true
steps {
// 不使用 ansiColor 包裹时,Jenkins 也能渲染(取决于版本),但不推荐
sh """
# -e 参数表示启用转义字符解析
echo -e "\033[32m 构建成功!\033[0m"
echo -e "\033[31m 发生严重错误!\033[0m"
echo -e "\033[33m 警告:请注意检查配置。\033[0m"
"""
// 使用 ansiColor 包裹,指定颜色映射为 'xterm' 【推荐使用】
ansiColor('xterm') {
sh '''
echo -e "\033[32m 开始构建任务... \033[0m"
echo -e "\033[34m 正在拉取代码... \033[0m"
# 模拟一些操作
echo -e "\033[33m 构建完成,准备部署。 \033[0m"
'''
}
}
}
}
post {
always {
echo 'Cleaning
up...'
sh 'rm
-rf ./AutoTL3'
}
success {
echo 'Pipeline
completed successfully!'
}
failure {
echo 'Pipeline
failed!'
}
}
} |
关键点:
- echo -e 必须加 -e,否则 \033[... 不会解析为颜色码
- ansiColor('xterm') { ... } 包裹后,Jenkins 才会渲染颜色
- 每段彩色输出必须以 \033[0m 结尾,否则后续日志全被染色
五、方案二:Python 输出彩色日志
复杂场景(如多模块测试报告、动态字符串拼接)下,shell 的 echo
-e 可读性差。把颜色输出封装到 Python 工具类,Pipeline 只负责调用。
5.1 Python 工具类:Printer
#
-*- coding: utf-8 -*-
# @Desc : 彩色打印
class Printer:
__ANSI_RED = '\033[91m'
__ANSI_GREEN = '\033[92m'
__ANSI_YELLOW = '\033[93m'
__ANSI_END = '\033[0m'
@classmethod
def INFO(cls, msg):
msg = 'INFO:
' + msg
print(cls.__ANSI_GREEN
+ msg + cls.__ANSI_END)
@classmethod
def ERROR(cls, msg):
msg = 'ERROR:
' + msg
print(cls.__ANSI_RED
+ msg + cls.__ANSI_END)
@classmethod
def WARNING(cls, msg):
msg = 'WARNING:
' + msg
print(cls.__ANSI_YELLOW
+ msg + cls.__ANSI_END)
if __name__ == '__main__':
Printer.ERROR("XXX")
Printer.INFO("XXX")
Printer.WARNING("XXX")
|
设计要点:
- __ANSI_xxx 私有常量,对外不可见
- @classmethod 类方法,无需实例化即可调用:Printer.INFO("xxx")
- 自动拼接 INFO: / ERROR: / WARNING: 前缀,便于日志过滤
- 每行结尾自动 \033[0m 重置颜色,不会污染后续输出
5.2 配套 Pipeline
pipeline
{
agent {
// 需要安装插件:docker-workflow
docker
{
image 'python310:v1'
}
}
environment {
GIT_TOKEN
= '5FU-FwsRFqC8Ks799EQn'
VERSION
= '1.0.0'
}
parameters {
string(name:
'BRANCH', defaultValue: 'feature-jenkins', description:
'Branch to build')
}
stages {
stage('打印输出')
{
failFast true
steps {
// 直接执行(颜色码会被原样输出,需要 ansiColor 包裹)
sh """
wget http://10.132.1.127:8123/Tempfile/demo.py
python demo.py
rm -rf demo.py
"""
// 使用 ansiColor 包裹,指定颜色映射为 'xterm' 【推荐使用】
ansiColor('xterm') {
sh '''
wget http://10.132.1.127:8123/Tempfile/demo.py
python demo.py
rm -rf demo.py
'''
}
}
}
}
post {
always {
echo 'Cleaning
up...'
sh 'rm
-rf ./AutoTL3'
}
success {
echo 'Pipeline
completed successfully!'
}
failure {
echo 'Pipeline failed!'
}
}
} |
工作流程:
- Pipeline 从文件服务器 wget 下载 demo.py
- python demo.py 执行,Python 通过 print 输出 ANSI 颜色码
- ansiColor('xterm') 让 Jenkins 解析这些颜色码
- 控制台/Blue Ocean 渲染为彩色
- 执行完 rm -rf demo.py 清理工作区
六、效果对比
6.1 原始控制台输出效果
未启用 ansiColor 时,ANSI 转义序列易被当作纯文本输出或被
Shell 错误解析为乱码。启用 ansiColor('xterm') 即可恢复正常颜色渲染,同时支持
Shell 与 Python 打印输出。
6.2 Blue Ocean 视图下输出效果
在Blue Ocean视图下对 ANSI 颜色渲染更友好,深色背景下尤其清晰。但是对python输出的内容却不够友好吗,测试发现并不能对输出彩色字符串。
七、ansiColor 与 xterm 映射说明
ansiColor('xterm')
{ ... } |
xterm 是什么:一种 ANSI
颜色映射方案,定义了 256 色调色板。常见映射方案对比:
| 方案 |
颜色数 |
兼容性 |
推荐场景 |
| xterm |
256 |
最好 |
通用推荐 |
| vga |
16 |
老 |
兼容旧终端 |
| css |
16M |
现代 |
Web 视图 |
生产推荐:始终用 xterm,覆盖
95% 场景。
作用范围:ansiColor 块内所有
sh 输出都会被解析,块外则保持原样。
ansiColor('xterm')
{
sh 'echo
-e "\\033[32m绿色\\033[0m"'// ✅ 渲染为绿色
}
sh 'echo -e "\\033[32m绿色\\033[0m"'//
❌ 原样输出转义码 |
八、常见坑点速查
| 坑 |
现象 |
解决 |
echo
忘记 -e |
\033[...
原样输出 |
改为 echo -e "..." |
| 忘记结尾 \033[0m |
后续所有日志全染色 |
每段彩色后必加 reset |
| 没装 AnsiColor 插件 |
ansiColor
步骤报错 |
Jenkins → Plugins 安装 AnsiColor |
| Pipeline 块外用颜色码 |
Blue Ocean 显示乱码 |
把 sh 移到 ansiColor { } 内 |
| Python print 颜色不显示 |
Jenkins 没渲染 |
同样需要 ansiColor 包裹 |
| shell 三引号字符串里写 \\033 |
转义层数过多 |
用单引号 '\033' 避免双重转义 |
| Windows 容器无 echo -e |
报错 invalid option |
Windows 用 printf 或换 Linux 容器 |
failFast true
误用 |
平行 stage 一个失败全停 |
仅 parallel 块内有效,单 stage 无意义 |
九、最佳实践
1. 用工具类封装颜色输出
像 Printer 那样把颜色码封装到工具类,业务代码只调 Printer.INFO(...),不直接写
ANSI 码。好处:
- 业务代码干净
- 颜色方案统一可改
- Python 单元测试不依赖 Jenkins 也能跑
2. 颜色语义统一
| 颜色 |
语义 |
| 绿色 |
成功 / 完成 |
| 红色 |
失败 / 严重错误 |
| 黄色 |
警告 / 注意 |
| 蓝色 |
信息 / 进度 |
| 青色 |
调试细节 |
团队约定一次,所有 Pipeline 共用,避免"红色一会表示警告一会表示失败"的混乱。
3. 关键节点必加色块
echo
-e "\033[32m========== 阶段1:拉取代码 完成 ==========\033[0m"
|
长流水线在每段结束时用色块标记,便于事后翻日志定位阶段边界。
4. 失败立即红色高亮
if
[ $? -ne 0 ]; then
echo -e
"\033[31m[FAIL] 构建失败,请检查上面输出\033[0m"
exit 1
fi |
红色一行胜过一屏黑白文本。
5. 配合 timestamps() 插件加时间戳
options
{
timestamps()
// 每行日志自动加 [2026-08-05 14:23:01]
} |
颜色 + 时间戳 = 完整的"何时发生了什么"。
十、总结
Jenkins 流水线彩色日志只需三步:
- 装插件:AnsiColor
- 加包裹:ansiColor('xterm') { sh '...'
}
- 写颜色:echo -e "\033[32m...\033[0m"
或封装 Python 工具类
一句话记法:
装插件、加包裹、写转义、必
reset——四步让 Jenkins 日志从黑白电视变彩色电视。 |
实践建议:
- 第一步:把 ansiColor('xterm') { }
加到现有 Pipeline 的 sh 外层
- 第二步:关键节点(构建/测试/部署)加颜色标记
- 第三步:封装 Python Printer 工具类,业务代码统一调用
- 第四步:团队约定颜色语义,沉淀进 CI 模板
彩色日志看似小优化,但每天看几百次日志的运维同学会感谢你——眼睛不累,排错不慌。
建议动手实验:在现有
Pipeline 加一段 ansiColor('xterm') { sh 'echo -e
"\\033[32m Hello Jenkins \\033[0m"'
},立即看到效果——这是理解彩色日志最快的方式。 |
|