Jenkins流水线数据持久化需分三层:一是通过命名卷(Docker)或PVC(K8s)挂载/var/jenkins_home确保主配置、插件、凭证等不丢失;二是启用PERFORMANCE_OPTIMIZED等Durability设置平衡I/O性能与崩溃恢复能力;三是为Docker Registry、MinIO、Slave缓存等配套组件配置独立PVC。
Jenkins 流水线数据的持久化存储,核心目标是确保构建历史、作业配置、插件状态、凭证、日志、artifacts 等关键信息在 Jenkins 重启、Pod 重建、容器重部署甚至节点故障后不丢失。它分为两个层面:Jenkins 主服务自身的数据持久化(即 /var/jenkins_home),以及流水线运行过程中产生的中间状态与大对象的持久性保障(如大型 JSON/Map 变量、多分支汇总数据等)。两者需协同配置,缺一不可。
Docker 环境推荐使用命名卷(Named Volume)
它由 Docker 自动管理路径和权限,避免 bind mount 常见的 UID 冲突问题:
docker volume create jenkins_homedocker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home --name jenkins-server jenkins/jenkins:lts-jdk21
Kubernetes 环境必须使用 PVC 绑定 PV
尤其当 Jenkins 运行在多节点集群中时,需支持读写共享(如 NFS、CephFS 或云厂商 NAS):
PersistentVolume(PV),指定 accessModes: ReadWriteMany(若需多 Pod 并发读写) PersistentVolumeClaim(PVC),绑定到 PV /var/jenkins_home 注意:若使用
ReadWriteOnce,需配合 StatefulSet + 固定 Pod 名称,确保每次重建都挂载同一 PV。
权限处理不能跳过
Jenkins 容器内以 UID 1000 运行,挂载目录在宿主机或 NFS 上必须可被该 UID 写入。NFS 服务端建议配置 no_root_squash,并确认 /data/v2 目录属主为 1000:1000 或权限设为 777(测试环境)或 755+适当属组(生产环境)。
启用 Speed/Durability 设置(关键调优项)
这不是“关掉持久化”,而是按需降低写入粒度与频率,换取吞吐提升:
PERFORMANCE_OPTIMIZED(牺牲极小恢复能力,显著减少磁盘刷写) properties([pipelineTriggers([]), durabilityHint('PERFORMANCE_OPTIMIZED')]) 识别高 I/O 场景,主动拆分或暂存
script{} 中长期持有超大对象(如解析 50MB XML 后反复 .put() 到 Map) sh 'jq ... > /tmp/summary.json' + readFile('/tmp/summary.json'),让文件系统接管缓存 stash/unstash 替代全局变量传递中间产物,更可控且可配置存储位置(如绑定到 PVC)内嵌 Docker Registry(docker-registry 工作负载)
默认用临时存储,镜像会随 Pod 删除而消失。须为其挂载 PVC,并将挂载路径设为 /var/lib/registry。
MinIO(用于存 artifact 或日志归档)
同样需 PVC 挂载,路径指定为 /data;建议单独申请高性能存储类(如 SSD 类型 StorageClass)。
动态 Slave Pod 的构建缓存(如 Maven .m2、Node modules)
若使用 Kubernetes Plugin 动态拉起 Pod,可在 Pod Template 中添加 emptyDir 或 hostPath 挂载(仅限单节点调试),生产环境推荐用 PVC + initContainer 预热或 volumeClaimTemplate 实现缓存复用。
流水线数据持久化不是“配一次就完事”的配置项,而是贯穿 Jenkins 部署、运行、调优全周期的设计决策。从 /var/jenkins_home 的可靠挂载起步,再根据流水线规模和模式调整 Durability 级别,最后补全周边组件存储——三层落地,才能真正兼顾稳定性与效率。