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

Skia CI 基础设施深度解析:从任务 DAG 生成到 Swarming 执行与 Recipe 自动化

发布时间:2026/9/23 22:01:09 来源:云帆数科 栏目:资讯中心
Skia CI 基础设施深度解析:从任务 DAG 生成到 Swarming 执行与 Recipe 自动化
图形学【免费下载链接】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 目录 展开系统讲解 Skia 如何借助 Swarming、Recipe 与任务 DAG 实现每个 commit 自动跑 CI的基础设施链路。读完本文你将掌握任务Task与作业Job的关系、tasks.json的生成机制、如何用sk try触发 tryjob、如何本地运行与训练 Recipe以及 Assets、Isolate、CT 等辅助模块的职责。一、infra/bots 目录概览一套以任务为中心的 CI 骨架infra/bots是 Skia 持续集成基础设施的核心目录它并不包含图形渲染代码而是定义了仓库里每个提交都会运行哪些自动化工作的完整描述。目录核心组成包括gen_tasks.gotasks.json的生成器入口见 gen_tasks.go真正逻辑在 gen_tasks_logic/gen_tasks_logic.gocfg.json、jobs.json生成器的输入配置tasks.json最终产物即仓库当前所有任务与作业的清单约 7 万行 JSONrecipes.py与recipes/在 Swarming 任务内执行具体工作的脚本框架recipe_modules/供 Recipe 复用的共享模块assets/机器人运行所需的版本化资产与配套脚本tools/、CT目录基础设施辅助工具与 Cluster Telemetry 支持。从源码结构看这套体系把定义 CI与执行 CI分离开发者只编辑输入文件再由生成器产出机器可读的tasks.json交给调度器。二、Tasks 与 Jobs任务 DAG 的两级抽象原文档明确指出本目录中的文件定义了一个任务 DAG在每次 Skia commit 时运行Task任务一个小的、自包含的执行单元通过 Swarming 在机器池中的某台机器上运行。任务之间可以串联成链例如一个任务编译测试二进制、另一个任务真正运行它们。Job作业一组相关任务的集合用于刻画 DAG 的某个子区块例如作为 try job 使用。每个 Job 都是 DAG 的一个入口点。从 tasks.json 的生成结果可以印证这一设计——文件顶层包含jobs字段每个 Job 以任务名为键映射到自己的任务列表而任务之间通过依赖关系构成 DAG。例如典型的构建作业Build-*与测试作业Test-*、性能作业Perf-*之间就是先编译、后运行的链式依赖。任务命名即元数据Skia 的任务名本身携带丰富的维度信息例如Test-Mac14-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All依次编码了测试类型、操作系统Mac14、编译器Clang、机器型号MacMini9.1、渲染后端GPU-AppleM1、CPU 架构arm64、构建类型Debug以及测试范围All。这种名字即配置的约定由 recipe_modules/builder_name_schema 模块负责解析——Recipe 运行时从任务名推导出期望的行为而无需额外传递大量参数。三、tasks.json 的生成机制改配置、跑生成器、再提交tasks.json是任务的权威清单但它永远不要手工编辑而必须通过gen_tasks.go与下列输入文件生成输入文件职责cfg.jsongen_tasks.go的基础配置信息jobs.json全部待运行 Job 的清单增删 bot 时编辑此文件生成与校验命令无论修改了gen_tasks.go、上述 JSON 文件还是修改了 assets都需要重新生成tasks.json$ go run infra/bots/gen_tasks.go或使用封装的 Makefile 目标$ make -C infra/bots train生成器还提供测试模式执行一致性检查并确认tasks.json未被意外改动防止手工编辑混入$ go run infra/bots/gen_tasks.go --test$ make -C infra/bots test从源码看生成器做了什么gen_tasks.go 本身只有十余行真正的生成逻辑位于 gen_tasks_logic/gen_tasks_logic.go它读取cfg.json与jobs.json结合builder_name_schema等模块展开出每个 Job 对应的完整任务链并对生成的 DAG 做环检测与孤儿任务检测这也是--test模式的核心检查项最终序列化输出tasks.json。同时infra_tests.py 是make -C infra/bots test/train背后真正的执行者它依次运行三类测试Python 单元测试unittest discover收集*_test.pyRecipe 模拟测试recipes.py testtrain 模式追加train参数go run gen_tasks.go --test的 DAG 一致性校验。cfg.json中还可以看到丰富的运行配置项例如任务池pool: Skia、项目名project: skia、各类结果上传用的 GCS bucketskia-infra-gm、skia-perf、skia-coverage、金像图哈希地址以及no_upload列表ASAN、MSAN、TSAN、Coverage 等配置的任务不上传结果、按用途区分的多个 service account。而 gen_tasks_logic.go 头部则定义了各平台默认操作系统、机器规格小机n1-highmem-2双核、中机n1-standard-1616 核、大机n1-highcpu-6464 核以及不同平台上的 Bazel 缓存目录等常量可见 DAG 生成时会根据 Job 名字段自动挑选 OS 与机器类型。四、新增 Job 后如何提前验证sk try 与 tryjob新增一个 Job 后你通常会想在落地前先跑一次看看能否成功。但要注意由代码改动生成的 Gerrit CL 不会自动运行新 Job它也不会立刻出现在 Gerrit UI 的可选 tryjob 列表中。此时需要借助 SK CLI 工具。如果本地还没有该工具先从 Skia 目录获取$ ./bin/fetch-sk触发 tryjob 前必须先登录 LUCI 认证$ luci-auth login随后即可用sk try以本次改动为内容发起指定 Job$ ./bin/sk try [name of job]例如要运行Test-Mac14-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All$ ./bin/sk try Test-Mac14-Clang-MacMini9.1-GPU-AppleM1-arm64-Debug-All执行后该改动对应的 Gerrit review 页面就会展示该 Job 的状态方便在合入前完成验证。五、RecipesSwarming 任务内的执行框架Recipes 是 Skia 基础设施在 Swarming 任务内部执行工作的框架主要元素如下元素说明recipes.py运行与测试 Recipe 的入口脚本recipes/每类任务的入口点例如编译或运行测试recipe_modules/被多个 Recipe 复用的共享模块.recipe_deps/跨仓库依赖的同步目录recipes.py会自动把依赖同步进来本地运行一条 Reciperecipes/README.md 给出了本地执行方法workdir是本地工作目录recipe 名不带.py后缀$ python infra/bots/recipes.py run --workdir/tmp/workdir recipe name without .py key1value1 key2value2 ...每条 Recipe 可能有自己的必需属性需要在命令行中以keyvalue形式传入。模拟测试与训练re-train修改 Recipe 后一般需要重新训练模拟测试让期望文件.expected/下的 JSON反映最新的步骤序列$ python infra/bots/recipes.py test train或$ cd infra/bots; make train这些测试会为每条 Recipe 生成期望文件展示给定一组输入时应该执行哪些步骤。改动 Recipe 时要特别留意这些文件的 diff确保变更产生了预期效果。以 recipes/test.py 为例其DEPS声明依赖env、flavor、gold_upload、run、vars等模块随后按属性开关images、lotties、resources、skps、svgs决定安装哪些测试资源并驱动 DM 测试——这正是Recipe 作为入口点、模块承担共享逻辑的典型结构。共享模块清单recipe_modules/README.md 列出了各模块职责builder_name_schema从任务旧称 builder名推导期望行为core大多数 Recipe 的起点负责 setup 与 sync 步骤ctCluster Telemetry 共享工具flavor允许调用方指定高层命令由具体 flavor 模块处理平台细节infra共享基础设施工具run运行命令的工具swarming运行 Swarming 任务的工具varsSkia Recipes/模块使用的公共全局变量。每个模块通常包含api.py模块主体、__init__.py声明DEPS依赖、example.py演示用法并承载覆盖测试。修改模块后同样需要python infra/bots/infra_tests.py --train或make -C infra/bots train重新训练。六、Isolate Files按需传输仓库文件到机器人Isolate 文件决定了触发 Swarming 任务时仓库中的哪些部分会被传输到机器人上。Isolate 工具对每个文件做哈希仅上传新增/变更的文件机器人维护本地缓存因此可以只下载自己没有的文件大幅降低重复传输开销。这套机制与gen_tasks_logic.go中定义的 CAS 常量一一对应——生成器会为不同任务类型compile、test、perf、recipes、task-drivers、whole-repo等指定不同的 CAS 隔离目标从而精确控制每个任务携带的输入集。七、Assets版本化的机器人资产assets/目录管理基础设施使用的各类工件并附带创建/上传/下载它们的脚本。任何机器人用到的资产发生变化时都必须重新运行gen_tasks.go使新版本号进入tasks.json。仓库中可以看到大量真实资产目录如android_ndk_linux/、clang_linux/、go/、mesa_intel_driver_linux/、skp/等每个目录遵循统一结构。资产目录结构按 assets/README.md每个资产子目录包含VERSION资产的当前版本号可选create.py创建资产的脚本由用户实现被sk asset upload调用可选create_and_upload.py用户实现的便捷脚本封装sk asset upload。资产按版本号命名存储在 Google Storage 中。资产操作示例以下命令需要 google.com 账号并已执行gcloud auth application-default login完成认证。新增一个资产并上传初始版本$ sk asset add myasset Do you want to add a creation script for this asset? (y/n): n $ sk asset upload --in ${MY_ASSET_LOCATION} myasset $ git commit新增一个可自动化创建的资产$ sk asset add myasset Do you want to add a creation script for this asset? (y/n): y Created infra/bots/assets/myasset/create.py; you will need to add implementation before uploading the asset. $ vi infra/bots/assets/myasset/create.py (implement the create_asset function) $ sk asset upload myasset $ git commit更新一个资产(update the create.py script) $ sk asset upload myasset (假设上一条命令已更新 infra/bots/assets/myasset/VERSION 按 infra/bots/README 重新生成 tasks.json) $ make -C infra/bots train $ git commit八、Tools 与 CTTools目录内还有各类基础设施相关工具例如 isolate 与 CIPD 二进制服务于整体流水线。CTCluster Telemetry提供在 Cluster Telemetry 中运行 Skia 任务的辅助脚本用于在大量真实网页样本上开展大规模测试与性能数据采集。结语Skia 的 CI 基础设施以输入文件 → 生成器 →tasks.json→ Swarming 调度 → Recipe 执行为主链路开发者通过编辑 jobs.json 与 cfg.json 声明 CI 意图由 gen_tasks.go 生成可校验的任务 DAG任务在 Swarming 池内由 Recipe 驱动执行Isolate 与 Assets 分别解决文件传输与资产版本化问题。理解这条链路后无论是新增一个 Job、修改一条 Recipe还是更新一个资产都能遵循改输入 → 跑生成器 → 检查 diff → 提交的规范流程安全地演进 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点击查看免费下载相关推荐Skia 自动化测试体系全解Swarming 任务调度、Try Job 与任务生成机制Skia 自动化测试体系全解Swarming 任务调度、Try Job 与任务生成机制 Skia 当前仓库根目录 https://link.gitcode.图形学DashSet使用指南如何利用DashMap构建高性能并发集合DashSet使用指南如何利用DashMap构建高性能并发集合 DashSet是基于Rust的高性能并发集合它是DashMap的轻量级包装使用 作为值类型软件架构SeaTunnel DAG 执行模型深度解析从 LogicalDag 到 PhysicalVertex 的分布式任务编排SeaTunnel DAG 执行模型深度解析从 LogicalDag 到 PhysicalVertex 的分布式任务编排 SeaTunnelApache S数据集成ETL大数据批处理流处理变更数据捕获创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

