ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OneUptime Workflow 编写(Authoring)完整指南:从画布到第一个自动化流程

OneUptime Workflow 编写(Authoring)完整指南:从画布到第一个自动化流程 OneUptime Workflow 编写Authoring完整指南从画布到第一个自动化流程【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime本指南以 OneUptime 官方文档《Einen Workflow erstellen》德语版同见英文版 authoring.md为骨架系统讲解如何在 OneUptime 中创建、连接、配置并运行一个 Workflow。你将掌握 Builder 画布的操作方式、触发器与组件的区别、块Block的连接与配置、构建期校验、手动运行与启停管理并了解背后运行引擎RunWorkflow.ts的源码级实现细节。创建 Workflow向导与入口在 OneUptime 中创建一个 Workflow 非常简单打开Workflows工作流页面点击Create Workflow创建工作流。此时会弹出一个名为Create a workflow的创建向导引导你分几步完成Start from从何处开始——选择Start from scratch从零开始或从系统提供的模板中选择一个Name名称——为工作流命名Configure配置——这一步并非总是出现只有当你选择的模板自带需要填写的设置项时向导才会展示该步骤。创建完成后点击左侧菜单中的Builder构建器进入工作区画布所有设计工作都在这里完成。Workflow 的图结构节点与连线会被持久化到数据库的graph字段中运行时会通过WorkflowService.findOneById读取该字段见 RunWorkflow.ts。画布Builder工作区核心一个从零开始的新工作流画布上只有一个带虚线边框的占位块上面写着Please click here to add trigger请点击此处添加触发器。这个块就是整个工作流的起点——点击它即可选择触发器。而从模板创建的工作流打开时块已经就位。触发器与组件画布上的每个块Block分为两类触发器Trigger位于工作流最顶端每个工作流恰好只有一个。再次添加第二个触发器会替换第一个如果把最后一个触发器删除虚线占位块就会重新出现。组件Component工作流里除了触发器以外的所有块负责做事——发送通知、调用 API、读写数据库等。这一设计在源码中有明确体现ComponentType枚举只有Trigger与Component两种值见 Component.ts。仓库中已内置的触发器包括触发器源码定义文件说明Manual手动Manual.ts手动运行工作流属于 Utils 类别可携带一段 JSON 作为入参Schedule定时Schedule.ts按 CronTab 表达式定时触发WebhookWebhook.ts通过 Webhook 请求触发可透传请求头、查询参数与请求体数据库触发器BaseModel.ts监听数据库模型的创建/更新/删除事件触发从源码结构看触发器与普通组件的核心差异在于触发器的componentType为Trigger且没有输入端口inPorts 为空因为触发器之前不会再有任何块执行。添加块添加触发器点击虚线占位块会打开一个标题为Add Trigger添加触发器的面板。添加其他组件点击画布上方工具栏中的Add Component添加组件按钮会打开同样式、标题为Add Component的面板。两个面板均可搜索——按下/键可直接跳到搜索框——并按类别分组展示。选中一个块后点击Add to Workflow添加到工作流即可。新添加的块总是落在画布的同一位置因此可能压在你已经放置好的块上面。把它拖到旁边即可拖动时画布会吸附到网格Grid上。所有块的位置都会被保存下一位打开该工作流的人看到的布局与离开时完全一致。自动保存画布上的所有更改都会自动保存无需手动点击保存按钮也没有独立的发布步骤。工具栏中有一个状态胶囊Pill实时反馈保存进度Saving…——更改正在提交Gespeichert已保存——保存成功Konnte nicht gespeichert werden保存失败——保存出错。块上有什么Whats on a Block选中任意块可以看到以下要素字段作用Identifier标识符位于ID下显示在块上的短 ID例如log-1。其他块正是通过这个 ID 来引用它——一旦重命名所有指向它的{{local.components.…}}引用都会失效。块的标题是组件自身的名称不可修改。Einstellungen设置块完成工作所需的参数——URL、Slack 频道、消息正文等。可选字段标注(Optional)其余为必填不常用的设置收纳在Erweitert高级折叠区中。Input输入块上边缘的圆点用于接收来自前序块的连线。触发器没有输入点——它之前没有任何东西运行。Outputs输出块下边缘的圆点每个圆点正上方有标签用于向后续块引出连线。许多块提供独立的Erfolg成功与Fehler错误两个输出便于分别处理两种情况。关于设置项的数据类型源码中ComponentInputType枚举定义了约 30 种输入类型包括文本、密码、日期、布尔、数字、JavaScript、JSON、URL、Email、CronTab、数据库查询/选择、数据库记录、JSON 数组、长文本、HTML、Markdown 等见 Component.ts。每种类型在配置对话框中都有对应的输入控件——文本框、下拉列表、代码编辑器、开关等。其中JSON、Query、Select类型的参数在运行时会被JSON.parse严格解析因此填写时必须保证是合法 JSON。连接块从某个块下边缘的圆点向下拖拽连到下一个块上边缘的圆点这条线就决定了执行路径从Erfolg成功端口连接仅当前一个块执行成功时下一个块才会运行从Fehler错误端口连接仅当前一个块执行失败时下一个块才会运行输出端口不连接该路径到此为止不再继续。一个输出可以连接多个块。所有这些块都会运行——但是串行、排成单条队列依次执行而不是并行。因此不要依赖分支之间的先后顺序不要指望各分支在时间上重叠每个块在一次运行中最多执行一次即使连线绕回前序块也不会让它跑第二遍。这一点在运行引擎中得到了落实RunWorkflow维护一个 FIFO 执行栈fifoStackOfComponentsPendingExecution逐条弹出组件执行若某个组件已经被执行过componentsExecuted中已存在会直接抛出BadDataException(Cyclic Workflow Detected...)从机制上杜绝了循环执行见 RunWorkflow.ts 的makeRunStack与主循环。配置块点击任意块会在对话框中打开其设置。每个设置项都有对应的输入控件——文本框、下拉列表、代码编辑器、开关等。填写完成后点击Speichern保存。同一个对话框中还提供Löschen删除——移除该块Run just this step仅运行此步骤——单独运行这一个块不执行工作流其余部分。它从其他步骤读取的值会以空值传入而它发送、写入或删除的一切都会真实发生Documentation文档、Inputs输入、Outputs输出、Returns返回值——展示该块期望接收什么、产出什么的参考卡片。大多数文本字段都支持变量——这正是数据在块与块之间流动的方式。不要手动输入{{ }}语法而应使用编辑器内的值选择器Value Picker它会根据你选择的块和字段自动生成正确的引用。变量体系详见仓库中的 Workflow 变量文档对应在线文档 variables 主题。源码视角Run just this step 是如何实现的值得强调的是这个功能不是在 API 进程内直接执行组件代码而是走一条完整、正式的执行路径。后端实现位于 RunStep.ts它通过POST /run-step/:workflowId接收componentId经过与手动运行完全相同的四重权限校验后调用QueueWorkflow.addWorkflowToQueue({ workflowId, runOnlyComponentId: componentId })把一次被收窄到单步的普通运行入队。在运行引擎 RunWorkflow.ts 中runOnlyComponentId会在构建运行栈后调用narrowRunStackToSingleComponent把栈收窄到仅包含目标组件、并丢弃其输出端口使下游不会跟着执行。因为收窄发生在makeRunStack之后该组件依然能拿到真实的元数据与参数而它通过{{...}}从其他组件读取的引用则无法解析——运行器会在日志中为每个未解析的引用打印警告而不是静默填充空值。这样设计的好处源码注释中明确说明包括单步运行同样需要工作流处于启用状态、订阅有效且遵守项目套餐运行限额会写入一条WorkflowLog记录使得发送消息/删除数据等真实副作用留下审计痕迹组件在 Worker 进程中执行而非 API 进程日志与返回值沿用统一的敏感信息脱敏规则不会在 HTTP 响应中直接回传。因此调用方收到的是与手动运行一致的Scheduled响应结果需从运行的步骤轨迹Step Trace中查看。构建时检查Prüfungen beim BauenBuilder 在每次更改时都会检查整张图并把结果反馈在工具栏的状态胶囊中。点击该胶囊可打开Problems with this workflow此工作流存在的问题面板其中列出每个问题点击即可跳转到出问题的块画布上出问题的块还会带有一个红色徽章。它能拦截那些直到运行出错才暴露的常见错误包括没有触发器两个块使用了相同的 IDID 中出现了点号存在没有任何连线的孤立块必填设置被留空JSON 格式错误{{ }}内部出现空格引用了不存在的步骤或返回值。唯一无法静态检查的是变量名是否存在。一个被拼错/重命名的变量引用只有到了运行日志里才会显现——这正是上面提到运行器会对未解析引用输出警告的原因VMAPI.replaceValueInPlace遇到无法解析的引用时会原样保留字面文本若不加警告一个拼错的{{local.componets.x}}会被当成真实值悄悄传下去而运行结果依然显示 Success详见 RunWorkflow.ts 中的logUnresolvedReferences。你的第一个 Workflow动手练习文档给出了感受画布最快的一条路径共 6 步点击虚线占位块在Add Trigger面板中选择Manual手动点击Add to Workflow点击Komponente hinzufügen添加组件在Utils分类下选择Log日志点击Add to Workflow。把新块从触发器旁拖开然后从触发器的Execute输出点向下连线到 Log 块的输入点打开 Log 块将其Wert值字段设置为Hello from {{local.components.manual-1.returnValues.value.name}}。其中manual-1是触发器的Identifier显示在触发器块上——请核对二者一致进入Übersicht概览页面在Details zum Arbeitsablauf工作流详情卡片上点击Workflow bearbeiten编辑工作流打开Aktiviert已启用开关。禁用状态的工作流完全无法运行连手动运行也不行回到Builder点击Arbeitsablauf ausführen运行工作流在JSON字段中输入{ name: Ada }点击Run Workflow Manually手动运行工作流并确认Run运行Workflow Run工作流运行面板会自动打开并实时跟踪执行过程。日志中会显示Value:后跟Hello from Ada。添加 → 连接 → 配置 → 运行 → 读日志 这个循环就是你构建所有工作流的方式。手动触发背后的调用链从源码看手动运行由 Manual.ts 提供GET/POST /run/:workflowId两个端点支撑。它在完成项目成员身份断言、资源归属校验以及运行权限需要与更新 Workflow 模型相同的写级权限校验后调用QueueWorkflow.addWorkflowToQueue({ workflowId, returnValues: req.body.data })把任务入队并立即返回{status: Scheduled}。Manual 触发器的元数据Manual.ts中runWorkflowManuallyArguments定义了运行时需要用户提供的 JSON 入参——这正是第 5 步中 JSON 字段的来源。这些入参在运行引擎中会被合并进触发器的参数if (stackItem.node.componentType ComponentType.Trigger) { args { ...args, ...runProps.arguments } }。启用、暂停与关闭 Workflow新建的工作流默认处于禁用状态通过复制Duplicate或导入Import得到的工作流同样默认禁用。Aktiviert已启用开关位于工作流的 Übersicht概览页面、Details zum Arbeitsablauf工作流详情卡片中——不在设置Settings页面。同一张卡片以绿色Aktiviert或红色Deaktiviert胶囊显示当前状态。禁用的工作流完全不会运行手动运行与触发器触发的运行一样都会被拒绝并提示 This workflow is not enabled此工作流未启用。因此正确顺序是先启用 → 用Arbeitsablauf ausführen运行工作流测试 → 读运行日志 → 若还不想让触发器开始触发再把Aktiviert关掉。只想测试单个块而不跑整个工作流时用该块设置里的Run just this step。暂停某个工作流而不删除它时只需关闭Aktiviert。关闭后不会有新的运行开始正在执行中的运行会执行完毕但停在Sleep块上的运行会在醒来时被取消并记为错误。这一行为同样有源码佐证运行引擎在恢复被 Sleep 挂起的运行isResume路径时会重新读取工作流并检查isEnabled若工作流在等待期间被禁用则直接把该运行标记为WorkflowStatus.Error并取消见 RunWorkflow.ts 的 resume 分支。suspendRun会把剩余执行栈、已执行组件与返回值快照写入WorkflowLog.resumeData通过QueueWorkflow.addResumeJobToQueue排入延迟任务届时自动续跑——挂起的运行不占用任何 Worker。清理与布局技巧拖动块即可移动位置布局会被保存删除连线把线的一端从圆点上拖开丢到画布空白处即可删除块点击块使用其设置对话框底部的Löschen删除选中块或线后按Backspace退格键也可以删除无法单独复制某一个块。Duplicate Workflow复制工作流位于工作流的Einstellungen设置页面它会复制整个工作流副本默认处于禁用状态把块自上而下堆叠摆放使其阅读方向与执行方向一致——输入在上边缘、输出在下边缘流程天然向下流动。进一步阅读Workflow-Trigger触发器——工作流启动的四种方式Manual、Schedule、Webhook 与数据库触发器源码见 Common/Types/Workflow/Components 目录Workflow-Komponenten组件——可以添加到画布的每一个块仓库内置组件索引见Common/Server/Types/Workflow/ComponentsWorkflow-Variablen变量——在块与块之间搬运数据{{local.components…}}与全局变量的取值与脱敏规则见 RunWorkflow.ts 的StorageMapWorkflow-Ausführungen Protokolle运行与日志——查看发生了什么运行状态机Scheduled/Running/Waiting/Success/Error/Timeout、步骤轨迹Step Trace与敏感信息脱敏全部实现于 RunWorkflow.ts 及Common/Types/Workflow/StepTrace.ts。多语言版本的上述文档均位于仓库 App/FeatureSet/Docs/Content 目录下含 en、de、zh-CN 等 20 种语言你可以结合本文与对应语言文档按需查阅。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进