スペースエージェントのChatBot

Posted by SpaceAgent Tech Blog スペテク on Monday, May 20, 2019

勉強会開催おじさんになってきた感がある @kaiba です。
勉強会で満足せず、ちゃんとアウトプット出さねば…。

スペースエージェントもChat Botを活用しており、業務効率化に努めています。
今日はスペースエージェントのChat Bot、Lilyを紹介します。

命名の理由

「リリースの効率化」が事の発端だったため、「リリー(Lily)」という名前に決まりました。
僕は釣りと魚が好きなので「mejina」とか「tobiuo」とかを挙げたのですが、多数決の結果選ばれませんでした…。

アイコンの選定

萌キャラっぽいのが良いとのことで、以下のサービスで生成しました。
https://make.girls.moe/#/

lily.png

なんとも言えない表情がいいですね。

実装の方法

HubotGoogle Apps Scriptを使って実装しています。

Hubot

Hubotはチャットの特定のキーワードをトリガーに動作するのが得意です。
例えば、こちらのタイミングで行いたいデプロイの実施などに向いています。
CoffeeScriptはもちろん、JavaScriptも書きたくなかったので、TypeScriptで記述しています。
TypeScriptの設定は以下のようになっています。

{
  "compilerOptions": {
    "lib": ["es5", "es6", "dom"],
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "./build",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true
  },
  "include": ["typescript"]
}

typescript配下に .ts ファイルを配置し、ビルドすると build ディレクトリにJavaScriptが吐かれます。

hubot --name "lily" --require ./build --adapter slack

あとはこのように起動するだけです。簡単ですね。

Google Apps Script

Hubotはチャットをトリガーに動くのは得意なのですが、定期実行は苦手です。
cronなどを使えば可能なのですが、歪な印象を持ちました。
定期実行したいものはGoogle Apps Scriptのトリガーで行うようにしました。
claspを使えばよかったのですが、その存在を知らず、JavaScriptを使っています。
npmのライブラリも使えないので、あまり複雑なことをしないようにしています。
Slackのライブラリを使用して、以下のようにメッセージを送っています。

function notifySlack(msg) {
  var prop = PropertiesService.getScriptProperties().getProperties();
  var slackApp = SlackApp.create(prop.SLACK_TOKEN); 
  slackApp.chatPostMessage("#my_channel", msg);
}

役割

GitHubのレビューの効率化

review.png

GitHubのレビュアーを指定すると、Slackで通知が来ます。
GitHubのWebhookからGoogle Apps Scriptを叩くことで実行しています。
Slackで通知はSlackの「My Keywords」にGitHubアカウント名を設定してもらい、運用でカバーしてもらいました。
あまり綺麗なコードではないのが心苦しいのですが、運用に合わせて好きに変更して使ってください。

リリース作業の効率化

release.png

Lilyの命名にもなったリリース作業として以下の作業をしてもらってます。
GitHubにリリース内容をまとめたPull Requestを作成し、POと確認し、リリース内容可否判断、リリース内容の周知をしています。

  1. github-pr-releaseを使用し、Pull Requestを作成する
  2. 作成したPull Request本文からJiraのチケット番号を取得し、チケットのタイトルを取得する
  3. Slackにこれからリリースする内容を通知する
  4. EMがリリース内容を最終チェックする
  5. POがリリース判定を行う
  6. 問題なければリリースを行う

実際のリリースもLilyにやってもらうこともできるのですが、誰でもチャットでリリースできてしまうため、本番機への反映は職人が手で行っています。

おみくじ

omikuji.png

Hubotで実装しています。地味に便利です。

import * as _ from "underscore";
module.exports = (robot: hubot.Robot<any>): void => {
  robot.respond(/omikuji (.+)/i, (msg: hubot.Response<any>) => {
    const targets = msg.match[1].split(/[ ・、,\s]+/);
    const result = _.shuffle(targets).join(", ");
    msg.reply("おみくじしたよ!\n" + result);
  });
};

t_wadaさんに怒られる

t_wada.png

(笑)

見えないものを見ようとする

oh_yeah.png

静寂を切り裂いていくつも声が生まれたよ(苦笑)

でぶと言わないようにする

dev.png

きれいな言葉を使うように心がけたいものです(苦笑)

まとめ

人間はミスをします。機械の任せられるところは機械に任せ、業務を効率化していきたいものです。