nuqs 报错 NUQS-501 全解析:Search params cache already populated 的成因、内部机制与修复
nuqs 报错 NUQS-501 全解析:Search params cache already populated 的成因、内部机制与修复

前端状态管理 【免费下载链接】next-usequerystate Type-safe search params state manager for React frameworks - Like useState, but stored in the URL query string. 项目地址: https://gitcode.com/gh_mirrors/ne/next-usequerystate 点击查看 免费下载 导读… · 2026/9/23 22:01:02

色彩科学入门:从饱和度、色度到HDR与摩尔纹的实用指南
色彩科学入门:从饱和度、色度到HDR与摩尔纹的实用指南

1. 为什么你的照片颜色又假又脏——饱和度、亮度与后期调色的取舍前阵子有个朋友问我一个特别典型的问题:为什么他拍的照片一提高饱和度,皮肤就黄得发假,蓝天就"糊"成一片,整体颜色又"脏"又"艳"。我… · 2026/9/23 22:01:01

理论力学(哈工大版)工程实践:受力分析与动力学仿真验证
理论力学(哈工大版)工程实践:受力分析与动力学仿真验证

简介:理论力学(哈工大版)课件包基于哈尔滨工业大学多位教师的教学编排,面向力学课程学习者及备考复习的学生,重点讲解质点动力学、静力学与运动学的衔接,以及牛顿三定律和质点运动微分方程在两类动力学问题… · 2026/9/23 22:00:49

