尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Flutter 使用 `led` CLI 为 PR 运行 DeviceLab 与 Post-submit 测试的完整指南
Flutter 使用ledCLI 为 PR 运行 DeviceLab 与 Post-submit 测试的完整指南【免费下载链接】flutterFlutter makes it easy and fast to build beautiful apps for mobile and beyond项目地址: https://gitcode.com/GitHub_Trending/flutter41/flutter本篇技术指南围绕 Flutter 仓库中的 Agent 技能文档 .agents/skills/run-devicelab-with-led/SKILL.md 展开讲解如何借助 LUCI 的led命令行工具为某个 Pull Request 重新触发 post-submit 或 DeviceLab 测试例如 PR 合入后看板变红、或需要在合入前对 flaky 测试多跑几轮验证。读完本文你将掌握led get-builder、led edit、led edit-recipe-bundle、led launch组成的完整命令管道的用法、每个参数的含义以及该流程与仓库内 .ci.yaml 构建器定义、dev/bots/README.md 和 dev/devicelab/README.md 之间的对应关系。什么场景需要手动用led跑 DeviceLab 测试官方配套文档 docs/infra/Running-Devicelab-Tests-For-PR.md 给出了两类典型动机PR 已合入但看板变红pre-submit 阶段全部通过但 post-submit提交后构建失败需要手动重新触发对应测试Deflake验证测试稳定性怀疑某个测试是 flaky 的需要把它重复跑几轮确认而不是直接基于一次失败下结论。技能文档 SKILL.md 将其描述为当你被要求 run / launch / try / deflake a post-submit or devicelab test against a PR usingled 时使用本流程。DeviceLab 本身是 Flutter 的物理设备实验室dev/devicelab/README.md 说明任务会按设备类型linux_android、mac_ios、windows_android等分配给空闲设备失败的任务会自动重跑只有当某次重跑成功后该任务才报告成功并标记 flake——这正是手动多跑几次来 deflake这一需求的底层机制。前置条件Prerequisites技能文档列出了三条硬性前置条件在开始执行命令管道之前应逐条验证#前置条件验证方式说明1led工具可用执行led auth-infoled来自 Google 的depot_tools项目必须已安装并在PATH中2SSO 认证有效执行gcertstatus或glogin status凭据过期时需用户执行glogin或gcert重新认证recipes 仓库的 git 操作依赖 SSO 认证3recipes仓库 checkout仅在用到led edit-recipe-bundle时必需从 Flutterrecipes仓库根目录执行命令用于测试本地 recipe 改动或 recipe-only 的 PR执行git clone https://flutter.googlesource.com/recipes获取此外技能文档的头部注释Host assumptions明确要求执行环境还具备已安装且在PATH中的工具led来自 depot_tools、git、gh已完成认证的led、gh、gcert/glogin。同时需注意 dev/bots/README.md 中的通用基建前置使用 Flutter 构建基础设施需要depot_toolsled即随其分发并且 dev/bots/README.md#L54-L79 中Editing a recipe一节的典型 recipe 编辑循环第 4 步与本技能文档给出的是同一条led管道两者互为印证。若led命令失败该文档建议先确认depot_toolscheckout 已是最新。工作流第一步按 PR 类型收集输入执行管道前需收集两个必需参数PR_NUMBER目标 Pull Request 的编号例如123456。它将被拼进 LUCI 的 git ref即refs/pull/PR_NUMBER/head指向 PR 分支的最新提交PRESUBMIT_TEST要运行的 LUCIstaging builder 的精确名称例如Windows_mokey hot_mode_dev_cycle_win__benchmark或Mac_ios microbenchmarks_ios。注意 builder 名称可能包含空格命令中需要整体用引号包住。builder 名称不是凭空指定的——它必须对应 .ci.yaml 中已定义的构建器。以文档示例中的Windows_mokey hot_mode_dev_cycle_win__benchmark为例可在 .ci.yaml#L7615-L7622 中确认其定义# windows mokey benchmark - name: Windows_mokey hot_mode_dev_cycle_win__benchmark recipe: devicelab/devicelab_drone presubmit: false timeout: 60 properties: tags: [devicelab, android, windows, mokey] task_name: hot_mode_dev_cycle_win__benchmark从这段配置可以看出该构建器使用devicelab/devicelab_dronerecipe 在 Windows mokey 机器带 Android 设备的物理机上执行presubmit: false表明它是提交后post-submit而非 PR 检查阶段运行的测试超时 60 分钟实际执行的任务由properties.task_name指定。这也解释了为什么该测试属于post-submit类别、需要借助本流程手动针对 PR 触发。工作流第二步执行led命令管道关于工作目录如果本次执行包含led edit-recipe-bundle且目的是测试本地 recipe 修改必须先cd到本地recipes仓库的根目录再执行管道——led edit-recipe-bundle会把当前工作目录$CWD打包为 recipe bundle 并随构建一起下发。如果只是想针对 PR 跑测试而没有本地 recipe 改动led edit-recipe-bundle这一环可以从 recipes checkout 目录运行也可以从管道中省略。命令管道技能文档给出的标准管道如下将PRESUBMIT_TEST与PR_NUMBER替换为实际值led get-builder luci.flutter.staging:PRESUBMIT_TEST \ | led edit -pa git_refrefs/pull/PR_NUMBER/head \ | led edit -pa git_urlhttps://github.com/flutter/flutter \ | led edit-recipe-bundle \ | led launch各阶段作用解析led get-builder luci.flutter.staging:PRESUBMIT_TEST从 LUCI 的luci.flutter.staging项目bucket中拉取指定 builder 的完整构建定义含 recipe、properties、dependencies 等作为后续编辑的基础。staging bucket 的意义在于它不会污染正式主干流水线专门用于此类针对 PR 的手动触发led edit -pa git_refrefs/pull/PR_NUMBER/head-pa即set property设置构建属性。将待测代码来源覆盖为 PR 分支的最新提交。构建机上会以此 ref 检出代码led edit -pa git_urlhttps://github.com/flutter/flutter将代码来源 URL 覆盖为 framework 仓库。对 framework 的 PR 用上述地址对 engine 仓库的 PR 则应改为 engine 对应的仓库地址dev/bots/README.md#L73-L74 中同样以git_ref/git_url指向intended changes to build的表述说明了这两个属性的含义led edit-recipe-bundle将本地recipescheckout当前目录打包为 recipe bundle使本次构建使用本地修改后的 recipe 而非 LUCI 上已发布的版本。仅在测试本地 recipe 改动时需要led launch提交构建到 LUCI 调度执行。工作流第三步回报已启动任务的信息led launch执行后会输出关于所启动构建的详细信息包括Swarming / LUCI 任务链接。正确的收尾动作是把该 URL 提供给用户以便其跟踪执行进度、查看构建日志。对 DeviceLab 类构建而言日志中还包含任务在物理设备上的执行过程测试最终状态成功 / 失败 / flake 标记则体现在 dev/devicelab/README.md 所描述的自动重跑与结果上报机制中。完整示例为 framework PR 运行Windows_mokey hot_mode_dev_cycle_win__benchmark技能文档给出了一条用户提示 → 具体动作的对照示例用户提示Run the devicelab testWindows_mokey hot_mode_dev_cycle_win__benchmarkfor framework PR 12345 with led.动作运行以下命令若为测试本地 recipe 改动先切换到本地recipes/目录led get-builder luci.flutter.staging:Windows_mokey hot_mode_dev_cycle_win__benchmark \ | led edit -pa git_refrefs/pull/12345/head \ | led edit -pa git_urlhttps://github.com/flutter/flutter \ | led edit-recipe-bundle \ | led launch对照仓库证据可以完整解释这条命令luci.flutter.staging定位 staging 项目中的 builderbuilder 名称与 .ci.yaml#L7615-L7622 中的定义逐字一致git_ref指向 PR 12345 的 head 提交git_url表明被测代码来自 framework 仓库edit-recipe-bundle使本次运行带上本地 recipe 改动若无需验证 recipe 可去掉该行launch将构建下发到devicelab/devicelab_dronerecipe 对应的 Windows Android 物理设备执行。适用前提与限制小结本流程依赖 Google 内部基建LUCI / Swarming / depot_tools 中的led、SSO 认证面向 Flutter 基础设施贡献者普通用户无需也无法执行dev/bots/README.md 亦说明 Flutter 构建看板的重新触发需要特殊权限需提team-infraissue 申请PRESUBMIT_TEST必须是 LUCI staging builder 的精确全名可在 .ci.yamlframework与 engine 侧配置中查找使用led edit-recipe-bundle时工作目录必须是recipes仓库根目录且 recipes 改动应遵循 dev/bots/README.md#L54-L79 的 recipe 编辑规范如recipes.py test train更新期望输出、recipe 需 100% 测试覆盖led执行失败时优先检查depot_tools是否已更新、SSO 凭据gcertstatus/glogin status是否过期。【免费下载链接】flutterFlutter makes it easy and fast to build beautiful apps for mobile and beyond项目地址: https://gitcode.com/GitHub_Trending/flutter41/flutter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

