如何在Jenkins主作业中实现缓存机制,复用多Runner作业的编译工件?
实现Jenkins主作业内缓存编译环境供Runner复用的方案
核心思路
让主作业先完成所有公共/需要复用的代码拉取、环境编译工作,将产物存放在主作业的Workspace内,触发Runner作业时传递缓存路径让其复用,最后主作业在所有Runner完成后统一清理缓存,全程在Jenkins作业生命周期内完成,无需依赖外部Linux目录的手动管理。
具体实现步骤
1. 配置主作业(环境准备+触发Runner+清理)
以自由风格项目为例:
- 步骤1:拉取代码与编译环境
执行拉取、编译操作,将产物存入带本次构建唯一标识的缓存目录,避免不同会话的缓存冲突:# 创建专属缓存目录 mkdir -p ${WORKSPACE}/build_cache/${BUILD_ID}/common_env # 拉取公共代码并编译 git clone <公共代码仓库地址> ${WORKSPACE}/build_cache/${BUILD_ID}/common_env/src cd ${WORKSPACE}/build_cache/${BUILD_ID}/common_env/src && make build-env # 若有Runner专属环境,单独编译存放 mkdir -p ${WORKSPACE}/build_cache/${BUILD_ID}/runner_test1 git clone <测试1代码仓库地址> ${WORKSPACE}/build_cache/${BUILD_ID}/runner_test1/src cd ${WORKSPACE}/build_cache/${BUILD_ID}/runner_test1/src && make build-test-env - 步骤2:阻塞式触发Runner作业
添加「构建步骤」→「构建其他项目」,选择要触发的Runner作业,勾选以下选项:Block until the triggered projects finish their builds(等待所有Runner完成后再继续主作业)Pass parameters to the triggered projects(传递参数)
传递两个关键参数:MAIN_BUILD_WORKSPACE:值为${WORKSPACE}(主作业Workspace路径)MAIN_BUILD_ID:值为${BUILD_ID}(本次主作业的唯一标识)
- 步骤3:清理缓存
所有Runner完成后,添加「构建步骤」→「执行shell」清理缓存:
也可直接启用「构建后操作」→「Delete workspace when build is done」,一次性清理整个Workspace(若主作业无其他需保留产物)。rm -rf ${WORKSPACE}/build_cache/${BUILD_ID}/
2. 配置Runner作业(复用缓存)
同样以自由风格项目为例:
- 步骤1:接收主作业参数
在「General」→「This project is parameterized」中添加两个字符串参数:MAIN_BUILD_WORKSPACE(主作业Workspace路径)MAIN_BUILD_ID(主作业构建ID)
- 步骤2:复用缓存执行测试
跳过重复的拉取、编译步骤,直接使用主作业缓存的产物:# 进入主作业缓存的当前Runner专属环境目录 cd ${MAIN_BUILD_WORKSPACE}/build_cache/${MAIN_BUILD_ID}/runner_test1/src # 执行测试 make run-tests
注意事项
- 跨Agent适配:若主作业与Runner作业在不同Jenkins Agent上运行,需在主作业编译完成后用「Copy Artifact」插件将缓存目录打包为构建产物,Runner作业再通过该插件下载缓存到自身Workspace复用。
- 磁盘空间控制:若编译环境体积较大,需关注Agent磁盘使用情况,避免缓存堆积导致磁盘不足。
内容的提问来源于stack exchange,提问作者nir_z
相关产品推荐
相关产品推荐

