Jenkins 构建产物报告丢失速查:工作空间被清、路径模式与节点切换
更新时间:2026-10-24。FAQ 速查页,面向构建绿了但「Last Successful Artifacts」空空如也、测试报告页 404、或日志里躺着一行
No artifacts found的同学。Jenkins 构建产物丢失的本质是「产出 × 收集 × 保留」三环的任意一环脱了:产物压根没生成(构建中断、生成路径漂移)、收集环节没捞到(archiveArtifacts 的模式不匹配、跑在 A 节点却在 B 节点找)、或捞到了又被清掉(保留策略、磁盘清理任务)。控制器地址以jenkins.example.com占位,任务路径以/proj/demo占位。如果产物在但解压不开,转 Jenkins 归档产物损坏速查。
本文要回答的问题
No artifacts found that match the file pattern是产物没生成还是模式写错了?- 多节点跑流水线,为什么有时产物齐有时整个没有?
- 上一次构建的产物还在,这次构建完旧产物不见了是什么策略在删?
- 工作空间被定时清理后,正在跑的构建会怎样?
- 测试跑了、日志里用例数也在,为什么 JUnit 报告页是空的?
一、报错原文与典型现象
丢失类报错集中在三处:归档步骤的日志行、产物页的空白、以及报告发布步骤的提示:
# 归档步骤:模式一个文件都没匹配上
ERROR: No artifacts found that match the file pattern
"dist/app.tar.gz". Configuration error?# 报告发布:XML 文件不存在
ERROR: Step 'Publish JUnit test result report' failed:
Test reports were found but none of them are new.
Did tests run? report 'target/surefire/*.xml' does not match anything# 工作空间被清:构建中途目录没了
java.io.IOException: Cannot run program "mvn":
error=2, No such file or directory读现象先分三环:No artifacts found 与 does not match anything 是「收集环」——先去工作空间看文件到底在不在;构建日志中后段突然 No such file or directory 是「产出环」被工作空间清理打断;归档日志正常但页面空空,是「保留环」在删旧件。
二、病因处置速查表
| 报错现象 / 场景 | 可能原因 | 快速验证 | 处置 |
|---|---|---|---|
| No artifacts found that match | 模式相对路径写错或大小写不符 | 工作空间页实际浏览目录树 | 按真实相对路径改模式 |
| 同任务时有时无产物 | 多节点轮跑,产物落在别台节点 | 对比两次构建的节点标签 | 钉节点或产物上传到制品库 |
| 构建中途 No such file or directory | 工作空间被并发清理任务删掉 | 查控制器清理策略与 cron | 构建期锁工作空间,错峰清理 |
| 旧构建产物被删 | 构建保留策略只留最近 N 次 | 任务配置页查丢弃旧构建 | 关键构建加「永久保留」标记 |
| JUnit 报告 none of them are new | XML 时间戳旧于构建开始时间 | 看 XML 文件的修改时间 | 构建前清旧报告,再重新生成 |
| 流水线跳过归档步骤 | when 条件不满足或前段失败被 swallow | 看 stage 视图哪步灰掉 | 用 post always 兜底归档 |
三、排查决策图
下面这张图是标准排查路线,颜色按角色区分:红是报错入口与命中的根因,蓝是排查动作,绿是通过分支,橙是修复动作,紫是防复发沉淀。
读这张图抓分水岭:构建过程里就报「目录不存在 / 文件消失」走左支,查产出环——工作空间清理与生成路径;构建全程正常、只是归档匹配为空走右支,查收集环——模式与节点。产物页旧件消失单独问保留策略,它不属于这两条支路。
四、逐条排查展开
模式不匹配是收集环的第一嫌疑。 archiveArtifacts 的模式是相对工作空间根目录的 Ant 风格通配符(**/*.jar),最常见的错是把「生成目录」当成「工作空间根」:比如产物实际在 app/build/dist/ 下,模式却写成 dist/app.tar.gz。验证不用猜——任务页左侧「工作空间」链接能直接浏览目录树,照着真实路径写。两个细节坑:大小写在 Linux 节点上敏感;路径里的反斜杠是 Windows 风格写法,跨平台任务统一用正斜杠。
多节点轮跑让产物「随机消失」。 流水线没钉 agent 标签时,这次构建可能落在 A 节点、下次在 B 节点;归档步骤从「本次工作空间」收,下游步骤若去「固定某台机器」找就扑空。更隐蔽的是 stash/unstash 跨 stage 传文件时漏了某个目录。处置两条路:测试与构建钉同一标签节点,保证产物就地可取;或者干脆把产物第一时间上传到制品库(Nexus/Artifactory 或 Jenkins 自带归档),下游只认制品库不认节点磁盘——这是根治姿势。
工作空间被清是产出环的暗伤。 控制器上若配了「磁盘不足时清理工作空间」或定时 ws-cleanup 类任务,正在跑的构建可能被釜底抽薪——日志里就是中后段突然 No such file or directory,前面编译全白费。处置:清理任务与构建高峰错峰,正在使用的工作空间加锁;更重要的是别把「构建期目录」与「清理任务目标」重叠配置。磁盘水位治理见 Jenkins 磁盘空间不足速查。
旧产物消失查保留策略。 任务配置里的「丢弃旧的构建」默认按数量保留,旧的构建记录连同其归档产物一起被删。关键版本(发版构建)点构建页「Keep this build forever」钉住;或者产物本来就该进制品库而不是长期躺在 Jenkins 里——Jenkins 归档是周转区不是仓库。
JUnit 报告「none of them are new」是时间戳问题。 测试报告插件会过滤「比构建开始时间还旧」的 XML——典型场景是工作空间里残留了上一次构建的报告,本次测试实际没跑(或跑到别的目录),插件只捞到旧件就报这个错。处置:构建前清掉报告目录,确保每次生成的都是新文件;同时确认测试真的跑了——看构建日志里的用例计数,日志里没有测试输出,报告缺失只是表象,根因在测试步骤本身。
被跳过的归档步骤要兜底。 流水线里 when { expression } 条件不满足、或前段失败被 catchError 吞掉继续跑,归档步骤可能整段灰掉。stage 视图上一眼能看到哪步没执行。规范写法是把归档放进 post { always { archiveArtifacts ... } },构建成败都收,失败构建的日志与中间件往往是排错最需要的材料。
五、规范做法与预防
- 模式照工作空间目录树写:改模式后先跑一次再看产物页,不凭记忆写相对路径。
- 制品第一时间进制品库:Jenkins 归档只作周转,下游只从制品库取,节点漂移问题归零。
- 构建与清理错峰:工作空间清理任务避开构建高峰,运行中的工作空间不参与清理。
- 关键构建永久保留:发版构建钉 forever 标记,普通构建按保留策略滚动。
- 归档放 post always:成败都收产物与日志,失败现场不丢。
- 报告目录先清再跑:每次构建从干净目录生成测试报告,杜绝旧件混入。
这一篇在知识体系里的位置
本篇是 Jenkins 排错速查簇的「产物可见性」入口:产物找到了但损坏解不开看 Jenkins 归档产物损坏速查;构建根本没产出(编译失败、工具缺失)的上游看 Jenkins 缺失依赖速查 与 Jenkins 路径找不到速查;工作空间清理背后的磁盘治理看 Jenkins 磁盘空间不足速查。「产出环 → 收集环 → 保留环」三环定位法对一切产物丢失类报错通用。
一句话总结
Jenkins 构建产物丢失先按现象定环:构建中途目录消失走产出环——查工作空间清理任务与生成路径,构建和清理必须错峰;构建正常但归档匹配为空走收集环——照工作空间目录树改模式,多节点任务钉标签或干脆把产物第一时间传制品库;旧产物没了走保留环——调整丢弃策略、关键构建钉 forever。归档放 post always 兜底、报告目录先清再跑、制品库当唯一出口三条入库,产物丢失类报错基本绝迹。