您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center 汽车系统工程   模型库
    学习助手
会员   
   
AI智能体开发技术实践
厦门 9月17-18日;线上 10月22-23日
OCSMP 认证培训
9月23-24日 北京+线上
UAF架构体系实践
9月22-23日 北京+线上
     
   
 订阅
Jenkins 流水线彩色日志输出实战:让构建状态一目了然

 
作者:Elixir
  79   次浏览      7 次
 2026-9-15
 
编辑推荐:
主要介绍了如何通过安装 Jenkins 的 AnsiColor 插件并用 ansiColor('xterm') 包裹流水线步骤,让 Shell/Python 输出的 ANSI 颜色码渲染成绿=成功、红=失败、黄=警告的彩色日志,从而快速定位构建状态、提升排错效率,希望对你的学习有帮助。
本文来自于Code自习室,由火龙果软件Alice编辑推荐。

在 Jenkins 自动化构建与部署过程中,控制台往往会输出海量的日志信息。如果所有日志都是单调的黑白文本,排查错误和定位关键节点将非常耗时。本文介绍如何通过 ANSI 转义序列 + AnsiColor 插件,让 Jenkins 流水线日志按状态着色——绿色成功、红色报错、黄色警告——大幅提升运维与开发的排错效率。

一、背景:为什么需要彩色日志

Jenkins 控制台日志的典型痛点:

场景 黑白日志的痛
流水线跑失败 滚动几万行日志找 ERROR,眼睛疲劳
并发跑多个 stage 日志交错,分不清哪条属于哪步
长时间构建 翻"几屏"才确认是不是还在拉代码
关键节点定位 "构建开始/结束"埋在普通输出里

彩色日志的价值:

状态一眼可见:绿色 = 成功,红色 = 失败,黄色 = 警告

关键节点高亮:阶段性输出加色块,分隔清晰

错误快速定位:红色一行立刻吸引视线

降低心智负担:不再需要"逐行扫描"找关键字

二、依赖:AnsiColor 插件

Jenkins 默认会把 ANSI 转义序列当作普通字符串打印(你会看到一堆 \033[32m...),需要安装插件让 Jenkins 解析并渲染这些颜色码。

安装

  1. Jenkins → Manage Jenkins → Plugins → Available plugins
  2. 搜索 AnsiColor
  3. 安装后重启 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!'
    }
  }
}

关键点:

  1. echo -e 必须加 -e,否则 \033[... 不会解析为颜色码
  2. ansiColor('xterm') { ... } 包裹后,Jenkins 才会渲染颜色
  3. 每段彩色输出必须以 \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!'
  }
}
}

工作流程:

  1. Pipeline 从文件服务器 wget 下载 demo.py
  2. python demo.py 执行,Python 通过 print 输出 ANSI 颜色码
  3. ansiColor('xterm') 让 Jenkins 解析这些颜色码
  4. 控制台/Blue Ocean 渲染为彩色
  5. 执行完 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 流水线彩色日志只需三步:

  1. 装插件:AnsiColor
  2. 加包裹:ansiColor('xterm') { sh '...' }
  3. 写颜色:echo -e "\033[32m...\033[0m" 或封装 Python 工具类

一句话记法:

装插件、加包裹、写转义、必 reset——四步让 Jenkins 日志从黑白电视变彩色电视。

实践建议:

  1. 第一步:把 ansiColor('xterm') { } 加到现有 Pipeline 的 sh 外层
  2. 第二步:关键节点(构建/测试/部署)加颜色标记
  3. 第三步:封装 Python Printer 工具类,业务代码统一调用
  4. 第四步:团队约定颜色语义,沉淀进 CI 模板

彩色日志看似小优化,但每天看几百次日志的运维同学会感谢你——眼睛不累,排错不慌

建议动手实验:在现有 Pipeline 加一段 ansiColor('xterm') { sh 'echo -e "\\033[32m Hello Jenkins \\033[0m"' },立即看到效果——这是理解彩色日志最快的方式。
   
79   次浏览       7 次
相关文章

DevOps转型融入到企业文化
DevOps 能力模型、演进及案例剖析
基于 DevOps 理念的私有 PaaS 平台实践
微软开发团队的DevOps实践启示
相关文档

DevOps驱动应用运维变革与创新
运维管理规划
如何实现企业应用部署自动化
运维自动化实践之路
相关课程

自动化运维工具(基于DevOps)
互联网运维与DevOps
MySQL性能优化及运维培训
IT系统运维管理

最新活动计划
AI智能体开发实践 9-17厦门/10-22在线
OCSMP 认证培训 9-23[在线]
企业架构方法与实践 9-15[深圳]
UAF架构体系与实践 9-22[北京]
AI系统的测试方法与工具 9-17[北京]
AI时代的软件架构师培养 9-19[上海]
AI时代的需求分析师培养 10-20[北京]
 
 
最新文章
DevOps 道法术器,立体化实施框架
DevOps 中高效测试基础架构的最佳实践
DevOps 在公司项目中的实践落地
如何基于 Kubernetes 构建完整的 DevOps 流水线
阿里云Kubernetes实战
最新课程
DevOps体系实践、工具与平台
基于Kubernetes的DevOps实践
互联网运维与DevOps
基于Kubernetes构建企业容器云
企业级DevOps工作体系与平台
更多...   
成功案例
北京 DevOps体系实践、工具与平台
神龙汽车 DevOps体系实践、工具与平台
中国移动通信 网络规划与管理
某航空公司 IT规划与企业架构
某金融公司 IT服务管理(ITIL V3)
更多...