Harness 应用

Harness Worker Agents 保姆级教程:权限、Pipeline、输出与触发验收

从一次固定失败构建开始,用 W01–W14 完成 Harness Worker Agent 的入口选型、模型连接、Pipeline 引用、最小权限、结构化输出、负例、触发身份和撤销验收。

进阶 预计 90 分钟 更新 2026/9/10 核验 2026/9/10
本页目录
官方文档核验 · 尚未运行实测查看验证范围

2026-09-10 核读当前 Worker Agent、配置、权限、Pipeline、参考与 VS Code Extension 官方文档;本站未登录 Harness、调用模型、运行 Pipeline 或开启账户 feature flag。文中的失败样本、步骤与验收表是可复现练习,不是产品实测结果。

完成结果

学完后你会留下什么

一份 W01–W14 验收记录、一张 Worker Agent 定义与 Pipeline 引用记录,以及可以复查的输出、权限负例、触发身份和撤销证据。

适合谁
准备把 AI 放进 Harness CI/CD、平台工程或失败构建排查流程,并需要可复查上线证据的开发与平台团队
开始前确认
  • 拥有 Harness 测试项目和可编辑测试 Pipeline
  • 可以创建或使用模型连接器
  • 准备了一次不含秘密值的失败构建样本
  • 不会把本教程 YAML 直接用于生产环境

这篇教程不以“Agent 回答得像不像专家”为通过标准。你要证明的是:它处理了正确的失败构建,只拿到完成任务所需的权限,缺少输入和越权时会失败,输出能被普通 Pipeline step 读取,触发运行也能追溯到明确身份,最后可以完整撤销。

本文使用固定金丝雀 WORKER-FAIL-743。它只用于确认输入、日志和输出没有串线,不是密码,也不要换成真实凭据。

**核验边界:**本站核读了 2026-09-10 可访问的 Harness 官方文档并静态检查下载材料,没有登录 Harness 账号或执行下列实验。界面、功能开放情况和内部步骤名称以你的租户与实际运行结果为准;验收表默认全部是“未验证”。

先下载三份材料

不要在下载材料里记录 PAT、模型密钥、完整客户日志、Secret 值或真实生产资源名称。

完成路线

阶段步骤必须留下的证据
选型与样本W01–W03入口决策、冻结的失败样本、功能与运行基础设施
Agent 合同W04–W07模型连接、输入输出合同、Catalog 版本、Pipeline 引用
权限与运行W08–W10最小权限、手动 execution、下游读取结果
负例与触发W11–W13缺输入、资源不存在、越权、错误动词、触发身份
撤销W14暂停、回滚、删除临时资源与权限收回

任何硬失败项不通过,都不能把试点记为完成。

W01:先选对入口,不要把所有 Harness AI 都叫 Worker Agent

同样是“构建失败后帮我定位”,实际可能是四类不同任务。

你真正需要的结果先评估的入口本次完成条件
在编辑器查看 execution、日志、审批或重新运行Harness VS Code Extension找到正确 execution、commit 与首个失败 step
每次运行都产生结构化分析并交给后续 stepWorker AgentAgent 作为 Pipeline step 执行,输出可被普通 step 读取
处理代码审查、覆盖率或候选修复对应版本的 Harness Code Quality 能力实际 diff、测试输出与候选提交 SHA 可以复查
让外部 AI 客户端读取 Harness 资源Harness MCP Server客户端发现工具,并通过资源正例与越界负例

VS Code Extension 当前文档强调 Pipeline 监控、日志、审批、重新运行、终止和 AI 调试入口。它可以帮助人工定位,但不会因为安装扩展就自动在每次 Pipeline 中生成结构化结果。

**W01 通过条件:**在运行卡写下唯一入口和不选择其他入口的原因。若需求只是查看日志,就在这里结束 Worker Agent 试点,避免为了“用了 AI”增加 Pipeline 复杂度。

W02:冻结一次可复查的失败构建

