Ubuntu 上监控 Jenkins 运行状态的实用方案
一 基础健康检查
- 服务状态与端口连通
- 检查服务:sudo systemctl status jenkins(期望状态:active (running))
- 实时查看启动日志:sudo journalctl -u jenkins -f
- 端口连通:ss -ltnp | grep 8080 或 curl -I http://localhost:8080
- 防火墙放行:sudo ufw allow 8080/tcp(云主机还需在安全组放行)
- 系统资源与关键进程
- 资源监控:top/htop、iostat -x 1、iftop/nethogs
- Java 进程与堆:pgrep -f jenkins;jstat -gc 1000(观察 YGC/FGC 与堆使用)
- 磁盘与 inode:df -h、df -i(构建产物与日志易占满)
- 快速自检清单
- 服务存活、端口监听、进程存在、磁盘空间充足、可登录 Web UI
二 日志与可视化监控
- 日志查看与检索
- 系统日志:sudo tail -f /var/log/jenkins/jenkins.log
- 关键字排查:grep -i “error|exception|oom” /var/log/jenkins/jenkins.log
- Web 端日志:Manage Jenkins → System Log(按日志器和级别筛选)
- 内置可视化
- Monitoring 插件(JavaMelody):Manage Jenkins → Monitoring of Jenkins master,查看 CPU、内存、HTTP 响应时间、当前请求数 等
- 外部时序与可视化
- Prometheus 插件暴露 /prometheus 指标端点,Prometheus 拉取后在 Grafana 展示面板(Jenkins 性能与健康概览)
- 日志轮转与容量控制
- 建议配置 /etc/logrotate.d/jenkins,示例:
- /var/log/jenkins/*.log { daily; rotate 7; compress; missingok; notifempty; create 0644 root adm; sharedscripts; postrotate kill -HUP $(cat /var/run/jenkins/jenkins.pid) 2>/dev/null || true; endscript }
三 构建与流水线健康监控
- API 拉取构建状态
- 最新构建结果:curl -u user:token http:///job//lastBuild/api/json
- 可扩展脚本轮询关键 Job,结合返回码与 result 字段做告警(如非 SUCCESS 则通知)
- CLI 巡检代理与节点
- 获取代理列表:java -jar jenkins-cli.jar -s http:/// -auth user:token agent list
- 适合做节点存活与离线告警
- 日志集中与检索
- 将 Jenkins 日志接入 ELK/Graylog(如 Logstash 插件输出到 ES,Kibana 可视化),便于跨 Job/节点聚合分析
- 常见异常信号
- 构建频繁失败、队列长期堆积、节点频繁离线、构建日志报 OutOfMemoryError 或 GC 停顿过长
四 告警与容量优化
- 告警建议
- 进程或端口不可用、HTTP 5xx 增多、构建失败率超阈值、磁盘使用率 > 80%、JVM Full GC 次数突增
- 可用脚本 + 企业微信/钉钉 Webhook、Prometheus Alertmanager、Zabbix 等方式推送
- 容量与性能优化
- 调整堆大小:编辑 /etc/default/jenkins,设置 JAVA_ARGS=“-Xmx4096m -Xms2048m”
- 控制并发:在 全局配置 限制“执行者数量”,并为重任务配置 构建代理
- 定期清理:工作区与构建历史(Workspace Cleanup 插件)、旧日志与制品归档
- 版本与插件:保持 Jenkins 与插件 为兼容版本,减少资源泄漏与不稳定因素
- 最小可用监控脚本示例
- 检查服务与端口:
- systemctl is-active --quiet jenkins || echo “Jenkins down”
- ss -ltnp | grep -q :8080 || echo “Port 8080 not listening”
- 检查最近一次构建:
- status=$(curl -s -u user:token http:///job//lastBuild/api/json | jq -r ‘.result’)
- [[ “$status” != “SUCCESS” ]] && echo “Job last build failed: $status”