SlackワークフローとRubotyで最高のChatOps生活を

Misoca開発チームの黒曜(@kokuyouwind)です。

富山Ruby会議が近づいてきましたが、10/23 午前11時現在、まだスライドを1枚も作ってません。4連休に着手するつもりだったんですが、シャニマスとMTG Arenaに消えました。

あ、頭の中ではできあがってるから…… あとはスライドに書き出すだけだから……(震え声)

🤖 Slackワークフロービルダー

先日、Slackにワークフロービルダー機能が追加されましたね。

これはSlack上からメニュークリックや特定タイミングで起動するワークフローを作ることで、定型的な作業を自動化できるものになっています。

f:id:kokuyouwind:20191023110125p:plain

このような画面でワークフローを定義できます。

メッセージを送るだけでなく、フォームを表示したり、メッセージ内にワークフロー起動者の名前やフォームの入力を埋め込んだりなどができるようになっています。

ちなみに、弊社の@tharaは力を授けてくれるワークフローを作っていました。

f:id:kokuyouwind:20191023112640p:plain:w400

力を求めるとこうなります。

f:id:kokuyouwind:20191023112829p:plain:w400

ニュースサイトかな?

🤔困ったところ

標準の機能だけでも定形メッセージの送信やアンケートの収集など使い所はあるのですが、外部サービスと繋がらないのでChatOpsを実現するには少々力不足に感じます。

スラッシュコマンドが使えると面白そうだったんですが、残念ながらそのまま送信されてしまいました。

f:id:kokuyouwind:20191023125434p:plain:w400

これでremindが設定されてくれれば、ワークフローからリマインドの設定や削除をしたり、/trelloコマンドを使ってTrelloのカードを作ったりなどもできそうなんですけどね。

💎Rubotyと連携させる

そこでRubotyですよ!

弊社のSlackにはRubotyのチャットボットが住んでいます。このボットは通常のメッセージを見ているため、ワークフローからのメッセージ送信でコマンドを起動できます。

f:id:kokuyouwind:20191023125926p:plain:w300

こんな感じで、普通に反応してくれます。もちろんechoのようにメッセージ内容を参照するコマンドも問題なく機能します。

f:id:kokuyouwind:20191023174316p:plain:w300

つまりワークフローとRubotyを組み合わせれば、外部サービスとの連携なども自由にできるわけですね!*1

休暇申請

Misocaでは休暇予定が他の人にわかるよう、シフトカレンダーに予定を作成するルールがあります。

f:id:kokuyouwind:20191023175045p:plain:w400

こんな感じでGoogleカレンダーに入れるルールのため、カレンダーを見れば今日だれが休みなのかわかるようになっています。*2

ただ毎回手で予定を入れるのは面倒なので、チャットボットからカレンダー予定を作れるようにしています。

f:id:kokuyouwind:20191023175644p:plain:w400

これだけでも結構便利なのですが、フォーマットを間違えると反応してくれなくて悲しいなどの事故を起こしがちです。またコマンドでは休みの開始日-終了日を指定しますが、実際には1日単位で取得することが多いためちょっと冗長な指定になってしまいます。

そこでワークフローを使うと…

f:id:kokuyouwind:20191023175859p:plain:w300

このメニューから「有給取得(一日分)」を選ぶことでフォームが開きます。

f:id:kokuyouwind:20191023180532p:plain:w300

ここに必要事項を埋めてSubmitすることで、カレンダー予定を作ることができます。

日付のところは現状だとテキスト入力です。カレンダーコンポーネントが使えるようになってくれるともっと便利になりますね。

ちなみに、作成者のコメントはこちら。

f:id:kokuyouwind:20191023180955p:plain:w400

はい。

リリース作業のワークフロー化

もう少し実用的な例でいきましょう。

Misocaでは本番へのリリース作業を「リリースしたい」「リリース開始」という2つの発言でできるようにしています。*3*4

f:id:kokuyouwind:20191024131816p:plain:w400

f:id:kokuyouwind:20191024131841p:plain:w400

こんな感じでリリース作業を行っています。

これも十分に便利なのですが、「リリースしたい」と「リリース開始」を打ち間違える事故があったり、リリース内容の見出し部分を手で書くのが結構めんどくさかったりといった点が気になっていました。

そこで、以下のようなワークフローを定義しました。縦に長いので画像を3分割しています。

f:id:kokuyouwind:20191024181636p:plain:w400f:id:kokuyouwind:20191024181648p:plain:w400f:id:kokuyouwind:20191024181658p:plain:w400

実際に使ってみると、以下のようになります。

f:id:kokuyouwind:20191024182500p:plain:w400f:id:kokuyouwind:20191024182626p:plain:w400

リリース準備が整ったら、以下のフォームにリリース内容を記入します。

f:id:kokuyouwind:20191024182845p:plain:w300

このフォームを送信すると、リリース内容が共有されたうえでデプロイが始まります。

f:id:kokuyouwind:20191024182639p:plain:w400

手でRubotyを起動していた箇所がワークフローから起動されるようになり、しかもリリースカテゴリなどもフォームを埋めるだけになりました。

left blankの部分が邪魔、そもそも手でカテゴライズしてるのがあまりイケてない、などの課題はありますが、従前と比べてミスしやすい箇所がなくなったことでリリース作業がしやすくなっています。

💬 感想

Slackワークフローは現状だと少々機能不足ですが、チャットボットを使った作業フローはそのまま置き換えることができて大変便利でした。みなさんもチャットボットと連携させて、外部サービスを絡めた作業の自動化を試してみてはいかがでしょうか。

今後は機能を強化して、ワークフロー機能のなかで「Slackコマンドの発行」「入力に応じたワークフローの分岐」などが入ってくれると使い道が広がりそうですね。とても楽しみです。

📢 宣伝

MisocaではSlackワークフローを使ってChatOpsしたいエンジニアを募集しています。

www.wantedly.com

*1:もちろんHubotとかでも問題なく動くと思います

*2:休みの理由は特に入れなくて良いのですが、自分はたまにネタに走って入れています

*3:「リリースしたい」でリリース準備が開始されてCIやステージ環境でのビジュアルテストを行い、「リリース開始」で本番へのデプロイが行われます。実際にボットがやっていることは「特定ブランチから特定ブランチへのpush」のみで、GitHub WebHookによってJenkinsやCodeDeployが起動するようになっています。

*4:ブランチを更新した際にGitコミットや差分参照URLも出していますが、これらはモザイクをかけています