You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置排除该目录:

  1. 创建配置文件:/etc/tmpfiles.d/jenkins-bazel-tmp.conf
  2. 添加内容:x /home/jenkins/agent/tmp
  3. 重启服务生效:systemctl restart systemd-tmpfiles-setup

内容的提问来源于stack exchange,提问作者AhmFM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:37:54