首页/新闻资讯/正文详情

用 Miller 与 jq 挖掘 Skia CI 测试盲区:jobs.json 任务矩阵分析实战

发布时间:2026/9/23 13:41:47 来源:云帆数科 栏目:资讯中心
用 Miller 与 jq 挖掘 Skia CI 测试盲区:jobs.json 任务矩阵分析实战
用 Miller 与 jq 挖掘 Skia CI 测试盲区jobs.json 任务矩阵分析实战【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址: https://gitcode.com/gh_mirrors/ski/skia本篇文章围绕 Skia 仓库 infra/bots/analysis/README.md 所描述的 Job Analysis 工具集展开讲解如何基于jobs.json任务清单做测试覆盖率审计——找出哪些 CPU/GPU 设备上还没有跑 Perf性能测试、Test功能测试或 Vulkan 相关测试。读完本文你将掌握make missing_perf_jobs等现成命令的用法理解create-alljobs.sh、axis.sh、missing.sh三个脚本背后的数据管道并能够自行编写 Miller DSL 过滤器把 Skia 庞大的 CI 任务矩阵变成可查询、可审计的结构化数据。背景为什么要分析 jobs.jsonSkia 是一个跨平台的 2D 图形库其持续集成CI会为数十种操作系统、编译器、CPU 与 GPU 组合生成成百上千个构建、测试与性能任务。这些任务的完整清单被固化在 infra/bots/jobs.json 中当前仓库内共包含 770 个任务条目。任务的命名遵循约定俗成的分段式结构例如Perf-Android-Clang-GalaxyS20-GPU-MaliG77-arm64-Release-All-Android_Vulkan任务名用-分隔出Type、os、compiler、model、cpu_or_gpu、cpu_or_gpu_value、arch、configuration、test_filter、extra等字段。从源码结构看这份 JSON 由 infra/bots/gen_tasks_logic/gen_tasks_logic.go 中的JobInfo结构体定义格式Name与可选的cq_config并可通过 infra/bots/format_jobs_json/format_jobs_json.go 进行格式化排序。问题在于CI 矩阵越来越大之后仅凭肉眼浏览 JSON 根本无法判断某块 GPU 是否同时被 Test 与 Perf 任务覆盖Vulkan 路径是否在每一块 GPU 上都验证过。Job Analysis 工具集正是为此而生——它把任务名解析成 CSV 表格再用 Millermlr对列做集合运算找出应该覆盖却尚未覆盖的测试盲区。环境要求与安装要运行这套脚本机器上需要安装两个命令行工具jqJSON 解析器用于从jobs.json中抽取任务名。mlrMiller类 awk/sed 的 CSV/JSON 数据处理工具本套脚本的核心引擎负责过滤、排序、去重与 join。在 Debian/Ubuntu 系系统上安装$ sudo apt install jq millerMiller 的完整查询语法见其官方 DSL 参考文档README 原文指向https://miller.readthedocs.io/en/latest/reference-dsl.html本文后续会给出可直接套用的写法。其余发行版可自行使用对应的包管理器安装jq与miller。快速上手Makefile 提供的现成查询infra/bots/analysis/Makefile 封装了三个最常用的分析目标。以文档中的核心示例为例找出当前没有跑 Perf 性能测试的所有 cpu_or_gpu_value$ make missing_perf_jobs对应的 Makefile 定义是missing_perf_jobs: ./missing.sh $$Type Perf这里的$$Type在 make 展开后变成$Type即传给missing.sh的 Miller 过滤器字符串——它的语义是筛选出所有 Type 列等于 Perf 的任务。同理还有两个内置目标Make 目标过滤器分析目的missing_perf_jobs$Type Perf找出未跑 Perf 性能测试的 CPU/GPUmissing_test_jobs$Type Test找出未跑 Test 功能测试的 CPU/GPUmissing_vulkan_jobs$vulkan true找出未用 Vulkan 后端跑过测试的 CPU/GPU数据管道拆解三个脚本如何协作整个分析流程分为三步对应 infra/bots/analysis 目录下的三个 shell 脚本。理解这条管道你就能任意定制自己的查询。第一步create-alljobs.sh——把 jobs.json 变成 CSVinfra/bots/analysis/create-alljobs.sh 负责生成中间文件/tmp/alljobs.csv。其核心逻辑分四段1. 写入表头。固定字段顺序为echo Type,os,compiler,model,cpu_or_gpu,cpu_or_gpu_value,arch,configuration,test_filter,extra /tmp/alljobs.csv2. 解析任务名。用 jq 取出所有任务的name字段只保留以Perf或Test开头的行grep ^[Perf|Test]然后用两次 sed 把-替换为,、把行尾的All规范化为All,nonecat ../jobs.json | jq .[] -r | grep ^[Perf|Test] | sed s#-#,#g | sed s#All\$#All,none#g /tmp/alljobs.csv注意这里相对analysis/目录引用了../jobs.json即仓库根目录下的 infra/bots/jobs.json。sed 两次替换的用意是保证test_filter与extra两列始终有值避免后续 CSV 解析出现空字段。3. 派生布尔列。基于extra列是否匹配特定子串用 Miller 的put语句新增vulkan与metal两列mlr --csv -I put $vulkan$extra ~ Vulkan /tmp/alljobs.csv mlr --csv -I put $metal$extra ~ Metal /tmp/alljobs.csv这一步非常关键Android_Vulkan、Graphite_Native_Vulkan这类任务名中的后端信息都藏在extra列里派生布尔列之后就可以直接写$vulkan true这样的过滤器。4. 校验输出。最后用mlr --icsv check验证生成的文件是合法 CSV。第二步axis.sh——提取某一列的取值全集infra/bots/analysis/axis.sh 的职责是给定一列或逗号分隔的多列生成该列所有唯一取值的 CSV输出文件以列名命名放在/tmp下mlr --csv uniq -f $1 /tmp/alljobs.csv | mlr --csv sort -f $1 /tmp/$1.csv例如./axis.sh cpu_or_gpu_value,model会得到/tmp/cpu_or_gpu_value,model.csv其中每一行是一个设备值 机型的组合且已按列排序。这份文件在后面充当全量对照表凡是出现在这张表里、却不在特定过滤器如 Vulkan任务集合中的设备就是测试盲区候选。第三步missing.sh——集合差运算找出盲区infra/bots/analysis/missing.sh 是查询的最终执行者接受一个 Miller 布尔过滤器作为唯一参数。整个管道如下mlr --csv filter ${FILTER} /tmp/alljobs.csv | \ mlr --csv cut -f cpu_or_gpu_value,model | \ mlr --csv sort -f cpu_or_gpu_value | \ mlr --csv uniq -f cpu_or_gpu_value | \ mlr --csv join -f /tmp/cpu_or_gpu_value,model.csv -j cpu_or_gpu_value --ul --np一步步拆解filter ${FILTER}从全量任务表中筛出符合条件的行例如所有 Vulkan 任务cut -f cpu_or_gpu_value,model只保留设备值与机型两列sort -f cpu_or_gpu_value按设备值排序为后续 join 做准备uniq -f cpu_or_gpu_value去掉重复的设备值得到已覆盖设备的集合join -f /tmp/cpu_or_gpu_value,model.csv -j cpu_or_gpu_value --ul --np与全量对照表做连接——--np表示不打印匹配上的行--ul表示只输出左表全量表中未被匹配的行。最终输出的正是全量设备清单中存在、却没有任何符合过滤条件的任务去跑的设备列表。脚本还做了防御性检查参数个数必须为 1否则打印用法示例并退出set -e保证中途任何一步失败都会立即终止不会产生半截结果。自定义查询从 Make 目标到任意 Miller DSL掌握了管道结构后你可以绕过 Makefile直接调用missing.sh并传入任意布尔过滤器例如# 找出所有没有跑 Metal 后端测试的设备 $ ./missing.sh $metal true # 找出 Release 配置下缺失的测试 $ ./missing.sh $Type Test $configuration Release也可以先手工生成/tmp/alljobs.csv并用 mlr 做探索式分析。比如查看当前所有任务覆盖了哪些 GPU 值、各设备上分别跑了哪些额外配置$ ./create-alljobs.sh $ mlr --csv cut -f cpu_or_gpu_value,extra /tmp/alljobs.csv | mlr --csv uniq -f cpu_or_gpu_value,extra需要提醒的是missing.sh依赖/tmp/alljobs.csv已存在脚本内部会主动调用./create-alljobs.sh确保数据就绪因此直接运行 Make 目标或missing.sh时无需手动先执行创建步骤。另外这类脚本在仓库中是只读分析工具运行它们不会修改仓库内容只会在/tmp下生成中间产物。局限性与注意事项约定优于配置脚本高度依赖任务命名规范-分隔、Perf/Test前缀、All结尾若未来任务命名约定变化create-alljobs.sh中的 sed 解析逻辑需要同步调整CPU/GPU 映射关系cpu_or_gpu_value与具体机型/后端的对应关系定义在 infra/bots/gen_tasks_logic/gen_tasks_logic.go如 GPU 型号到 Swarming 机器维度的映射分析结果需结合该映射理解某设备的真实含义数据源时效性jobs.json是当前分支的任务快照本仓库内有 770 个条目分析出的盲区可能因为任务名带_NoGPU等后缀、或有意为之的抽样策略而存在误报属于辅助审计手段而非绝对结论。小结Skia 的 Job Analysis 工具集用命名解析 CSV 化 集合差三个朴素步骤解决了大规模 CI 矩阵的覆盖率审计难题。其核心方法论——把结构化任务清单转成可查询表格再用--ul --np的 join 技巧找出应有却未有的组合——同样适用于任何以命名约定驱动的测试任务清单。从make missing_perf_jobs出发配合 Miller DSL你可以为 Skia 的测试矩阵建立持续的、可脚本化的健康检查。【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions.项目地址: https://gitcode.com/gh_mirrors/ski/skia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