选择测试项目中已经发生、允许用于诊断的一次失败运行。不要为了教程破坏生产 Pipeline。冻结以下字段:

CANARY=WORKER-FAIL-743
ORG_ID=<测试组织>
PROJECT_ID=<测试项目>
PIPELINE_ID=<测试 Pipeline>
EXECUTION_ID=<失败运行 ID>
BRANCH=<分支>
COMMIT_SHA=<完整 SHA>
FAILED_STAGE=<首个相关失败 stage>
FAILED_STEP=<首个相关失败 step>
EXIT_CODE=<实际退出码>
FIRST_ERROR=<首个相关错误的脱敏摘要>
LOG_EVIDENCE=<受控证据位置>

FIRST_ERROR 要保留预期值与实际值,不能只写“测试失败”。LOG_EVIDENCE 可以是受控日志位置或脱敏片段编号,不要复制整份私人日志。

**硬失败:**execution、commit、失败 step 或首个相关错误任一未知时,停止 Agent 配置,先补齐 Pipeline 可观测性。

W03:确认功能、Stage 和运行基础设施

官方文档将 Worker Agent 描述为可复用的 Pipeline AI 单元,由 Instructions、Model Connector 和可选 MCP 组成。它以容器运行在隔离 VM 中,可以使用 Harness Cloud,也可以使用自有 Kubernetes 基础设施。

在运行卡确认:

  1. 模块选择器中能否进入 AI → Worker Agents
  2. 测试 Pipeline 使用 CI、CD、IaCM、STO、SCS 还是 Custom stage。
  3. CI、STO、SCS、IaCM 可以按对应文档加入 Agent step;CD 与 Custom stage 需要放在 Containerized Step Group 中。
  4. 实际执行基础设施、出网路径、日志保留和数据驻留是否符合团队要求。
  5. 若入口不可见,记录租户、模块和功能开放状态,停止实验;不要用截图猜测账号已经支持。

**W03 通过条件:**能够指出 Agent 在哪里运行、由哪个 stage 承载,以及连接模型和 Harness API 需要经过哪些网络边界。

W04:建立模型连接合同

Worker Agent 定义必须配置 Model Connector。先用测试用途、权限受控的连接器,不要复用无法说明 owner 和费用边界的个人密钥。

记录:

  • connector identifier、scope 和 owner;
  • 模型名称与可变参数;
  • Secret 的存储位置和轮换责任人;
  • 预算或调用上限;
  • 网络失败、限流和模型不可用时的 Pipeline 处理方式。

若使用 Harness 托管 LLM connector,且 Agent 配置了权限块,官方权限文档要求把 ai_llm_gateway: access 纳入评估。若 Agent 要读取 connector,还要评估 connector: view|access。具体值以当前权限参考和你的任务为准。

**硬失败:**不要把 token 放入 Instructions、Pipeline YAML、运行卡或 CSV。Secret 无 owner、无 scope 或无法撤销时,不进入 W05。

W05:先写输入输出合同,再写 Instructions

本实验只做失败证据整理,不自动修复、提交、批准或部署。

必填输入

字段来源缺失时行为
ORG_ID / PROJECT_ID / PIPELINE_IDPipeline 或固定测试配置返回 STATUS=input_missing
EXECUTION_ID本次失败运行返回缺失字段,不猜运行 ID
COMMIT_SHASCM / Pipeline 表达式不生成根因结论
FAILED_STEP / EXIT_CODEexecution 结果标记未知并停止诊断
FIRST_ERROR / LOG_EVIDENCE受控日志证据不补造错误内容
CANARY固定为 WORKER-FAIL-743缺失或不同即失败

固定输出

允许值或格式用途
STATUSok / input_missing / not_found / permission_denied / analysis_failed让下游以机器规则判断
FIRST_FAILED_STEP精确 step identifier 或 unknown防止把连带错误当首因
EXIT_CODE整数或 unknown保留原始状态
EVIDENCE_REF受控证据位置从结论回到事实
SUMMARY不超过 500 字符供 Pipeline 摘要使用
TASK_ID本次 execution + canary 的非秘密标识防止跨运行串线

