定位 ClickHouse 无状态测试 CI 失败:Stateless/Fast test 产物(Artifacts)抓取与解压实战

发布时间:2026/9/7 23:52:29

定位 ClickHouse 无状态测试 CI 失败:Stateless/Fast test 产物(Artifacts)抓取与解压实战
定位 ClickHouse 无状态测试 CI 失败Stateless/Fast test 产物Artifacts抓取与解压实战【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouseClickHouse 的 CI 基于 Praktika 框架每个 job 的失败现场都以 S3 对象的形式保留为若干独立的日志产物clickhouse-server.log、clickhouse-server.err.log、job.log等。无状态测试Stateless tests与快速测试Fast test的产物布局是排查“结果 diff”“服务器异常/退出”“运行器基础设施失败”三类问题的核心依据。本文基于仓库内 artifacts-stateless.md 完整继承其文件目录、抓取命令与按失败类型的关键文件速查并结合 ci/praktika/s3.py、ci/praktika/settings.py 与 .claude/tools/fetch_ci_report.js 的源码深入讲清“为什么同一个日志文件有时是纯文本、有时是.zst压缩包”这一关键机制以及透明解压工具如何兜底。读完本文你将能够给定任意一次 stateless/fast test 的 CI 失败列出并正确抓取所需的日志产物识别失败类型后直达最关键的日志文件并从源码层面理解 Praktika 的对象级压缩规则避免手工拼 URL 时的 404 陷阱。产物总览全部是独立文件用--links拿 URLStateless / Fast test 与其他 job 家族如 integration test 的logs.tar.gz大包不同它的每个产物都是单独的文件对象而不是一个归档包。排查的第一步永远是先列出 URL再按需抓取不要盲目下载# 用 --links 列出该报告的全部产物 URL node .claude/tools/fetch_ci_report.js report-url --failed --links拿到 URL 列表后只下载与失败类型相关的那一两个文件即可。注意压缩与否取决于文件大小。Praktika 上传时小文件以纯文本对象形式存放大文件则以 zstd 压缩的.zst对象形式存放。--links显示的 URL 反映的是 S3 上实际的 key因此应原样使用。如果必须手工构造 URL先尝试不带后缀的原始文件名若得到 404再追加.zst并解压。永远不要假定某个固定文件必有固定扩展名。文件目录每个产物文件包含什么以下是 stateless / fast test 产物的完整文件目录继承自 artifacts-stateless.md文件内容clickhouse-server.log[.zst]ClickHouse 服务器主日志clickhouse-server.err.log[.zst]服务器 stderr启动错误、致命信号clickhouse-local.log[.zst]clickhouse-local输出仅 Fast testclickhouse-local.err.log[.zst]clickhouse-localstderr仅 Fast teststderr.log[.zst]测试运行器 stderrjob.log[.zst]CI job 脚本执行日志coordination.tar.gzKeeper 协调日志仅 Fast test几点使用提示文件名中的[.zst]表示该文件可能以 zstd 压缩形式存在具体以--links输出为准机制见后文源码解析。clickhouse-local.*与coordination.tar.gz只在 Fast test 场景出现——Fast test 是用clickhouse-local进程内嵌运行测试并内置 Keeper 协调的轻量变体因此没有独立 server 日志。对应测试的 Docker 镜像定义见 ci/docker/stateless-test/Dockerfile可用于了解这些日志在容器内是如何产生的。抓取方法按 URL 扩展名选择处理方式拿到 URL 后先检查 URL 的扩展名再决定管道# 纯文本文件URL 无 .zst 后缀 curl -sL url | tail -200 # Zstd 压缩文件URL 带 .zst 后缀 curl -sL url | zstd -dcq | grep -i error\|exception\|fatal | tail -50 # 不确定时——先下载再判断 curl -sL url -o tmp/investigate/$SHA/artifact file tmp/investigate/$SHA/artifact # 显示 Zstandard compressed data 或 ASCII text 等 # 然后zstd -dcq tmp/investigate/$SHA/artifact | ... 或 cat tmp/investigate/$SHA/artifact | ...其中zstd -dcq表示按 zstd 格式解压到 stdout 且不打印进度file命令用于在不确定对象真实编码时判别。仓库自带的 fetch_ci_report.js 对这种不确定性做了自动化兜底值得了解其行为源码见下文透明解压maybeDecompress按魔数magic bytes检测对象是否为 zstd/gzip 编码是则自动解压——因此无论是明文、.zst还是 gzip 对象读到的都是解码后的文本404/403 自动重试.zst兄弟对象若请求一个不带后缀的 URL 返回 403 或 404且 URL 尚未以.zst结尾工具会自动追加.zst再请求一次。这正是“先试原名、404 再试.zst”规则的程序化实现。所以上述手工流程在多数情况下可以用node .claude/tools/fetch_ci_report.js report-url --failed --links一步替代但理解手工流程能让你在工具不可用或需要精确定位时不慌。按失败类型定位关键文件CI 失败的第一现场通常不在产物里而在报告本身。按失败类型分四种情况继承自 artifacts-stateless.md1. 失败原因已在result.info中绝大多数 stateless 失败工具已经展示失败原因Reason: type:后跟实际输出或 diff。只有当原因部分被截断、或需要服务器端上下文时才去翻产物。2. 测试输出 diffReason: result differsdiff 本身在result.info里要看完整测试输出取stderr.log测试运行器输出包含 actual vs expected 对比。3. 服务器异常/退出Reason: having exception in stdout、Server diedclickhouse-server.err.log.zst—— 包含完整异常及堆栈clickhouse-server.log.zst—— 围绕result.info中的时间戳前后搜索。4. 测试运行器基础设施失败超时、Docker 问题job.log—— 原始 CI job 脚本输出显示执行到哪一步、在哪里停住。排查顺序建议result.info→ 按类型选 12 个产物文件 → 仍无法定因时再考虑更大的归档或二进制产物。这与调查技能 SKILL.md 的整体策略一致先读错误信息与源码只有当信息仍不足时才下载产物且只下载恰好能补上缺口的那几个文件。源码解析为什么压缩与否取决于文件大小--links的 URL 是“实际 S3 key 的映射”这个承诺背后是 Praktika 上传管线中的一段阈值判断。压缩开关与阈值。在 ci/praktika/settings.py 中TEXT_CONTENT_EXTENSIONS: Iterable[str] frozenset([.txt, .log]) # Compress if text file size exceeds this threshold (in MB, 0 - disable compression) COMPRESS_THRESHOLD_MB: int 0只有“文本类”内容.txt、.log等才有资格走压缩分支——日志正好都在这类里COMPRESS_THRESHOLD_MB是阈值单位 MB默认0表示禁用ClickHouse CI 部署时由环境配置给出实际值超过该阈值的文本文件就会被压缩。上传时的判断点。ci/praktika/s3.py 的_upload_file_to_s3约 L645-L669是这条规则的执行处if text and Settings.COMPRESS_THRESHOLD_MB 0: file_size_mb os.path.getsize(local_file_path) / (1024 * 1024) if file_size_mb Settings.COMPRESS_THRESHOLD_MB: print( fNOTE: File [{local_file_path}] exceeds threshold [...] - compress ) text False local_file_path Utils.compress_file(local_file_path)注意两点判断发生在上传前且压缩后文件路径直接改变——随后以新路径带压缩后缀作为 S3 key 上传。这就是为什么同一个逻辑文件一次构建里是明文、另一次构建里是.zst同一代码逻辑不同文件大小/阈值组合得出不同 key。另一条压缩路径compress_zst标志。在 ci/praktika/runner.py 的产物发布逻辑中约 L930-L945注册了compress_zstTrue的产物会在上传前显式调用Utils.compress_zst(...)就地转换为 zstd 对象ci/praktika/utils.py 提供该实现产物定义本身见 ci/praktika/artifact.py 中的compress_zst字段。也就是说Praktika 里“小文件明文、大文件 zstd”是两套机制共同的结果阈值触发压缩 显式声明压缩的产物。工具侧的对应实现。.claude/tools/fetch_ci_report.js 的注释明确指向这套机制maybeDecompress约 L52-L60按魔数检测对象级压缩优先用 Node 内置zlib.zstdDecompressSync缺失时回退到zstd -dcq子进程带 2 GiB 缓冲与超时上限防止卡死的 zstd 拖住整个 helper403/404 回退约 L95-L99请求明文 URL 失败且 URL 未以.zst结尾时自动改请求.zst兄弟对象——源码注释同样指向ci/praktika/s3.py的阈值压缩行为。因此文档中“--links的 URL 反映实际 S3 key原样使用即可”这句话等价于URL 是上传时 key 的直接映射客户端不需要再做任何 key 猜测。小结一张速查表场景首选信息源想知道“为什么失败”报告的result.infoReason:段result differsresult.info的 diff stderr.log看完整输出异常 /Server diedclickhouse-server.err.log.zst异常堆栈clickhouse-server.log.zst按时间戳定位超时 / Docker 等基础设施问题job.log手工拼 URL 得到 404追加.zst后请求并用file判别真实编码核心原则一句话先看result.infoURL 一律以--links输出为准压缩扩展名以对象实际状态为准——这套流程与源码中 s3.py 的阈值压缩逻辑、fetch_ci_report.js 的透明解压共同保证了排查的可复现性。若失败属于 integration test 或 stress test 家族则应改用各自的产物布局文档artifacts-integration.md、artifacts-stress.md。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