C#项目目录结构对比与.csproj一致性验证
C#项目目录结构对比与.csproj一致性验证

简介:这是一份面向IT运维、开发及系统管理员的轻量级文件夹结构对比工具,解决多场景下目录一致性快速校验问题,如代码版本比对、备份完整性验证、跨设备同步检查等。资源为C#编写的Windows桌面程序,共22个文件,包含6个… · 2026/9/23 13:41:47

职业发展三阶段学习:05-07模块解析与实践
职业发展三阶段学习:05-07模块解析与实践

1. 项目概述"智榜样三阶段05-07"听起来像是一个专业培训或学习项目的特定阶段。作为参加过多个职业发展课程的老学员,我理解这类项目通常包含系统化的知识体系和实操训练。05-07这三个编号可能代表连续的三个学习模块,或是项目中的特定里程碑节… · 2026/9/23 13:41:40

从0到1自建DeskcommCRM:客户关系管理与工单系统实战
从0到1自建DeskcommCRM:客户关系管理与工单系统实战

接手客服团队的第一周,我就发现一个要命的问题:客户的聊天记录散在三处,邮件在邮箱里,电话总结记在共享表格里,售后问题躺在另一个群里。想了解一个老客户的历史,得翻半小时记录还不一定找得全。当时我脑子… · 2026/9/23 13:41:33