Instructions 至少明确:只处理指定 execution;事实、假设和未知项分开;每个判断引用证据;不读取其他项目;不修改代码、Pipeline、Secret 或部署;无法读取时返回对应状态。

**负例预期:**缺少 EXECUTION_ID 返回 input_missing;不存在的测试 ID 返回 not_found;两者都不能返回貌似合理的失败原因。

W06:在 Catalog 创建有版本的 Worker Agent

进入 AI → Worker Agents 创建自定义 Agent。依据当前 configuration 文档逐项核对,而不是从博客复制整段旧 YAML:

  1. Schema version 为当前支持版本;现行文档示例使用 version 1。
  2. 名称和 identifier 能区分测试与生产。
  3. Instructions 使用 W05 的合同。
  4. Model Connector 指向 W04 的测试连接器。
  5. inputs 的类型与来源明确;官方参考支持 string、connector 和 array 等输入类型。
  6. with.output 声明六个输出键。
  7. 如需 MCP,只连接本实验所需资源,并单独做 MCP 权限验收。

保存后记录 Agent 名称、版本、配置导出或受控截图位置。不要只写“创建成功”。

**W06 通过条件:**审阅者能从证据重建输入、Instructions、连接器、输出和版本,但看不到任何 Secret 值。

W07:在测试 Pipeline 固定引用版本

Pipeline 对 Catalog Agent 的引用使用 agentName: name@version 形式;完整定义仍保存在 Catalog。当前官方文档明确:Pipeline YAML 只引用 Agent,不在这里重复 Instructions、inputs、outputs、环境变量或容器镜像。动态上下文要在 Catalog Agent 定义中通过受控 Harness 表达式注入,并用 W09 的实际输入核对结果证明表达式正确。

下载样例展示的是审阅结构,不是可以直接执行的完整 Pipeline:

step:
  type: Agent
  name: Failure evidence worker
  identifier: failure_evidence_worker
  spec:
    agentName: failure_evidence_worker@1.0.0
    agentSettings: ""

Agent 定义中的表达式名称、字段层级和 schema 会随租户能力变化。先在 Harness 编辑器中按当前 Schema 校验,再保存测试 Pipeline;不要为了把输入放进 Pipeline 而添加当前 Agent step 不支持的自定义字段。

**硬失败:**Agent 引用没有固定版本、Catalog 定义中的动态输入仍是占位符,或 CD / Custom stage 未使用所需 Containerized Step Group 时,不运行。

W08:声明最小权限,并理解“交集”规则

权限位置取决于 stage:CI、STO、SCS、IaCM 在 stage.spec.permissions;CD 与 Custom 在承载 Agent 的 Containerized Step Group permissions 中。权限是 YAML map,多个动词用 | 分隔。

下面只是失败分析任务的审阅起点:

permissions:
  ai_llm_gateway: access
  connector: view|access
  pipeline: view
  code_repository: view

删除任务不需要的资源。若输入已经携带全部脱敏证据,就不应为了方便给出广泛项目写权限。

运行时有效权限是 声明权限与调用者 RBAC 权限的交集。Agent 声明 pipeline: view 不会让一个无权查看 Pipeline 的调用者越权。当前文档还提醒:未知 resource key 会被丢弃;verb 不做同等的枚举校验,拼错的 verb 可能静默地什么也没授权。

**W08 通过条件:**保存权限 YAML、触发者身份和 RBAC 对照。必须在 W12 专门验证权限拒绝与 verb 拼写错误。

W09:先手动运行一次,只观察 Agent 本身

