Edited at
SmalltalkDay 23

Backlogの更新通知をPharoで受けてChatWorkに整形して流す

More than 1 year has passed since last update.

Backlogの更新通知をChatWorkに流します。

BacklogのWebhookに関する説明です。URLを指定すると、更新時、そこにJSONをPostしてくれます。

http://www.backlog.jp/help/adminsguide/webhook-setting/userguide2493.html

ここではこの通知をPharoで受けて、ChatWorkに投稿します。

Web系のサービスの連携をサポートするサービスや事例はいろいろありますが、まぁ自前でやります。


参考する過去記事


Pharoの準備

この辺から環境に応じてPharoを入手、インストールしてください。

http://pharo.org/download


Pharoへの使用するライブラリ導入

以下のスクリプトをPharoのWorkspace等でdoItして必要なライブラリを導入します。

Pharo5であれば、HTTPサーバはデフォルト導入済みです。

"テンプレートエンジン Mustache"

Gofer new
smalltalkhubUser: 'NorbertHartl' project: 'Mustache';
configuration;
loadStable.

"JSON操作ライブラリ Neo-JSON"
Gofer new
url: 'http://mc.stfx.eu/Neo';
package: 'Neo-JSON-Core';
load.

"マイクロウェブフレームワーク Teapot"
Gofer it
smalltalkhubUser: 'zeroflag' project: 'Teapot';
configuration;
loadStable.

"ChatWorkAPIクライアント ChatWork4S"
Gofer new smalltalkhubUser: 'kaminami'
project: 'ChatWork4S';
package: 'ChatWork4S';
load.


BacklogでWebhookをテスト実行した際に送信されるJSON

実際はもう少し値が埋まって来ます。

必要な部分だけ抜き出して使用します。



{
"id": 3153,
"project": {
"id": 92,
"projectKey": "SUB",
"name": "SUBTASK",
"chartEnabled": true,
"subtaskingEnabled": true,
"projectLeaderCanEditProjectLeader": false,
"textFormattingRule": null,
"archived": false,
"displayOrder": 0
},
"type": 2,
"content": {
"id": 4809,
"key_id": 121,
"summary": "COMMENT",
"description": "",
"comment": {
"id": 7237,
"content": ""
},
"changes": [
{
"field": "milestone",
"new_value": "R2014-07-23",
"old_value": "",
"type": "standard"
},
{
"field": "status",
"new_value": "4",
"old_value": "1",
"type": "standard"
}
]
},
"notifications": [
{
"id": 25,
"alreadyRead": false,
"reason": 2,
"user": {
"id": 5686,
"userId": "takada",
"name": "takada",
"roleType": 2,
"lang": "ja",
"mailAddress": "takada@nulab.example"
}
"resourceAlreadyRead":false
},
],
"createdUser": {
"id": 1,
"userId": "admin",
"name": "admin",
"roleType": 1,
"lang": "ja",
"mailAddress": "eguchi@nulab.example"
},
"created": "2013-12-27T07:50:44Z"
}


Backlogから受けた通知をChatWorkへ整形して送信

以下、最小限の実装です。

本当に運用する場合はもう少しクラスを分けて、テンプレートはファイルに分けて、Teapotインスタンスもクラスインスタンス変数かシングルトンにバインドしましょう。

WorkspaceでdoItした状態でImageを保存しておくと、他所の環境でPharoを起動させた際、サービスが起動した状態で起ち上がります。

手抜きしたい場合には便利です。

| teapot templateSrc template |

templateSrc := '
Backlogが更新されました
https://YOUR_PROJECT.backlog.jp/view/{{projectKey}}-{{contentKeyId}}

[info][title]{{projectName}}: {{summary}}[/title]
{{description}}
[/info]
'.

template := MustacheTemplate on: templateSrc.

Teapot stopAll.
teapot := Teapot configure: {
#port -> 8888.
}.

teapot
POST: '/webhook/backlog' -> [:req |
| json client message |
json := NeoJSONObject fromString: req contents.

message := template value: {
'projectKey' -> json project projectKey.
'projectName' -> json project name.
'contentKeyId' -> json content key_id.
'summary' -> json content summary.
'description' -> json content description.
} asDictionary.

client := CWClient token: 'YOUR_CHATWORK_TOKEN'.
client
sendMessage: message
to: 'YOUR_CHATWORK_ROOM_ID'.

TeaResponse ok];
start.

teapot inspect.


おわりに

BacklogでWebhookをテスト実行したり、実際に課題を更新したりすると、ChatWorkに枠付きメッセージが投稿される、はずです。

ChatWorkはユーザ名のなりすましができないので、更新通知だけに使用するアカウントをとって運用したほうがよいですね。