3个月掌握新中地GIS系统:从数据处理到二次开发全攻略

3个月掌握新中地GIS系统:从数据处理到二次开发全攻略

1. 新中地系统学习3个月能实现什么效果?第一次接触新中地系统是在去年帮朋友解决一个GIS项目时。当时看到他用这个国产GIS平台处理空间数据的速度和稳定性,完全颠覆了我对国产地理信息软件的认知。经过3个月的集中学习和实战,我发现这套系统远…

📅 2026/9/15 7:33:43
城市轨道交通站台门运行模式全解析:从三级控制到安全兜底

城市轨道交通站台门运行模式全解析:从三级控制到安全兜底

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/23 19:47:35
WinRAR右键无压缩选项?从设置到注册表全修复指南

WinRAR右键无压缩选项?从设置到注册表全修复指南

昨天下午一个同事抱着笔记本过来,说装了WinRAR,右键却没有压缩选项,折腾了一中午重装了两遍,还是老样子。我过去看了一眼,打开WinRAR设置,勾了个选项,再右键一刷新,压缩解压菜单齐了…

📅 2026/9/14 20:15:59
MORE NEWS

更多资讯

📰

ClaudeCode不是多AI拼接,而是CLI驱动的任务流协同架构

1. 不是“多个Agent拼在一起”,而是任务流驱动的协同架构 很多人第一次听说ClaudeCode的多智能体协同,第一反应是:“哦,就是让几个AI模型一起干活呗?”——这种理解看似合理,实则完全偏离了它的设计本质。我…

