Jira 是图灵完备的
- #Jira
- #图灵完备
- #自动化
- #Hacker News
- #seriot.ch
工程学传说认为 Jira(Atlassian 的项目追踪工具)是图灵完备的。现有的说法模糊地指向自动化功能,但并未给出具体的规约。本文提供了一个证明,包含设置说明和执行跟踪。
映射计算模型
Minsky 寄存器机只需要两个无界计数器和一组有限的有标号指令:
- INC r; goto S
- if r == 0 goto S else (DEC r; goto S')
或者用通俗的话说:
- 递增寄存器 R,然后转到某个状态 S
- 如果 R == 0,转到零状态 S,否则递减 R 并转到非零状态 S'
一个将寄存器 A 加到寄存器 B 的 Minsky 程序如下:
- if A == 0 goto 3 else (DEC A; goto 2)
- INC B; goto 1
- HALT
Minsky 在 1967 年证明了该模型是图灵完备的。因此,在 Jira 的自动化语言中展示它,就建立了规约。
以下是模型在 Jira 上的映射方式:
| Minsky 机器 | Jira |
|---|---|
| 寄存器 A | Bug 类型关联问题的数量 |
| 寄存器 B | Task 类型关联问题的数量 |
| 程序计数器 | 单个 Epic 问题的状态 |
| 分发表 | Jira 自动化规则,每条指令状态一条 |
| 时钟 | 自动化触发的转换,或超过链上限后的外部重触发 |
Epic 的状态编码当前指令。自动化规则检查关联问题的数量并决定下一个状态。INC 和 DEC 通过在适当的关联问题类型上创建和删除问题来实现。条件分支通过 JQL 条件规则实现。
实现加法
以下是一个最小的工作实现,使用一个 Epic、五个关联问题和每个指令状态一条自动化规则(空间设置 > 自动化)。
-
创建工作流 创建一个 Jira 工作流,状态为初始状态 BACKLOG,然后是 TODO、DEV 和 PROD。任何状态都可以转换到任何其他状态。在 BACKLOG 状态创建一个 Epic。
-
为 TODO 创建规则 DEC A;如果 A=0 则停机,否则转到 DEV。
- 触发器:Epic 状态变为 TODO。
- 如果至少存在一个关联 Bug:删除一个 Bug,将 Epic 转换到 DEV。
- 否则:将 Epic 转换到 PROD(停机)。
-
为 DEV 创建规则 INC B;转到 TODO。
- 触发器:Epic 状态变为 DEV。
- 创建一个新的 Task,链接到 Epic。
- 将 Epic 转换到 TODO。
两条规则都启用“允许规则触发其他规则”。
-
初始化寄存器 链接 2 个 Bug(A=2)和 3 个 Task(B=3)到 Epic。
-
启动机器 将 Epic 转换到 TODO 以启动级联。 五次转换: (2,3) TODO → (1,3) DEV → (1,4) TODO → (0,4) DEV → (0,5) TODO → (0,5) PROD 记录在真实的 *.atlassian.net 实例上。最终 Epic 处于 PROD 状态,关联了 0 个 Bug 和 5 个 Task。我们刚刚完成了 2 + 3 = 5。
三状态下的斐波那契
上述规约足以证明图灵完备性。此外,Jira 的自动化语言可以简化 Minsky 操作。Convert Issue Type 可以立即改变问题的类型:Bug → Story,Story → Task 等等。CONVERT 可以表示为 DEC + INC。它并没有扩展 Jira 的计算能力,但极大地缩小了任何移动循环的分发表大小,使得非平凡程序变得可行。
斐波那契数列 (A, B) → (B, A+B) 可以压缩为三个状态,使用三个寄存器(A=Bug, B=Task, C=Story),并将 TODO、QA(添加到工作流)和 DEV 作为三个指令状态:
-
TODO:如果存在任何关联的 Task:
- CONVERT Task → Story
- INC Bug
- 转换到 TODO 否则:转换到 QA
-
QA:如果存在任何关联的 Bug:
- CONVERT Bug → Task
- 转换到 QA 否则:转换到 DEV
-
DEV:如果存在任何关联的 Story:
- CONVERT Story → Bug
- 转换到 DEV 否则:转换到 TODO
初始状态 A=1, B=1, C=0。序列 1, 1, 2, 3, 5, 8, 13, … 出现在 B(Task 数量)中。
与加法机器不同,斐波那契机器没有停机状态。它会一直运行,直到达到 Jira Cloud 的链深度上限(10 次触发),此时操作员重新触发 Epic 以继续。一次简单的状态编辑即可重新启动级联。规约仍然成立,人类只是提供了下一个时钟滴答。Jira Data Center 则通过 automation.rule.execution.timeout 及相关可配置属性暴露了相同的限制。
结论
Jira 的自动化语言可以在无界问题创建和规则执行的前提下编码一个双计数器机器。每台物理计算机都是有限的,因此 Jira Cloud 的有限配额并不反驳这一构造。按照这一标准惯例,Jira 是图灵完备的。所以,如果你觉得复杂的 Jira 自动化看起来像程序,那是因为它们实际上就是程序。
评论