ワークフローを図にする
dandori doc は、.flow をレビューする人のために図にします。図には流れの呼び出し・match・待ち・ループがすべて載り、その横に、検査が知っていて本文には書かれていないことが並びます。各呼び出しが何を呼び、どうリトライし、エラーがそれぞれどこへ行くか。呼び出しのあと各案件がどの状態になりうるか。ワークフローがどう終わりうるか、そのとき各案件がどの状態で残るか、です。
図はプラットフォームによって変わりません。ビルドが書いたものではなく、検査を通った .flow から描くので、何も走らせる前に手に入ります。Temporal にはワークフローのコードを図にする画面がありません。Step Functions や Argo Workflows が描くグラフには、結果を確かめるステートやループを回すステートなど、ビルドが足したものもすべて入ります。
Markdown で、プルリクエストに
Markdown では、flow と on failure・on cancel を Mermaid のフローチャートで描きます。GitHub は、プルリクエストや issue や README の中でそのまま図にします。図の下には、すべての呼び出しの表と、すべての終わり方の表が付きます。サービスを実装するワークフローでは、その前に、サービスのメソッドと、それぞれが実行に対して何をするかの表が入ります(サービスを実装する)。Jev が申込を採点し、人の承認に回すかを規則が決める、審査の例の日本語版(examples/review/temporal/review.ja.flow)です。
flowchart TD
start(["審査 v1"])
s1["結果 = 採点する(…)<br>jev · jev-1.13.0<br>retry 2 times every 10 seconds on 混雑, 過負荷 · timeout 10 seconds"]
s2(["fail 採点不能<br>#quot;申込 {申込.id} を採点できませんでした#quot;"])
s3[["判定 = 方針(…)<br>rule 審査の方針.rule"]]
s4{{"match 判定.決定"}}
s6[/"返事 = 承認を求める(…)<br>自分で書くタスク(応答はコールバック)<br>timeout 3 days"/]
s7(["fail 承認なし<br>#quot;三日たっても承認がありません#quot;"])
s8["知らせる(…)<br>自分で書くタスク"]
s9(["succeed 判断 = 承認"])
s10["知らせる(…)<br>自分で書くタスク"]
s11(["succeed 判断 = 結果.判断"])
start --> s1
s1 -.->|"on failure"| s2
s1 --> s3
s3 --> s4
s4 -->|"人に回す"| s6
s6 -.->|"on timeout"| s7
s6 --> s8
s8 --> s9
s4 -->|"承認, 却下"| s10
s10 --> s11
classDef ok stroke:#2da44e,stroke-width:2px
classDef bad stroke:#cf222e,stroke-width:2px
class s9,s11 ok
class s2,s7 bad
四角はタスク、両脇に線のある四角は規則、斜めの四角は外から値が届くタスク(イベントやコールバックの応答)、六角形は match、角の丸い四角は待ち、ステップを囲む枠はループです。破線の矢印は、呼び出しがその場で処理するエラーです。呼び出しの二行目は呼び方で、三行目は、流れには書かれていない宣言の中身(案件に何をするか、リトライ、タイムアウト)です。
一枚のページで、実行を光らせる
--format html は、ほかに何も要らないページを一枚書きます。図は dandori が自分で描くので、ネットワークがなくても見られます。日本語で書いた例(Temporal 版)のページは、ホテルの予約、注文、引当と発送、問い合わせ、審査 です。どのプラットフォーム向けにも一つだけ書いた請求と支払いのページもあります。日付は、規則と同じ形に、どの日付のファイルのものかを添えて描きます。
- ステップを選ぶ。 右側に、そのステップの
.flowの行、そこに来たとき各案件がとりうる状態、呼ぶもの、リトライとタイムアウト、エラーがそれぞれどこへ行くか、呼び出しのあとの案件、タスクや規則の宣言が出ます。 - シナリオを選ぶ。 左には
dandori scenariosが作るシナリオが、終わり方ごとに並びます。すべての分岐、エラーを処理するすべての箇所、案件の状態の移り方のすべてを通るシナリオです。選ぶと、その実行が通るところが光り、ステップの横に通った回数が出て、右側に各呼び出しの結果が並びます。 - 両方を選ぶ。 ステップを選んでいると、そこを通るシナリオが目立ち、右側にその本数が出ます。
! の付いた呼び出しには、その場で処理しないエラーがあります。そのエラーは on failure へ行くか、ワークフローを失敗させます。実行でそうなると、印が光ります。選んだものはアドレスに残る(hotel.html#run=40&node=s23)ので、リンク一つで一本の実行を見せられます。
呼び出す規則
図の上では規則の呼び出しは四角一つですが、何を決めるかは規則の中にあります。そこで doc は、ワークフローが使う規則を rulec が描いたとおりに見せます。rulec doc が描く、人が読むページを、手を加えずに、ページの言葉で入れています。
- Markdown では、最後に規則の節があり、規則ごとに
<details>で畳んであります。プルリクエストの上で開けば読めます。 - ページ では、左に規則の一覧があり、規則を呼ぶステップを選ぶと、右側にボタンが出ます。どちらからも、
rulec doc --format htmlが描くページがこのページの上に開き、ケースを打って試せます。リンクでも開け(hotel.html#rule=与信)、Esc で閉じます。
rulec が描いたものには、描いた rulec の版が入ります。
検査でエラーが見つかるワークフロー
名前と型が解決していれば、検査でエラーが見つかるワークフローも図にします。そのときの終了コードは 1 です。ページにはシナリオの代わりに診断が並び、選ぶと、そうなる例が図の上で光ります。E020 なら、案件を片付けないまま終わる実行が、図の上の一本の線になります。Markdown では、診断を dandori check の出力のまま最後に載せます。
何がどう描かれるか
.flow |
図 |
|---|---|
| タスクの呼び出し | 四角。外から値が届くタスク(event、callback)は斜めの四角 |
| 規則の呼び出し | 両脇に線のある四角 |
呼び出しの下の on <エラー> => |
呼び出しの横から、処理するステップへの破線の矢印 |
match |
六角形と、分岐ごとの矢印。先へ進む最初の分岐が真下に来る |
wait、wait until |
角の丸い四角 |
repeat、for |
繰り返すステップを囲む枠。左に次のイテレーションへ戻る線、右に break で抜ける線。並列の for には戻る線がない |
succeed、fail |
緑と赤の終わり。fail … leaving は、どの案件を引き渡すかを書く |
on failure、on cancel |
それぞれ別の図。始まりから、ワークフローの終わり方まで |
let x = <値> |
四角 |
pass |
何も描かず、矢印が先へ進む |