LoginSignup
17
17

More than 5 years have passed since last update.

年末だしSlack上のHubotの今年一年の労をねぎらってあげる

Posted at

この投稿について

私の働いているチームではSlack上のHubotを主役としたChatOpsを行っています。

スクリーンショット 2014-12-22 15.47.00.png

↑こんな感じで私のチームのHubotは擬犬化され、その名も「ワンコ」としてチームの為に働いてくれています。

そこで年末の今回はワンコの今年一年(とはいってもワンコは今年9月にチームにジョインしたので約4ヶ月間)の活躍ぶりを定量的に算出して、労をねぎらってあげたいと思います。

Hubotの働きぶりを計算する

ワンコ(Hubot)の働きぶりを図る方法として、SlackのAPIを用いました。

スクリーンショット 2014-12-19 23.31.14.png

SlackのAPIを叩いてワンコに対するコマンドを集計するPHPスクリプトを以下のように実装しました。
コード中のbot名などの数カ所を変えるだけで、みなさんのbotの働きぶりや、人気のコマンドが分かりますのでお試しください。
コードはGistにもあげています。

slackbot-contribution.php


<?php 


if (!getenv(SLACK_API_TOKEN)) {
    exit('You must set env SLACK_API_TOKEN');
}

ini_set('date.timezone', 'Asia/Tokyo');


{// You can change belows
    $slackbot_name = 'wanko';
    $bot_cmd_arr = array('ote', 'deploy', 'merge', 'update ref', 'assign', 'soba', 'container', 'omikuji', 'repo aliase');
    $start_date = '2014-01-01';
    $end_date = '2014-12-26';
}


$data = getMessage($slackbot_name);
$pageCnt = $data['pageCnt'];

$callCnt = 0;
$callCntPerCmd = array();
$callCntPerUser = array();


for ($page = 1; $page <= $pageCnt; $page++) {

    print $page. '/'. $pageCnt. "\r";

    $data = getMessage($slackbot_name, $page);
    $messages = $data['messages'];

    if (!$messages) {
        continue;
    }

    foreach ($messages as $message){

        //期間内かチェック
        if ( $message['ts'] < strtotime($start_date) || $message['ts'] > strtotime($end_date) ) {
            continue;
        }

        $isValid = false;
        //対象コマンドかチェック
        foreach ($bot_cmd_arr as $bot_cmd) {
            if(preg_match("/^{$slackbot_name} {$bot_cmd}/", $message['text'])){
                $callCnt++;
                $callCntPerCmd[$bot_cmd]++;
                $callCntPerUser[$message['username']]++;                
                break;
            }
        }

    }
}

arsort($callCntPerCmd);
arsort($callCntPerUser);

echo $callCnt. PHP_EOL;
echo "{$slackbot_name} contributed {$callCnt} times!!!". PHP_EOL;
echo PHP_EOL;
echo '[ Popular command ranking ]'. PHP_EOL;
foreach ($callCntPerCmd as $cmd => $cnt) {
    echo "{$cmd} : {$cnt} times". PHP_EOL;
}
echo PHP_EOL;
echo PHP_EOL;
foreach ($callCntPerUser as $user => $cnt) {
    echo "{$user} : {$cnt} times". PHP_EOL;
}

function getMessage($slackbot_name, $page = null){

    $url = 'https://slack.com/api/search.messages';
    $params = array(
        'token' => getenv(SLACK_API_TOKEN),
        'query' => $slackbot_name,
        'sort' => 'timestamp'
    );

    if ($page) {
        $params['page'] = $page;
    }

    $data = http_build_query($params);
    $url = ($data != '')?$url.'?'.$data:$url;

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_TIMEOUT, 2);
    $res = curl_exec($ch);

    $resArr = json_decode($res, true);
    return array('pageCnt'=>$resArr['messages']['pagination']['page_count'], 'messages'=>$resArr['messages']['matches']);
}

結果発表

それではいよいよ上述したスクリプトを実行して計算したワンコの活躍ぶりを発表していきます。

今年(9月~)の総リクエスト回数

10,343

今年(9月~)のチームメンバーのワンコに対するリクエストは10,343回となり、10,000回超になりました。
これは営業日で割ると1日120回超となり、非常に多くのリクエストに応えてくれたことになります。

人気コマンドランキング

では次に、リクエスト回数が多かったコマンドを第5位からカウントダウン形式で見ていきます。

第5位

wanko assign ( 40 times )

スクリーンショット 2014-12-22 15.01.29.png

第5位にランクインしたのは、assignコマンドでした。
これはGitHub上でプルリクエストが作られた際、レビュアーがワンコによって自動アサインされるのですが、そのレビュアーが不在であったり、別のメンバーにレビューしてもらいたい際などに使う手動アサインのコマンドです。

第4位

wanko ote ( 60 times )

スクリーンショット 2014-12-22 15.03.02.png

第4位にランクインしたのは、oteコマンドでした。
これは癒し系のワンコ生存確認コマンドです。
Hubotにはpingなどの生存確認コマンドがデフォルトで用意されていますが、
デザイナー等の非エンジニアも含めたチームでのChatOpsなので、oteコマンドの方が馴染みやすく心も和みます。

第3位

wanko update ref ( 256 times )

スクリーンショット 2014-12-22 14.59.53.png

第3位にランクインしたのは、update refコマンドでした。
これは検証環境用のブランチのheadをmasterブランチのheadに合わせるコマンドです。
このコマンドについての詳細は、「ChatOps時のブランチ運用戦略」にまとめてあります。

第2位

wanko deploy ( 337 times )

スクリーンショット 2014-12-22 15.08.57.png

第2位にランクインしたのは、deployコマンドでした。
このコマンドを打つと、ワンコがmasterブランチからdeployment/productionブランチ(商用ブランチ)へのプルリクエストを作ってくれます。
あとは最終確認者がGitHub上でマージボタンをポチっと押すだけでリリースとなります。
デプロイ周りの運用の詳細は「Slack / Hubot / GitHub / CircleCI によるChatOpsなデプロイ方法」にまとめてあります。

第1位

wanko merge ( 341 times )

z_スクリーンショット_2014-12-22_15_09_15.png

見事2014年の第1位に輝いたのは、mergeコマンドでした。
これはGitのマージをChatOps経由で行うコマンドであり、masterブランチやdeployment/productionブランチ(商用ブランチ)へのマージは拒否されるように実装してあるので、安全なブランチ管理が行えます。

最後に

今回はSlackAPIを使ってワンコへのSlack上からのリクエスト回数を集計する形でその活躍ぶりを定量化してみました。

ただし実際にはワンコは今回集計したSlack上からのリクエストだけでなく、他のものをトリガーとした仕事もたくさん行っています。
例えば、プルリクエストの自動アサインアプリケーションエラーの定期的な監視と通知等がそれにあたります。

私のチームの開発フローにワンコは既に無くてはならない存在になっていますが、来年は更にワンコに芸を仕込んで、より便利で楽しいChatOpsライフを送りたいと思います。

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17