Prisma API 详解:基于数据模型自动生成的 GraphQL 接口与 Playground 探索指南
Prisma API 详解:基于数据模型自动生成的 GraphQL 接口与 Playground 探索指南

后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 本篇指南聚焦 Prisma&… · 2026/9/23 14:30:48

Nginx UI 集成 Casdoor:OAuth 2.0 统一身份认证接入指南
Nginx UI 集成 Casdoor:OAuth 2.0 统一身份认证接入指南

Nginx UI 集成 Casdoor:OAuth 2.0 统一身份认证接入指南 【免费下载链接】nginx-ui Yet another WebUI for Nginx 项目地址: https://gitcode.com/gh_mirrors/ngi/nginx-ui 本篇技术指南围绕 Nginx UI 的 Casdoor 认证提供方配置展开,完整讲解 En… · 2026/9/23 14:30:47

PaddleHub VGG11_ImageNet 图像分类模块实战指南:安装、命令行与 Python API 预测全解析
PaddleHub VGG11_ImageNet 图像分类模块实战指南:安装、命令行与 Python API 预测全解析

PaddleHub VGG11_ImageNet 图像分类模块实战指南:安装、命令行与 Python API 预测全解析 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.c… · 2026/9/23 14:30:39

Apache DolphinScheduler 注册中心(Registry)SPI 扩展指南:插件配置、源码原理与自定义实现
Apache DolphinScheduler 注册中心(Registry)SPI 扩展指南:插件配置、源码原理与自定义实现

Apache DolphinScheduler 注册中心(Registry)SPI 扩展指南:插件配置、源码原理与自定义实现 【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance work… · 2026/9/23 14:30:32

3个微信内测版实战技巧,面试必问的API坑点全解析
3个微信内测版实战技巧,面试必问的API坑点全解析

3个微信内测版实战技巧,面试必问的API坑点全解析 版本刚更新,后端接口直接报错,前端回调逻辑全乱。这种 版本升级后 API 全变了… · 2026/9/23 14:30:25

风冷发动机散热仿真优化实战与Ansys应用
风冷发动机散热仿真优化实战与Ansys应用

1. 项目概述:风冷发动机散热仿真实战作为一名长期从事热仿真分析的工程师,我最近完成了一个很有意思的风冷摩托车发动机散热优化项目。这类发动机依靠空气流动带走热量,金属散热片的设计直接决定了散热效率。通过Ansys Workbench平台&#xf… · 2026/9/23 14:30:25

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码