用 W02 冻结样本手动运行测试 Pipeline:

  1. 运行前再次核对 commit 与 execution 输入。
  2. 保存新的 Pipeline execution ID、Agent 外层 step 名称和展开后的内部 step 名称。
  3. 确认任务中出现且只出现一次 WORKER-FAIL-743
  4. 查看实际容器日志和 Agent 输出,不只读界面摘要。
  5. 核对六个输出键及 SUMMARY 长度。
  6. 检查 Agent 没有写代码、修改 Pipeline、批准或触发部署。

Worker Agent 在运行时会展开为 step group。内部输出路径可能包含外层 Agent step 和展开后的内部 step;内部名称应从这次真实运行中取得,不能提前猜。

**硬失败:**输入 SHA 不一致、canary 缺失/重复、证据引用无法打开,或 Agent 做了合同外写操作,立即停止并进入 W14。

W10:用普通 Run step 读取并验证输出

输出必须在 Agent 定义的 with.output 中声明,并由任务以 KEY=value 写入 $HARNESS_OUTPUT$DRONE_OUTPUT。仅在自然语言回答中打印 JSON,不等于发布了 Pipeline output。

在 Agent 后加入一个普通、无模型的 Run step,执行确定性检查:

test "$STATUS" = "ok"
test "$FIRST_FAILED_STEP" != "unknown"
test "$EXIT_CODE" != "unknown"
test -n "$EVIDENCE_REF"
test -n "$TASK_ID"
test "${#SUMMARY}" -le 500

变量绑定应使用 W09 实际运行中发现的完整输出表达式。不要让模型自己判断“我的输出是否有效”。

**W10 通过条件:**保存普通 Run step 的命令、实际 stdout、exit code 和完整输出路径。Agent 成功但确定性检查失败,整体仍失败。

W11:验证缺输入与不存在资源

在测试分支各运行一次:

  1. 移除 EXECUTION_ID,预期 STATUS=input_missing,并列出缺失字段。
  2. 传入确定不存在的测试 execution ID,预期 STATUS=not_found

两次都不得生成具体根因、伪造日志引用或进入后续部署步骤。下游 Run step 应根据状态非零退出,或走专门的人工处理分支。

**W11 通过条件:**两条独立 execution、两个预期状态和实际下游行为都有证据。只测正常路径不算试点完成。

W12:验证权限拒绝和错误 verb

使用测试身份和测试 Pipeline,不能在生产资源上制造权限故障。

权限交集负例

让调用者缺少读取目标资源的 RBAC,即使 permissions 声明了 view,也应得到拒绝。预期输出为 permission_denied 或平台明确的权限失败,不得降级为编造分析。

verb 拼写负例

在临时版本中把一个必要动词故意写错,例如把 view 改成可识别的测试错拼。当前文档说明 verb 不会被完整枚举校验,因此配置可能保存但运行时没有有效授权。记录实际失败,再恢复正确版本。

未知 resource key 负例

只在可安全操作的临时版本验证未知 key 被忽略的行为,不把它当作安全控制。测试完成后删除临时版本。

**硬失败:**若越权读取成功,立即暂停 Pipeline、收回连接器和执行身份,并按安全事件流程处理。

W13:验证触发器使用明确执行身份

手动运行通过不代表 Webhook、计划任务或其他 Trigger 会使用相同身份。官方权限文档对触发运行列出额外条件:

  • 相关账户需要具备 HARNESS_TOKEN_INJECT
  • 触发身份执行还涉及 PIPE_ENFORCE_TRIGGER_EXECUTOR_IDENTITY
  • Account setting 中 Enforce Executor Identity for Triggers 为 true;
  • Pipeline 配置明确的 Run pipeline as identity。

feature flag 是否可见及由谁开启取决于租户,不能靠 YAML 假装已经生效。

在非生产 Trigger 上运行一次与 W09 相同的样本,记录 Trigger ID、执行身份、RBAC、Pipeline execution、Agent version、输入 SHA 和输出。然后用权限不足身份做一次受控负例。

