べにやまぶろぐ

技術寄りの話を書くつもり

Digdag / Treasure Workflow でプラグインを使わずに `http:>` オペレータで Slack 通知を行う

ワークフローエンジンの Digdag を本格的に使い始めたのですが、バージョン 0.9.3 の現在、通知系のオペレータは mail:> くらいしかありません。

プラグインを使うことで Slack 通知が可能になりますが、Digdag のホスティングサービスである Treasure Workflow で同じことをしようとしてややハマったのでメモしておきます。

Digdag で Slack プラグインを使う

Digdag には digdag-slack という素敵プラグインがあるのですが、残念ながら最新の 0.9.3 では動作しないということで @bwtakacy さんが qiita.com という記事を書いてくれました。

その結果、

_export:
  plugin:
    repositories:
      - file://path/to/workspace/digdag-slack
    dependencies:
      - jp.techium.blog:digdag-slack:0.1.2

+step1:
  slack>: message.txt
  webhook: https://hooks.slack.com/services/XXXXXXXX  # <-- Slack Incoming WebHooks url
  channel: general
  username: webhookbot
  icon_emoji: ghost

という感じで動かすことができるようになったのですが、これを Treasure Workflow で動かそうとすると

2017-01-31 21:04:53.077 +0000 [INFO] (0589@+my_project+step1) io.digdag.core.agent.OperatorManager: slack>: message.txt
2017-01-31 21:04:53.077 +0000 [ERROR] (0589@+my_project+step1) io.digdag.core.agent.OperatorManager: Configuration error at task +my_project+step1: Unknown task type: slack (config)

などと怒られてしまいます。

@myui さんの

github.com

を参考に Jitpack に登録して

_export:
  plugin:
    repositories:
      - https://jitpack.io
    dependencies:
      - com.github.myui:digdag-plugin-example:v0.1.2

などとしても結果は同じでした。

http:> オペレータで Webhook を叩くのが楽

結局、

+step1:
  http>: https://hooks.slack.com/services/XXXXXXXXXX  # <-- Slack Incoming WebHooks url
  method: POST
  content:
    text: "タスク1の通知です :tada:"
  content_format: json

などとして標準梱包の http:> オペレータを使うようにしてプラグインが使えない問題を回避しています。Digdag も Treasure Workflow も同じコードでいけるはずなので、これが現状一番手軽かもしれません。

Sending messages using Incoming Webhooks | Slack に記載されているような他のオプションも投げられるはずなので

+step1:
  http>: https://hooks.slack.com/services/XXXXXXXXXX  # <-- Slack Incoming WebHooks url
  method: POST
  content:
    username: "ghost-bot"
    icon_emoji: ":ghost:"
    channel: "#other-channel"
    text: "タスク1の通知です :tada:"
  content_format: json

というようにもできるはずです(未検証)。

(余談)0.9.3 で digdag push から -p パラメータがなくなった

digdag-slack プラグインの README では

_export:
  plugin:
    repositories:
      - file://${repository_path}
    dependencies:
      - jp.techium.blog:digdag-slack:0.1.0

として

$ digdag r hello_world.dig -p repository_path=/path/to/workspace/digdag-slack

というように repository のパスを -p で指定するようになっていますが、これを push しようとした時 digdag 0.9.3 では -p オプションが無くなっているためうまくいきません。

$ digdag push --help
2017-02-01 02:31:38 +0900: Digdag v0.9.3
Usage: digdag push <project> -r <revision>
  Options:
        --project DIR                use this directory as the project directory (default: current directory)
    -r, --revision REVISION          specific revision name instead of auto-generated UUID
        --schedule-from "yyyy-MM-dd HH:mm:ss Z"  start schedules from this time instead of current time
    -e, --endpoint HOST[:PORT]       HTTP endpoint (default: http://127.0.0.1:65432)
    -L, --log PATH                   output log messages to a file (default: -)
    -l, --log-level LEVEL            log level (error, warn, info, debug or trace)
    -X KEY=VALUE                     add a performance system config
    -c, --config PATH.properties     Configuration file (default: /Users/yamabe/.config/digdag/config)

結局上述したように file://path/to/workspace/digdag-slack というようなパスを埋め込むことにしたのですが、他に良いやり方がある気がします。