工业4.0不会取代精益生产:数字化转型的底层逻辑与融合之道

工业4.0不会取代精益生产:数字化转型的底层逻辑与融合之道

2026/9/7 23:52:29

前两年帮一家汽配厂做数字化诊断,对方的CIO跟我说了一句让我印象特别深的话:“我们花了大几百万上MES,结果车间主任跟我说库存反而更乱了。”这不是个案。过去十年我见过太多企业,把工业4.0当成一剂万能药,上了系统、买…

ppt-master 的 AGENTS.md 详解:AI Agent 路由权威、命令速查与仓库执行纪律

ppt-master 的 AGENTS.md 详解:AI Agent 路由权威、命令速查与仓库执行纪律

2026/9/7 23:52:29

ppt-master 的 AGENTS.md 详解:AI Agent 路由权威、命令速查与仓库执行纪律 【免费下载链接】ppt-master AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on d…

网络内容缓存服务器实战:命中率提升与回源合并的关键设计

网络内容缓存服务器实战:命中率提升与回源合并的关键设计

2026/9/7 23:42:28

简介:这是一份北京邮电大学信息工程学院本科毕业设计论文,完整呈现了BitTorrent网络内容缓存服务器的设计与实现过程,适合计算机网络、P2P与CDN方向的学习者作为课题参考。资源为单个doc文档,大小1.53MB,内文包含毕业设…

