📮

ShotGrid の Webhook と Slack の Workflow を連携させたくて惜敗。

2021/11/01に公開

Slackの有料版では、ワークフロービルダーを使って定期処理をトリガしたりコマンドを作ったりwebhookを受信したりできます。
SGにはwebhookがベータ状態で提供されているので、両者を組み合わせればSGでの変更をノーコード的にSlackへ通知できるのでは?と考えました。

※20211114 追記 : SG Webhooks はBetaじゃなくなったそうです > LINK

TL;DR

両者 のみでは だめでした。
AWSなりGCPなりXaaS的な何かでSGの吐くpayloadを処理する必要がありそうです。
なまけてはいけませんね。

手順1 - Slack側

有料登録したSlackにて、ワークフロービルダーで作業していきます。
ドキュメントはこちら。
https://slack.com/intl/ja-jp/help/articles/360035692513
https://api.slack.com/workflows

ワークフローはjsonファイルで読み書きでき、サンプルのワークフローがたくさん公開されていたりします。
https://slack.com/intl/ja-jp/slack-tips/workflow-builder-examples

ワークフロービルダーを開く

左上の サーバー名 のメニューから「ツール」>「ワークフロービルダー」とたどります。

Slackのドキュメントが不親切(?)で、ワークフローの魅力や設定は書いてあるものの、肝心の「ワーフクロービルダーへのアクセス」が見当たらずずっこけました。見つけられてないだけ&「そこにあるだろ」というような場所にあるからかもしれませんけど。

ここでワークフローを作成したり、jsonファイルをインポートしたり出来ます。

ワークフローを作成

ワークフローを作成していきます。まずは命名。

そして開始する方法(トリガー)。

  • ショートカット
  • 新しいチャンネルメンバー
  • 絵文字リアクション
  • スケジュールされた~~
  • Webhook

トリガーが「このワークフローがなんなのか」を既定するもので、例えば「/」コマンドとして反応してほしければ「ショートカット」を選びます。

今回はSGから飛んでくるWebhookを受信してほしいので、Webhookを選びました。

変数の追加

「Webhook」ワークフローを選択すると、変数を追加するダイアログに移ります。

飛んでくるWebhookのキーをワークフローの中で利用できるという仕組みです。
今回飛んでくるのがどういうデータでどういうキーを持っているのかは、後述するSGのWebhookのドキュメントで確認できます。


ダイアログ最下部の「HTTP本文の例」のところが、飛んできてほしいデータの見本ということです。

ひとまずこんな感じにしました。

この画像の内容は間違いというか適当で、
動くかどうかよくわからないので追加しておいて停まったら考えようという姿勢。

ステップの追加

「~~と開始します」トリガーに続けて 「ステップを追加」 との表示。
ちなみに、先ほどの変数入力ダイアログは、トリガーの右の「編集」から再度表示できます。

「ステップを追加」からトリガー後にやってほしい動作を指定します。
他社アプリを追加していたらいろいろ表示されますが、何もしていなければ「メッセージを送信」「フォームを送信する」のみが表示されます。

今回はSGからのWebhookを受けてなにか送信してほしいので、「メッセージを送信」を追加します。

「メッセージを送信」ダイアログでは、このワークフローがメッセージを投稿できるチャンネルと、投稿してほしいメッセージを設定します。
入力欄右下の 「変数を挿入する」 から、先ほど入力した変数をメッセージに混ぜ込むことができます。

(上の方で入力した「entity_type」などが無くなって「data」があるのは諸々試行錯誤を経たあとの画像だからです)

公開

最後に右上の 「公開」 ボタンを押すことで、ワークフローがトリガーを受け付け始めます。

その際、なにやら紙ふぶきらしき演出とともに 受信用URL が掲出されますので「コピー」しておきます。
ここでコピーし忘れても後でまた取得したり、再発行したりできます。

Slack側の準備はひとまずここまでです。

手順2 - SG側

SGからWebhookを飛ばす設定をしていきます。
ドキュメントはこちら。
https://developer.shotgridsoftware.com/ja/3d448f5e

今回特に肝心なのはサンプル ペイロードです。

WebhookのURL 欄に先ほどのワークフローのURL、
プロジェクトは指定なし(=全プロジェクトで発報)
TaskエンティティのStatusがUpdateされたら反応するようにしました。

「Test Connection」 で様子をうかがってみると、
図の下部のように赤字で 「失敗しました」 とのお知らせが返って来ます(一番上の 「不安定」 というステータスも悲しい)。

msg
{"error":"missing_field_value","ok":false,"response_metadata":{"messages":["[ERROR] empty required f...

とのこと。
また、Slackのワークフロー側のログを見ても、同様に書いてあります。

確認

SGからSlackのワークフローのURLへ送られるデータはこのようになっているそうです(上記公式ドキュメントの例)

payload
{
  "data": {
    "id": "95.0",
    "meta": {
      "type": "attribute_change",
      "entity_id": 758,
      "new_value": "This is the newest description ever!!",
      "old_value": "This is the old description!",
      "entity_type": "Asset",
      "attribute_name": "description",
      "field_data_type": "text"
    },
    "user": {
      "id": 113,
      "type": "HumanUser"
    },
    "entity": {
      "id": 758,
      "type": "Asset"
    },
    "project": {
      "id": 65,
      "type": "Project"
    },
    "operation": "update",
    "created_at": "2019-07-12 21:14:36.598835",
    "event_type": "Shotgun_Asset_Change",
    "session_uuid": "07473c00-a4ea-11e9-b3b8-0242ac110006",
    "attribute_name": "description",
    "event_log_entry_id": 248249
  }
}

id、meta、user...など様々な要素がありますが、それらをひっくるめてdata以下に組み込まれています。

ドキュメント「Webhook を使用した高度なワークフローを作成する」より

Slackのドキュメント、Webhook を使用した高度なワークフローを作成する にいわく、

現時点では、ワークフロー変数でネストされた JSON 構造を使用することはできません。

とのことです。。。

ということはつまり、「data」キー以下にいろいろ入っているSGからの情報は今のところ処理できないよ、ということですね。

ためしにワークフロー側で変数一つも追加しない状態にして、
再度Test Connectionしてみると、問題なく通りました(これで問題があったら大事件)。


現状は 待ち 、もしくは、
一旦別の何かで受けてワークフロー側で処理できるように加工して、再度ポストする、みたいなのがやっぱり必要そうです。

なまけようとおもったけどそうはいかなかったというメモです。

おまけ

ShotGridについての解説本を準備中です。来年初頭にリリース予定です、ご注目ください。
(現在は編集作業中で、未編集の原稿を公開しています)

https://zenn.dev/it_ks/books/877741f3258af2

Discussion