Jira는 튜링 완전하다

2 days ago 4
  • Jira Automation은 두 무한 카운터와 유한 명령 상태를 가진 Minsky 머신을 표현해 Jira의 튜링 완전성을 보일 수 있음
  • Epic 상태는 프로그램 카운터, 연결된 Bug와 Task 수는 두 레지스터가 되며, Automation 규칙이 명령별 디스패치 테이블이 됨
  • INC와 DEC는 연결 이슈 생성·삭제로 구현되고, 조건 분기는 JQL 조건 규칙으로 연결 이슈 수를 검사해 결정함
  • 덧셈 예시는 A=2, B=3에서 Bug를 줄이고 Task를 늘려 실제 *.atlassian.net 실행에서 Task 5개와 정지 상태에 도달함
  • Fibonacci 예시는 이슈 유형 변환으로 루프를 줄이며, Jira Cloud의 체인 깊이 제한 10에 닿으면 수동 재트리거로 계속 진행 가능함

Jira 자동화로 만든 Minsky 머신

  • Jira Automation은 두 개의 무한 카운터와 유한한 명령 상태를 갖는 Minsky register machine을 표현할 수 있어, Jira의 튜링 완전성을 보이는 환원이 가능함
  • Minsky가 1967년에 증명한 모델은 INC r; goto S와 if r == 0 goto S else (DEC r; goto S')만으로 구성됨
  • Jira 구성 요소는 Minsky 머신의 각 요소에 대응됨
    • Register A: 연결된 Bug 이슈 수
    • Register B: 연결된 Task 이슈 수
    • Program Counter: 단일 Epic 이슈의 상태
    • Dispatch Table: 명령 상태별 Jira Automation 규칙
    • Clock: 자동화가 트리거하는 전환 또는 체인 제한 이후 외부 재트리거
  • Epic 상태가 현재 명령을 인코딩하고, Automation rules가 연결 이슈 수를 검사해 다음 상태로 전환함
  • INC와 DEC는 해당 유형의 연결 이슈 생성과 삭제로 구현되고, 조건 분기는 JQL 조건 규칙으로 처리됨

실행 예시와 제한

  • 덧셈 프로그램은 A를 줄이면서 B를 늘리는 Minsky 프로그램으로 구성됨 1. if A == 0 goto 3 else (DEC A; goto 2) 2. INC B; goto 1 3. HALT
  • 최소 구현은 하나의 Epic, 연결 이슈 5개, 명령 상태별 Automation 규칙 하나씩으로 구성됨
  • 워크플로와 규칙

    • Jira Workflow에 초기 상태 BACKLOG, 이후 TODO, DEV, PROD를 만들고 모든 상태가 서로 전환 가능하게 설정함
    • BACKLOG 상태의 Epic을 하나 생성함
    • TODO 규칙은 DEC A; if A=0 halt, else goto DEV를 구현함
      • Epic 상태가 TODO로 바뀌면 트리거됨
      • 연결된 Bug가 하나 이상 있으면 Bug 하나를 삭제하고 Epic을 DEV로 전환함
      • Bug가 없으면 Epic을 PROD로 전환해 정지함
    • DEV 규칙은 INC B; goto TODO를 구현함
      • Epic 상태가 DEV로 바뀌면 트리거됨
      • 새 Task를 만들고 Epic에 연결함
      • Epic을 TODO로 전환함
    • 두 규칙 모두 "Allow rule to trigger other rules"가 활성화됨
  • 초기값과 결과

    • Epic에 Bug 2개와 Task 3개를 연결해 A=2, B=3으로 초기화함
    • Epic을 TODO로 전환하면 다음 흐름으로 연쇄 실행됨 (2,3) TODO → (1,3) DEV → (1,4) TODO → (0,4) DEV → (0,5) TODO → (0,5) PROD
    • 실제 *.atlassian.net 인스턴스에서 실행됐고, 최종적으로 Epic은 PROD에 도달하며 Bug 0개와 Task 5개가 연결됨
    • 이 실행은 Jira 자동화로 2 + 3 = 5를 계산한 결과가 됨
  • Fibonacci 구성

    • Convert Issue Type은 Bug → Story, Story → Task처럼 이슈 유형을 즉시 바꿀 수 있음
    • CONVERT는 DEC + INC로 표현 가능해 계산 능력을 확장하지 않지만, 이동 루프의 디스패치 테이블을 줄여 더 복잡한 프로그램을 다루기 쉽게 만듦
    • Fibonacci는 (A, B) → (B, A+B)로 표현되며, 세 레지스터 A=Bug, B=Task, C=Story와 세 상태 TODO, QA, DEV로 구성됨 TODO: if any linked Task exists: CONVERT Task → Story INC Bug transition to TODO else: transition to QA QA: if any linked Bug exists: CONVERT Bug → Task transition to QA else: transition to DEV DEV: if any linked Story exists: CONVERT Story → Bug transition to DEV else: transition to TODO
    • 초기 상태는 A=1, B=1, C=0이며, Task 수인 B에서 1, 1, 2, 3, 5, 8, 13, ... 수열이 나타남
    • 덧셈 머신과 달리 Fibonacci 머신에는 정지 상태가 없고, Jira Cloud의 체인 깊이 제한 10에 도달할 때까지 실행됨
    • 제한에 닿으면 운영자가 Epic을 다시 트리거해 계속 진행할 수 있으며, 한 번의 상태 편집으로 연쇄 실행이 재시작됨
    • Jira Data Center는 automation.rule.execution.timeout과 관련 설정을 구성 가능한 속성으로 노출함
    • 무한한 이슈 생성과 규칙 실행을 가정하면 Jira 자동화 언어는 두 카운터 머신을 인코딩할 수 있으며, 물리 컴퓨터도 유한하다는 통상적 기준에서는 Jira Cloud의 유한 쿼터가 이 구성을 반박하지 않음
Read Entire Article