📰

Java选文件夹避坑指南:JFileChooser目录模式与Windows原生对话框对比

1. 从“选文件夹”这个动作说起:为什么Java里没有现成的答案做Java桌面工具的人迟早会撞上同一个需求:让用户挑一个文件夹,而不是挑一个文件。听起来像是文件选择器的一个小分支,实际动手才发现,JFileChooser默认的交互…

📰

MySQL存储引擎InnoDB与MyISAM深度对比及优化实践

1. MySQL存储引擎深度对比:InnoDB与MyISAM实战解析在数据库选型时,存储引擎的选择直接影响系统性能和可靠性。作为MySQL最常用的两种存储引擎,InnoDB和MyISAM的设计差异值得每位开发者深入理解。1.1 核心架构差异与适用场景InnoDB采用现代数据…

📰

Matlab质点弹道仿真:龙格-库塔法求解与落点坐标变换

简介:这份资源面向学习外弹道仿真与数值计算的学生和工程人员,围绕质点弹道模型给出可运行的Matlab实现,用于求解炮弹在阻力、重力与科氏力共同作用下的运动轨迹。压缩包共1个docx文件,约72KB,以文档形式整理模型推导、…

📰

Java 11嵌套访问控制机制解析与优化

1. 嵌套访问控制的前世今生Java作为一门成熟的面向对象语言,其访问控制机制一直是开发者必须掌握的核心概念。在Java 11之前,嵌套类(包括内部类、静态嵌套类、局部类和匿名类)之间的private成员访问机制存在一个有趣的"语言特…

📰

大数据处理中数据清洗的关键技术与实践

1. 数据清洗为何成为大数据处理的关键环节 去年处理某电商平台用户行为数据时,我遇到了一个典型场景:原始日志中23%的点击事件缺少用户ID,15%的时间戳格式混乱,还有7%的数值字段存在明显异常值。这直接导致初期构建的用户画像模型…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