Ubuntu 上 Jenkins 构建优化的实操清单
一 环境与资源配置
- 升级到受支持的 Java 11+,并优先使用 JDK 11 或更高版本,避免老版本带来的性能与兼容性问题。
- 为 Jenkins 实例分配合理的堆内存:编辑 /etc/default/jenkins,设置 JAVA_ARGS=“-Xmx4096m”(按机器内存与负载调整,避免过大导致 GC 停顿或过小触发频繁 Full GC)。
- 控制并发:在 Manage Jenkins > Nodes > 主节点 > Configure 将 Executors 设为不超过 CPU 物理核心数,为系统与其他服务预留资源。
- 基础硬件与存储:生产环境建议 ≥8GB 内存、≥10GB 磁盘,并优先使用 SSD 降低 I/O 瓶颈。
二 构建过程与流水线优化
- 依赖缓存:在流水线中对 Maven/Gradle/NPM 等依赖目录做缓存,避免重复下载。示例(声明式 Pipeline):
pipeline {
agent any
stages {
stage('Cache Dependencies') {
steps {
sh 'mkdir -p ~/.m2/repository'
cache 'maven', path: '~/.m2/repository'
}
}
stage('Build & Test') {
steps { sh 'mvn -B -DskipTests package' }
}
}
}
- 并行化:将互不依赖的阶段并行执行,显著缩短总耗时。示例:
stage('Parallel Tests') {
parallel {
stage('Unit') { steps { sh 'mvn test -Dtest=Unit*' } }
stage('Integ') { steps { sh 'mvn test -Dtest=Integ*' } }
}
}
- 触发与分支治理:使用 Generic Webhook Trigger 解析 Git 事件,按 分支/提交 做过滤,避免无效构建;在流水线 post 阶段回写 提交状态 到 GitLab/GitHub,提升协作反馈效率。
- 制品与依赖外置:将 依赖仓库(如 Nexus) 与 构建产物 外置与复用,减少重复编译与网络拉取。
三 节点与分布式扩展
- 当单机并发不足时,引入 Jenkins Agent/Slave 构建集群:在 系统管理 > 节点管理 > 新建节点 添加代理,确保节点具备 Java、Git、Maven/Gradle 等环境,且工作目录与脚本路径保持一致;通过 SSH 或 JNLP 方式接入。
- 按职责划分节点(如 Linux 构建节点、Android SDK 节点、Docker 构建节点),实现资源隔离与专用硬件加速(如 Android SDK/NDK 预装)。
- 动态伸缩:在高峰期临时扩容 Agent,低谷回收,保持成本与性能平衡。
四 插件、存储与网络优化
- 插件治理:仅保留 必要插件,定期 更新与清理未使用插件,减少内存与启动开销。
- 构建记录与工作空间:定期 清理旧构建与制品,避免 磁盘膨胀 与 数据库查询变慢。
- 网络与代理:优化 内外网连通性,对 Maven/Gradle/NPM 仓库配置 镜像/代理,显著加速依赖下载。
- 监控与诊断:使用 Performance Plugin 观察构建耗时瓶颈,配合 Java VisualVM/JConsole 定位 JVM/线程/GC 问题。
五 落地检查清单与快速收益
| 优化项 |
操作位置 |
快速验证 |
| 堆内存与 GC |
/etc/default/jenkins 的 JAVA_ARGS |
重启后查看进程参数与 GC 日志,确认无频繁 Full GC |
| Executors 数量 |
主节点 Configure |
构建排队减少,CPU 利用率提升且不过载 |
| 依赖缓存 |
Pipeline cache 指令 |
第二次构建依赖下载显著减少 |
| 并行测试 |
parallel 阶段 |
总耗时接近最慢阶段,而非各阶段之和 |
| 节点扩展 |
节点管理 > 新建节点 |
队列快速清空,多项目并行无争用 |
以上步骤按“先易后难、先本地后集群”的顺序实施,通常能在 数小时 内获得明显收益,并具备持续迭代空间。