ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

NemoClaw CI 故障分类指南:用有界日志与校验产物定位 GitHub Actions 失败根因

2026/9/20 8:09:10 拓冰建站 浏览量
NemoClaw CI 故障分类指南:用有界日志与校验产物定位 GitHub Actions 失败根因 NemoClaw CI 故障分类指南用有界日志与校验产物定位 GitHub Actions 失败根因【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw本指南讲解 NemoClaw 维护者技能 nemoclaw-maintainer-classify-ci-failure 的使用方法如何从任意 NemoClaw 检出目录调用classify-ci-failure.mts对单个失败的 GitHub Actions job 完成分类。你将掌握命令行参数与输出 JSON 结构、日志的有界截取与敏感信息脱敏机制、产物artifact的严格校验式读取流程以及分类器围绕可信子进程边界构建的安全模型从而把一次 CI 失败快速收敛为可执行的修复建议。技能定位一次 job、一份有界证据、一组分类结论该技能面向 NemoClaw 维护流程中的高频场景GitHub Actions 上某个 job 失败需要在不扩散权限、不泄露密钥、不执行可疑内容的前提下判定失败类型并给出下一步动作。其核心设计目标有三点只读不写脚本全程只使用经过认证的gh读取 GitHub 数据不执行任何 GitHub 写操作有界有据日志、产物、分页、压缩/解压体积、条目数、路径数、文件读取数全部有上限输出保持可审计安全边界清晰产物仅作为数据解析、绝不执行外部命令仅限固定路径的 Bash 与 GNU coreutilsgh只允许在受信目录中解析。技能元数据定义在 agents/openai.yaml其默认提示词将该技能描述为“从有界证据中分类一个失败的 GitHub Actions job”并可由用户显式调用user_invocable: true。快速开始运行分类器在任意 NemoClaw 检出目录下直接运行示例 job id 为占位符请替换为真实值node --no-warnings \ .agents/skills/nemoclaw-maintainer-classify-ci-failure/scripts/classify-ci-failure.mts \ --workdir $PWD --job-id job-id脚本入口是 classify-ci-failure.mts直接执行时解析process.argv并以 JSON 形式输出分类结果成功路径输出JSON.stringify(..., null, 2)任何失败路径都会以非零退出码结束并在 stderr 输出一条有界、脱敏的诊断信息。命令行参数参数必填说明默认值--workdir否NemoClaw 检出目录子进程的工作目录当前工作目录process.cwd()--job-id是正整数形式的 GitHub Actions job ID无--artifact-name否需要额外检视的 GitHub Actions 产物名称不读取产物--max-lines否返回日志的最大行数取值1500的整数120--clip-mode否截断方向head保留开头或tail保留结尾tail从参数解析实现classify-ci-failure.mts可以看到若干硬性校验参数必须以--name value成对出现、不允许重复选项、未知选项直接报错仓库被固定为NVIDIA/NemoClawjobId必须是^\\d$且不能为0artifactName必须与自身 trim 后完全一致且只允许[A-Za-z0-9_. -]{1,200}字符集。--max-lines的正则校验同样只放行 1500 的整数。运行环境前提分类器要求运行在满足以下条件的 Linux NemoClaw 检出中classifyCiFailure入口会首先检查process.platform ! linux并直接抛错Node.js 22.19 或更高版本使用node --no-warnings启动/proc文件系统用于进程组监控Bash以及 GNU coreutils 中的dd、stat、tail、wc按固定绝对路径调用已认证的gh且必须位于受信目录见下文安全边界。分类工作流元数据 → 日志 → 产物 → 结论分类器在 classifyCiFailureWithRuntime 中按固定顺序执行四步读取 job 元数据gh api repos/NVIDIA/NemoClaw/actions/jobs/job-id得到 job 名称、run_id、状态与结论用于后续产物清单定位有界拉取 job 日志将日志经tail -c 4000000截取到私有临时目录再tail -n 20000二次收敛随后按“NemoClaw CI 失败特征签名”正则筛出关键行及其上下文可选校验式读取产物当传入--artifact-name时分页枚举该 run 的产物清单、按元数据体积精确下载 ZIP、经严格解析后提取*.result.json失败记录分类并输出基于日志文本与产物中的进程信号/超时/退出码证据产出findings、categories与nextActions最终返回 JSON。输出 JSON 结构成功或部分成功路径返回的结构包含以下顶层字段{ jobId: 123, repo: NVIDIA/NemoClaw, job: { id: 123, runId: 456, name: CLI tests, status: completed, conclusion: failure, url: ... }, result: classified | unclassified | log-error, categories: [test-failure], findings: [{ type: test-failure, detail: ..., suggestion: ... }], nextActions: [...], artifact: null, log: { jobId: 123, repo: NVIDIA/NemoClaw, pattern: NemoClaw CI failure signatures, code: 0, truncated: false, truncationNotice: null, truncationReasons: [], clipMode: tail, maxLines: 120, selectedLines: 83, returnedLines: 83, omittedLines: 0, matchedLines: 6, stdout: ..., stderr: } }result的取值语义有发现时为classified日志正常获取但没有命中任何已知签名时为unclassified日志获取本身失败时log.code ! 0为log-error此时只返回 job 与 log 字段不产生分类结论。注意技能对unclassified的官方态度它只是“有界证据下的未分类”绝不等于“不存在已知原因”。日志的有界截取与截断语义日志读取是整个分类的信息基础所有边界都硬编码在脚本中源头截取gh api .../logs的输出先经tail -c 4000000写入job.log即源头最多保留 4 MB 尾部字节二次收敛tail -n 20000生成job.tail.log最多 20000 行脚本用stat -c %s与wc -l记录字节数与行数用于判定sourceTruncated特征筛选对每一行应用logPattern正则匹配FAIL、AssertionError、Test timed out、Process completed、SIGKILL、Source-shape、Source architecture、grew by、adds JavaScript、NEMOCLAW_、npm audit report、docs-review、Fern validation、hadolint、shellcheck、Nemotron等签名同时叠加NPM_AUDIT_FAILURE_PATTERN与NPM_BOOTSTRAP_FAILURE_PATTERN两组 npm 专项正则命中行的前后各 20 行被纳入上下文输出裁剪筛选结果再经过projectText逐行最长 4000 字符、总文本最长 4,000,000 字符随后boundedText按--clip-mode收缩到 40,000 字符以内截断可审计log.truncationReasons会逐条列出截断来源source-log-bounded-before-filtering、selected-lines-exceeded-maxLines、selected-line-exceeded-4000-characters、selected-text-exceeded-40000-characters并在truncationNotice中提示“不要假设被省略的日志行无关或不存在”。此外子进程 stdout/stderr 的捕获上限为 8,000,000 字符超限时置overflow标记并在 stderr 追加提示classify-ci-failure.mts。日志分类规则findings 类型分类规则集中在 classify-ci-failure.mts每条 finding 由type / detail / suggestion三元组构成最多返回 20 条。主要签名如下finding 类型触发特征建议动作test-failureAssertionError/Test timed out/Failed Tests/ Vitest 失败计数在对应 Vitest 项目中运行失败的测试检查首个断言或超时onboard-entrypoint-growthFAIL: src/lib/onboard.ts grew by N line(s).将新逻辑移入src/lib/onboard/或让入口净增减非正new-javascript-sourcePR 新增.js源文件新 Node 源码、测试、脚本一律使用 TypeScriptsource-architecture-budget“Source architecture budget failed”减少跨边界 import/export仅在实测债务下降时放宽限额source-shape-budget“Source-shape test budget” 失败优先行为测试否则修复文档化的 source-shape 契约env-var-documentationNEMOCLAW_*环境变量文档门禁失败在要求的参考文档中补充该变量说明或移除变量reviewed-npm-auditnpm audit 门禁报告咨询漂移判断是否为实时咨询漂移或走安全流程更新基线reviewed-npm-bootstrap固定 npm 归档的身份/完整性被拒绝检查固定 npm 身份与下载归档不改动咨询例外基线docs-review-receipt文档作者评审回执失败针对当前 commit 重跑评审并刷新两个隐藏 SHA 字段docs-validationFern validation/check-docs/npm run docs运行npm run docs并修复路由、frontmatter 或 MDX 错误hadolinthadolint或DL\d{4}Dockerfile 诊断修复诊断或使用窄范围、经策略批准的 ignoreshellcheckshellcheck或SC\d{4}诊断运行针对性 ShellCheck 与 shfmt 检查并修复advisor-second-opinionPR 评审顾问 job 中的 Nemotron 第二意见失败除非主顾问或维护者确认具体阻塞点否则仅作参考这些签名与仓库中真实存在的质量门禁一一对应例如 source-architecture.mts 维护“源码架构预算”run.mts 引用src/lib/onboard.ts的入口增长检查reviewed-npm-audit对应 ci/npm-audit-exceptions.json 的例外基线管理。产物artifact的校验式读取当传入--artifact-name时分类器进入产物检查路径其边界设计如下classify-ci-failure.mts清单分页有界按per_page100分页枚举repos/NVIDIA/NemoClaw/actions/runs/run_id/artifacts最多 20 页、最多 2000 个条目total_count在分页前后必须一致否则判定为分页不完整同名产物如重复上传会被视为歧义并报错列出前 20 个匹配 ID体积有界产物压缩体积必须 ≤ 25,000,000 字节25 MB且与元数据一致下载流用dd bs65536 count381与dd bs1 count30784精确截取 25,000,000 字节再用dd bs1 count1做 1 字节探测探测到额外字节即判定“超出压缩流限制”ZIP 严格校验压缩包字节数须与元数据完全相等随后交给 readValidatedArtifactZipEntries 解析——该函数完整校验 ZIP 结构EOCD、中央目录、本地文件头、data descriptor、CRC-32只接受 store/deflate 两种压缩方式拒绝符号链接、特殊文件、重复路径、../绝对路径等不安全条目并在单次调用限制maxEntries此处为 100与maxTotalUncompressedBytes此处为 100 MB后才返回条目result.json 有界读取只提取*.result.json条目单文件 ≤ 1,000,000 字节、≤ 2000 行解析出exitCode、signal须为系统已知信号名、timedOut、error字段最多保留 20 条失败记录、20 个畸形路径并汇总malformedResultCount、filesRead产物胜出者多个失败记录按artifactResultRank排序signal timedOut error 非零 exitCode选出一个“胜出者”转换为process-signal、process-timeout、artifact-reported-error、process-exit-code四类 finding 之一并给出“先检查捕获命令与周边资源证据再决定是否重试同一 commit”之类的建议。测试夹具 classify-ci-failure.test.ts 通过伪造gh、dd、wc与真实 ZIP 构造覆盖了上述路径包括元数据/日志/产物拉取的阻塞与失败注入、重复产物歧义、流超限、FAIL_PROBE_DD/FAIL_PROBE_WC等探针失败场景验证了有界读取与终止排水drain行为。安全边界可信子进程与脱敏输出分类器把自身定义为“内部可信子进程边界”在 classify-ci-failure.mts 的注释中明确调用方只能选择固定的gh、Bash 与 coreutils 操作产物内容仅作为数据解析、从不执行进程组管理只包含这些可信子进程而不是不可信负载沙箱。具体机制包括固定可执行路径bash、dd、stat、tail、wc固定为/usr/bin/*gh只允许在/usr/bin、/usr/local/bin、$HOME/.local/bin三个根目录下解析。解析前会逐组件校验路径根不得是符号链接、每个组件必须是目录/普通文件、不得是符号链接、mode 0o022必须为 0组/其他不可写、属主必须是 root 或当前用户、最终文件必须可执行X_OK且realpath结果不得逃出受信根classify-ci-failure.mts环境变量白名单/黑名单子进程只继承GH_CONFIG_DIR、GH_TOKEN、GITHUB_TOKEN、HOME、LANG、LC_ALL、LC_CTYPE、NO_COLOR、TERM、XDG_CONFIG_HOME十个变量并显式剔除BASH_ENV、ENV、GH_ENTERPRISE_TOKEN、GH_HOST、NODE_OPTIONS、NODE_PATH、PATH、PERL5OPT、PYTHONHOME、PYTHONPATH、RUBYOPT等可劫持或泄露凭据的变量classify-ci-failure.mts多层脱敏所有进入诊断或输出文本的内容都经过redact()覆盖 JSON 敏感字段、authorization/cookie/set-cookie等请求头、URL 内嵌凭据、X-Amz-*/sig/access_token等查询参数、KEYvalue赋值以及 Slackxox*/xapp-*、OpenAIsk-*、NVIDIAnvapi-/nvcf-、npmnpm_、gh[pousr]_、github_pat_等独立令牌形态统一替换为[REDACTED]classify-ci-failure.mts测试文件在REDACTION_CASES中为这些形态逐一断言了脱敏行为私有临时目录临时文件统一放在/tmp/nemoclaw-ci-classifier-uid下模式0700运行时校验非符号链接、非组/其他可访问、属主为当前用户日志与产物分别使用nemoclaw-ci-log.与nemoclaw-ci-classify.前缀的mkdtemp子目录正常与失败路径都会尝试直接删除删除失败则输出有界、脱敏的rm -rf -- 路径修复命令并以非零退出稳定进程组管理每条命令都运行在node -e包装的独立、detached进程组下组领导者在所有后代退出前保持存活通过轮询/proc统计组内成员超时先发SIGTERM、1 秒后升级SIGKILL收到SIGHUP/SIGINT/SIGTERM时拒绝新命令、终止并排空所有自有进程组、同步清理被跟踪目录并以约定取消码129/130/143退出。失败语义与 GitHub 访问硬停技能的失败处理契约非常明确SKILL.md任何非零的日志获取结果都是分类失败清理尝试之后脚本以非零退出、不输出成功 JSON只报告有界且脱敏的诊断临时目录删除失败同样导致非零退出并附带直接的删除命令GitHub 认证/授权失败必须停止脚本会识别authentication、authorization、forbidden、http 401、http 403、sso等关键字并抛出专用错误要求先运行gh auth status再请用户修正gh访问含 SSO 或 token scope后重跑这一行为与仓库共享规则 git-github-hard-stop.md 一致——不得绕过访问错误、不得改凭据、不得回退到未认证通道超时即失败三类 GitHub 操作各有固定超时job 元数据 30 秒、job 日志 60 秒、产物读取 60 秒测试注入可通过timeouts覆盖超时会先终止进程组再抛“GitHub 不可用请检查后重试”的错误。小结何时使用、如何配合其他维护技能classify-ci-failure适合作为 CI 排障链的第一步先用它拿到有界的日志切片、产物失败记录与分类建议再结合 NemoClaw 仓库中的真实门禁source-architecture.mts、run.mts、ci/npm-audit-exceptions.json与 e2e 维护技能 的本地复现手段定位并修复问题。需要特别记住的三条原则证据有界所有输出都经过截断与脱敏截断原因随结果返回阅读时必须结合truncationReasons判断证据完整性只读可信脚本不做任何 GitHub 写操作产物永不执行外部命令全部来自受信路径失败即停GitHub 访问类失败绝不绕过先修正gh认证含 SSO/token scope再重试unclassified只代表有界证据下未命中已知签名不代表不存在根因。【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址: https://gitcode.com/gh_mirrors/ne/NemoClaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考