生产环境Jenkins获取无编码可读构建日志方法咨询
解决方案:获取Jenkins干净构建日志并作为附件发送
由于生产环境无法安装插件,我们可以通过Jenkins API获取原始日志 + 命令行过滤清理 + 邮件发送的流程实现需求,具体步骤如下:
1. 通过Jenkins API获取构建原始日志
使用Jenkins的consoleText端点可直接获取纯文本格式的构建日志,无需处理分页。请求需带上认证信息(用户名+API Token,可在Jenkins个人设置中生成)。
基础命令(无CSRF保护):
# 替换为你的Jenkins地址、任务名、构建编号、用户名和API Token curl -u "your-username:your-api-token" "http://your-jenkins-url/job/your-job-name/your-build-number/consoleText" > raw-build-log.txt
若Jenkins启用CSRF保护:
先获取crumb,再发起请求:
# 获取CSRF crumb CRUMB=$(curl -u "your-username:your-api-token" "http://your-jenkins-url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") # 获取日志 curl -u "your-username:your-api-token" -H "$CRUMB" "http://your-jenkins-url/job/your-job-name/your-build-number/consoleText" > raw-build-log.txt
2. 清理日志中的乱码和Base64内容
日志中的[8m...[0m属于ANSI控制序列(用于终端颜色/格式),内部包含的长串Base64内容可通过命令行工具过滤:
组合过滤命令:
# 步骤1:移除所有ANSI控制序列(包括颜色、格式代码) # 步骤2:移除长串Base64字符(匹配长度≥80的Base64特征字符串) sed -e 's/\x1b\[[0-9;]*m//g' raw-build-log.txt | sed -E 's/[A-Za-z0-9+/=]{80,}//g' > clean-build-log.txt
说明:
- 第一个
sed命令移除所有\x1b[xxm格式的ANSI控制码,解决终端格式干扰问题 - 第二个
sed命令匹配并删除长度超过80的Base64特征字符串(由字母、数字、+、/、=组成),过滤掉日志中的编码垃圾内容
3. 将干净日志作为附件发送邮件
使用系统自带的mailx(或sendmail)工具发送带附件的邮件,无需额外依赖:
# 替换收件人、邮件主题和内容 mailx -s "Build #your-build-number 执行完成日志" -a clean-build-log.txt recipient@example.com << EOF 构建#your-build-number已完成,附件为清理后的可读日志。 EOF
4. 整合到Jenkins构建后步骤
将上述命令整合成Shell脚本,添加到Jenkins构建的Post-build Actions → Execute shell中(建议使用Jenkins凭据管理存储API Token,避免明文泄露):
示例脚本(使用Jenkins内置变量):
#!/bin/bash JENKINS_URL="http://your-jenkins-url" USERNAME="your-username" API_TOKEN="${JENKINS_API_TOKEN}" # 从Jenkins凭据中引用 # 获取CSRF crumb(若启用) CRUMB=$(curl -u "${USERNAME}:${API_TOKEN}" "${JENKINS_URL}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)") # 获取原始日志 curl -u "${USERNAME}:${API_TOKEN}" -H "$CRUMB" "${JENKINS_URL}/job/${JOB_NAME}/${BUILD_NUMBER}/consoleText" > raw-log.txt # 清理日志 sed -e 's/\x1b\[[0-9;]*m//g' raw-log.txt | sed -E 's/[A-Za-z0-9+/=]{80,}//g' > clean-log.txt # 发送邮件 mailx -s "Build #${BUILD_NUMBER} 完成日志" -a clean-log.txt dev-team@example.com << EOF 构建#${BUILD_NUMBER}已执行完成,附件为清理后的可读日志。 EOF # 清理临时文件 rm raw-log.txt clean-log.txt
这样就能在构建完成后自动生成并发送干净的可读日志附件,完全无需安装任何Jenkins插件。
内容的提问来源于stack exchange,提问作者HelpNeeder
相关产品推荐
相关产品推荐