**W13 通过条件:**人工运行与触发运行都能追溯身份,权限不足的触发不会借用更高权限继续执行。

W14:演练暂停、回滚与完整撤销

试点结束前完成一次真实撤销:

  1. 暂停或禁用测试 Trigger。
  2. 从 Pipeline 移除 Agent step,恢复经过验证的前一版本。
  3. 删除临时 Agent 版本、负例版本和测试分支。
  4. 收回测试连接器访问与临时 RBAC。
  5. 轮换试点专用 Secret;不要在记录中粘贴新旧值。
  6. 保留脱敏 execution、配置版本、输出与审计记录。
  7. 再运行一次 Pipeline,证明旧流程恢复且不会调用 Worker Agent。

**W14 通过条件:**没有活跃 Trigger、残留写权限或孤立测试连接器;恢复运行成功,并能从审计记录确认 Agent 没有再次执行。

常见故障按层定位

现象先检查不要直接归因于
AI 菜单没有 Worker Agents租户功能开放、模块与角色权限浏览器缓存
Agent step 不能启动stage 类型、Containerized Step Group、基础设施、模型连接器Instructions 写得不好
模型调用被拒绝ai_llm_gateway、connector 权限、调用者 RBAC、Secret scope模型本身不可用
Agent 显示成功但下游为空with.output、输出文件、KEY=value、完整内部路径下游 shell 一定有问题
手动运行成功、Trigger 失败executor identity、账户设置、feature flag、Run pipeline asTrigger 需要更大权限
权限 YAML 保存但运行拒绝resource key、verb 拼写、声明与 RBAC 交集平台随机故障
输出很详细却无法复查输入是否真的传入、证据位置、execution 与 SHA回答越长越可靠

最终发布门禁

只有同时满足以下条件,才能把状态从“文档核读”升级为你自己的“测试项目已验证”:

  • W01–W14 全部有 execution 或配置证据,硬失败为零。
  • 输入 execution、commit SHA、失败 step 和 canary 一致。
  • Agent version、模型 connector、执行基础设施和触发身份明确。
  • 实际权限不超过任务所需,权限拒绝和 verb 错拼负例成立。
  • 六个输出由普通 Run step 验证,不依赖模型自评。
  • 缺输入、不存在资源和权限不足时不会编造结果或继续部署。
  • Trigger 使用明确执行身份,权限不足时停止。
  • 暂停、恢复、权限收回和无 Agent 的恢复运行都有记录。

需要让外部 IDE 或桌面客户端读取 Harness 资源,继续做 Harness MCP Server M01–M14 实验。需要先判断哪个 DevOps 场景值得自动化,阅读 Harness AI DevOps 场景选择;不要为了展示 Agent 能力跳过可复查的工程门禁。

官方资料

版本和参数,以这些来源为准

本文按实际任务重写,快速变化的信息仍应在操作前回到官方页面核对。

常见问题

继续操作前,先确认这些边界

Worker Agent 和 VS Code 扩展应该选哪个?

只需要在编辑器查看 execution、日志、审批或重新运行时,先用 VS Code 扩展。需要任务随 Pipeline 运行、把结构化结果交给下游步骤时,再使用 Worker Agent。

Agent 配置了 permissions 就能获得这些权限吗?

不能。运行时有效权限是声明权限与调用者 RBAC 权限的交集,声明不能扩大调用者原本没有的权限。

为什么 Worker Agent 显示成功,下游步骤仍读不到输出?

先确认 Agent 定义在 with.output 声明字段,任务确实把 KEY=value 写入 HARNESS_OUTPUT 或 DRONE_OUTPUT,再从一次真实运行中确认展开后的内部步骤名称和完整表达式路径。

定时或 Webhook 触发为什么和手动运行结果不同?

触发运行需要明确执行身份,并同时核对相关 feature flag、账户的 Enforce Executor Identity for Triggers 设置,以及 Pipeline 的 Run pipeline as 身份。

继续学习

按当前任务继续推进