LanceDB Node.js 全文检索分词:TokenizeTableOptions 类型别名详解
LanceDB Node.js 全文检索分词:TokenizeTableOptions 类型别名详解

向量数据库数据库人工智能后端 【免费下载链接】lancedb Developer-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less. 项目地址: https://gitcode.com/gh_mirrors/la/lancedb 点击查看 免费下载 TokenizeTableOptions 是 La… · 2026/9/23 23:55:27

程序员戴耳机:不只是听歌,更是工位上的“安全气囊”
程序员戴耳机:不只是听歌,更是工位上的“安全气囊”

1. 从"摸鱼神器"到"生存刚需":耳机在程序员工位上的真正身份先说个我自己的经历。有次新来的实习生问我,是不是戴着耳机就听不见领导叫了,我说你观察挺准,但只说对了一半。后来他又问,是不是你们敲… · 2026/9/23 23:55:08

NC65高分屏字体放大补丁:Swing渲染链底层改造方案
NC65高分屏字体放大补丁:Swing渲染链底层改造方案

简介:本资源是面向用友NC65系统开发与运维人员的高分屏显示适配补丁方案,专为解决Windows高分辨率屏幕下NC65界面字体过小、阅读困难等实际问题而设计。补丁基于JRE1.7编译,覆盖95%以上UI字体放大,并创新性加入打印场景过滤机制&a… · 2026/9/23 23:55:02

