Slack に送ったメッセージを受け取って返すだけのボットを、Perl と Moo で作るところから始めます。そこへ /deploy や /log といったコマンドを足していくと、if-elsif がすぐに手に負えなくなります。その困りごとを1つずつ片付けていくと、Command・Mediator・Observer という3つのデザインパターンになります。最後は、権限チェックとエラー処理まで備えた ChatOps の「指令センター」が動きます。
このページは目次を兼ねた案内板です。通して作るなら「全9回」を順に、特定の困りごとがあるなら「困りごとから探す」から選んでください。
- 対象: Perl の基本と Moo の入門を終えた方
- 使うパターン: Command、Mediator、Observer
読み方
- 通して読む: 第1回から順に。コードは前の回の続きで、各回の終わりに次の回で直す問題が示されます
- パターンだけ知りたい: 第3回で if-elsif の行き詰まりを確かめてから、第4回(Command)→ 第5回(Mediator)→ 第6回(Observer)。前提のコードは第1〜2回にあります
- 全体像だけ見たい: 第7回の動作の流れと、第9回のアーキテクチャの振り返り
全9回
- Slack のメッセージを Perl で受け取って返信したい。Webhook サーバーと署名検証から始める
- Slack から /deploy や /restart を実行したい。まず正規表現で振り分けて動かす
- コマンドを足すたびに if が伸びていく。ログ・SQL・ユーザー管理を足して破綻を確かめる
- コマンドごとの if を片付けたい。コマンドを Command オブジェクトにして追加しやすくする【Command】
- コマンドの振り分けや権限チェックが本体に散らばる。仲介役を Mediator に一元化する【Mediator】
- 実行結果を Slack 返信・監査ログ・メトリクスに流したい。通知を Observer に任せる【Observer】
- Mediator・Command・Observer をつなぐと、どう動くのか。指令センターを組み上げて動かす
- コマンドが die したり、権限のないユーザーが叩いたりしたら。エラー処理と権限を Mediator に集める
- 指令センターが形になった。3つのパターンの役割分担を振り返り、ChatOps で次に伸ばす先を考える
困りごとから探す
Slack からメッセージを受け取って返したい
- 第1回 — Plack で Webhook を受け取り、返信し、署名検証でなりすましを防ぐ
コマンドが増えて、分岐が伸び続けている
- 第2回 — 正規表現でコマンドを振り分ける素朴な実装
- 第3回 — 機能を足すたびに if-elsif が破綻していく様子
- 第4回 — コマンドを Command オブジェクトにして、追加を新しいクラスで済ませる
振り分けや権限チェックが本体に散らばっている
実行結果を Slack 返信・監査ログ・メトリクスに流したい
- 第6回 — Observer で通知し、コマンドのコードに触れず出力先を増やす
