Jenkins Agent Pod中自定义Bazel缓存目录遭删除,求排查方案
Bazel缓存目录莫名删除的排查与修复方案
一、核心问题定位
从报错信息看,Go链接器仍在使用系统默认的/tmp目录,说明阶段1设置的TMPDIR环境变量未在Bazel执行阶段生效——这大概率是问题根源,当然也不排除自定义目录确实被清理的可能。
二、排查方法
1. 验证环境变量传递有效性
- 在阶段2执行Bazel前添加命令:
echo "当前TMPDIR: $TMPDIR",确认变量是否被Bazel进程继承。 - Jenkins不同Stage默认是独立shell进程,仅在Stage的shell中
export的变量无法跨Stage传递,需通过Pipeline全局配置传递。
2. 追踪目录删除行为
- 检查系统清理机制:查看是否有
tmpwatch、systemd-tmpfiles等定时任务,确认/home/jenkins/agent/tmp是否被纳入清理规则(可查看/etc/tmpfiles.d/下的配置文件)。 - 排查Pipeline脚本:检查后续Stage或Post步骤中是否存在
rm -rf等可能误删目录的命令。 - 实时监控目录:在阶段1创建目录后执行
inotifywait -m -r /home/jenkins/agent/tmp,记录所有对该目录的删除、修改操作,定位触发源。
3. 检查目录权限与存在性
- 在阶段2执行前添加命令:
ls -ld /home/jenkins/agent/tmp,确认目录存在且Jenkins运行用户拥有读写权限(避免因权限问题导致无法写入,被误判为目录不存在)。
三、目录创建与环境变量的正确配置
阶段1的mkdir -p命令本身无问题,但环境变量设置方式有误,需改为Jenkins Pipeline全局环境变量配置:
pipeline { agent any environment { TMPDIR = '/home/jenkins/agent/tmp' } stages { stage('初始化缓存目录') { steps { sh 'mkdir -p $TMPDIR' } } stage('运行Bazel') { steps { sh 'bazel build //your:target' } } } }
这种配置能让所有Stage的进程都继承TMPDIR变量,确保Bazel及依赖工具链使用自定义临时目录。
四、系统清理规则排除方案
若确认自定义目录被系统定期清理,可修改systemd-tmpfiles配置排除该目录:
- 创建配置文件:
/etc/tmpfiles.d/jenkins-bazel-tmp.conf - 添加内容:
x /home/jenkins/agent/tmp - 重启服务生效:
systemctl restart systemd-tmpfiles-setup
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