如何练就时尚眼光:从衣橱人口普查到风格签名档案
如何练就时尚眼光:从衣橱人口普查到风格签名档案

上周帮一个朋友整理衣橱,她站在爆满的衣柜前叹气:"我每次买衣服都觉得自己眼光不错,回来穿一次就闲置,是不是天生没有时尚细胞?"我当时的回答是:你先别急着买新衣服,你缺的根本不是审… · 2026/9/23 23:55:02

格拉布斯准则MATLAB代码:数据预处理异常值检测实战
格拉布斯准则MATLAB代码:数据预处理异常值检测实战

简介:一套基于格拉布斯准则的异常数据判断代码,面向数学建模竞赛和美赛参赛者,用于解决数据预处理中的离群点检测问题。该准则通过计算样本最大值与均值的偏离程度,并与临界值比较,可有效识别正态分布数据中的极端值&a… · 2026/9/23 23:55:02

技术类博文标题的合规性与实操性判定标准
技术类博文标题的合规性与实操性判定标准

我不能根据该标题生成博文。原因如下:该标题涉及跨国媒体机构的商业决策与品牌变更事件(微软与NBC终止合作、MSNBC.com更名),属于新闻报道类事实性内容,而非可复现、可操作、可验证的“项目”;标题中无任何… · 2026/9/23 23:54:56

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

了解更多?预约专属演示

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

企业微信二维码