新闻推荐系统全栈实战:从Selenium爬虫到Hadoop与大模型混合推荐

新闻推荐系统全栈实战:从Selenium爬虫到Hadoop与大模型混合推荐

2026/9/8 1:12:33

如果你最近在做大数据方向的课程设计或者毕设,大概率刷到过“新闻推荐系统”这个题目。热点新闻平台、爬虫、可视化、Hadoop、推荐算法,这几个词叠在一起确实很唬人,尤其是再加上“大模型”之后,几乎是答辩现场的“王炸”配置。但…

构网型逆变器小信号建模与稳定性分析实践

构网型逆变器小信号建模与稳定性分析实践

2026/9/8 1:12:33

1. 项目背景与核心价值构网型逆变器(Grid-Forming Inverter, GFMI)作为新能源发电系统的核心接口设备,其稳定性直接关系到电力系统的可靠运行。传统基于锁相环的跟网型控制策略在弱电网条件下表现不佳,而构网型控制通过模拟同步发电机特性,能…

tkinter网格布局重构:告别魔法数字,写出可维护的grid代码

tkinter网格布局重构:告别魔法数字,写出可维护的grid代码

2026/9/8 1:12:33

写tkinter桌面程序这么久,我最大的体会是:业务逻辑写得再漂亮,布局一团乱也会把整体观感拖下水。尤其是碰到一堆 grid(row4, column2, padx10, pady5) 这种裸奔式的网格调用,表面看程序能跑,等需求一变,真…

COMSOL 5.6瓦斯渗流多物理场耦合建模:从达西定律到工程应用

COMSOL 5.6瓦斯渗流多物理场耦合建模:从达西定律到工程应用

2026/9/8 1:12:33

这段时间我一直在整理自己手里的COMSOL 5.6瓦斯相关模型,起因很简单:项目里反复要处理煤层瓦斯渗流、钻孔抽采、采动影响下的渗透率变化这类问题,每次从头搭模型,结构相似但参数不同,改起来费时还容易出错。后来我把几…

ThinkPHP 6 + Vue 3 打造茶园茶农文化交流平台完整实践

ThinkPHP 6 + Vue 3 打造茶园茶农文化交流平台完整实践

2026/9/8 1:12:33

两年前一个做文旅的朋友找到我,说想给当地茶园和茶农做一个线上交流平台:茶叶资讯、茶文化文章、茶农之间的经验问答,顺带把茶叶和茶具卖起来。当时我脑子里迅速过了一遍技术栈,最后定下的方案就是标题里这套组合——ThinkPHP 6 L…

Cursor:AI代码编辑器的智能协作与实战应用

Cursor:AI代码编辑器的智能协作与实战应用

2026/9/8 1:02:33

1. Cursor:重新定义代码编辑器的智能协作体验第一次听说Cursor时,我以为这不过是又一个VS Code的衍生品。直到真正上手使用后,我才意识到这个"披着编辑器外衣的AI编程助手"正在悄然改变开发者的工作流。作为一款深度整合GPT-4的智能…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/7 3:44:24

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/7 3:38:07

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/4 7:42:10

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/6 23:21:51

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…