3、Pipeline可视化核心概念:节点(Node)、边(Edge)、DAG(有向无环图)、任务依赖关系

好,咱们今天聊点实在的。

Pipeline 可视化,说白了就是把一堆任务画成一张图。你一看这张图,就知道谁先干、谁后干、谁和谁可以一起干。我刚开始接触这玩意儿的时候,觉得不就是画个流程图嘛,有啥难的?后来被坑了几次才明白——这里面的门道,比你想的深。

3.1 节点(Node)—— 每个任务就是一个节点

节点,就是 Pipeline 里的最小执行单元。你可以把它理解成一个“动作”。

  • 一个节点 = 一个任务。比如“拉取代码”、“编译”、“跑测试”、“部署”。
  • 节点有状态:等待中、运行中、成功、失败、跳过。
  • 节点有输入输出:上游节点产出的东西,下游节点拿来用。

我个人习惯:给每个节点起一个“动词+名词”的名字。比如“编译前端代码”、“部署到测试环境”。别用“步骤1”、“步骤2”这种名字——三个月后你自己都看不懂。

我在项目中遇到过一件事:有个同事把所有逻辑塞进一个节点里,结果那个节点跑了40分钟才失败。排查问题?根本不知道是哪个子步骤挂了。后来我们拆成10个小节点,每个节点只干一件事。失败时一眼就能定位。

小技巧:节点粒度控制在“5分钟内能跑完”最合适。太粗了不好排查,太细了管理成本高。

3.2 边(Edge)—— 节点之间的连线就是边

边,就是节点之间的“箭头”。它表示一个节点执行完后,下一个节点才能开始。

你想想看,如果没有边,所有节点就是一堆散沙。有了边,它们才有了顺序和逻辑。

  • 有向边:箭头从上游指向下游。A → B,表示A完成后B才能开始。
  • 条件边:根据上游结果决定走哪条路。比如“测试通过”走部署分支,“测试失败”走修复分支。
  • 默认边:最简单的顺序执行,一条线串下来。

注意:边不能形成循环。A → B → C → A 这种,Pipeline 会直接报错。嗯,这就是 DAG 的规矩。

我曾经踩过一个坑:在可视化编辑器里拖拽节点时,不小心把两个节点连成了双向箭头。结果 Pipeline 引擎直接崩溃,日志里就一句话:“Cycle detected”。排查了半小时才发现是手滑了。

3.3 DAG(有向无环图)—— 整个 Pipeline 的骨架

DAG,全称 Directed Acyclic Graph。翻译过来就是“有方向、没有环的图”。

为什么必须是 DAG?

  • 有向:任务有明确的先后顺序。你不能让“部署”跑到“编译”前面去。
  • 无环:不能出现死循环。A依赖B,B依赖C,C又依赖A——这活儿没法干。

说白了,DAG 就是一张“谁先谁后”的路线图。你从起点出发,沿着箭头走,一定能走到终点,而且不会走回头路。

核心要点:DAG 保证了 Pipeline 的可终止性。只要图是无环的,任务就一定能跑完(除非某个节点挂了)。

我记得有一次给客户设计部署 Pipeline,他们要求“如果测试失败就重跑测试,最多重试3次”。这其实不是 DAG 能直接表达的——因为重试意味着循环。我们的解决方案是:把“重试”拆成3个独立的节点,每个节点都连到同一个“测试”节点。这样既实现了重试逻辑,又保持了无环结构。

3.4 任务依赖关系 —— 谁等谁,谁靠谁

依赖关系,就是节点之间的“等待规则”。

常见的依赖类型:

依赖类型 说明 示例
顺序依赖 B 必须等 A 完成 先编译,再部署
并行依赖 A 和 B 可以同时跑 同时跑单元测试和代码扫描
条件依赖 根据 A 的结果决定是否跑 B 测试通过才部署
数据依赖 B 需要 A 产出的文件 编译产物传给部署节点

避坑指南:我曾经把“数据依赖”和“顺序依赖”搞混了。两个节点明明没有先后关系,但因为共享同一个输出目录,结果跑出了脏数据。后来我强制要求:每个节点只能读写自己的专属目录,跨节点传数据必须通过显式的 artifact 传递。

3.5 一张图看懂核心概念

下面这张 SVG 图,把节点、边、DAG、依赖关系全串起来了。你一看就明白。

Pipeline 核心概念示意图 拉取代码 编译 单元测试 代码扫描 部署 图例 节点(任务) 边(顺序依赖) 边(条件依赖) DAG:无环有向图 并行:编译 & 代码扫描

你看这张图:

  • “拉取代码”是起点,它同时连向“编译”和“代码扫描”。这两个节点可以并行跑。
  • “编译”完成后触发“单元测试”。
  • “单元测试”和“代码扫描”都完成后,才触发“部署”。
  • 整个图没有环,从起点到终点只有一条路(或者多条并行路)。

总结一下:节点是任务,边是顺序,DAG 是规则,依赖关系是逻辑。把这四个概念吃透了,Pipeline 可视化你就掌握了八成。

我的经验:刚开始设计 Pipeline 时,别急着画图。先在纸上列出所有任务,然后问自己三个问题:

  1. 哪些任务必须串行?
  2. 哪些任务可以并行?
  3. 失败时怎么处理?

想清楚了再画 DAG,事半功倍。

嗯,核心概念就这些。下一节咱们聊聊怎么用代码定义这些节点和边——到时候你会觉得,可视化不过是锦上添花,真正的功夫在逻辑设计上。


公众号:蓝海资料掘金营,微信deep3321