自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

SlackのIncoming/OutgoingなWebhookでChatOpsと言い張るなにかを作った話(Incoming Webhook編)

感動の最終回だよ〜

思いの外長くなってしまったこの連載……。今回が……最後です……。

前回はSlackからサーバへの通信部分が作れたので、今回はその続きをやりましょう。

流れは簡単デース

前回の最後に「デプロイ指示ファイル」なんてのが登場しました。まず、コイツについて説明を。……といっても、たいした話ではないです。

サーバ側ではこのファイルが存在するかを定期的にチェックしていて、ファイルがあったらデプロイに関する一連の処理をやってるだけ。つまりはサーバサイドのトリガーに使ってるファイルですね。

なんでこんなの噛ませてるの?……って話なんですが、単に非同期に処理したかっただけで深い意味はないっす(´・ω・`)

定期的なチェックにはCronを!

じゃあ、まずは定期的にファイルが存在するかをチェックするようにしてみましょう。

この手の処理をやるときは、Cronさんの助けを借りるのがTEPPANですよね〜。……というわけで、こんな感じで設定してます。

* * * * * /path/to/php /path/to/deploy.php >/dev/null 2>&1

こんな感じで書くと、/path/to/deploy.phpが1分ごとに1度呼び出されます。標準出力とエラー出力は/dev/nullに落としてますが、必要ならどっかのファイルにリダイレクトしておくとよいでせぅ。

紅の裁きで大地を焦がしてみる

まあ、細かい話は後にして、実際のコードを見ていただきましょうかね。ええ。

<?php
define('DEPLOYFILE', '/tmp/deploy');
define('LOCKFILE', DEPLOYFILE . '.lck');
define('LOGFILE', DEPLOYFILE . '.log');

define('SLACK_ENTRYPOINT', 'https://hooks.slack.com/services/T1234/DEADBEAF/SecretTokenIsHere');
define('DEPLOYPATH', '/path/to/deploy_path');

// Check deploy file
clearstatcache(true);
if (file_exists(DEPLOYFILE) and !file_exists(LOCKFILE)) {
    // Create lock file
    touch(LOCKFILE);

    // Compose deploy commands
    $command  = 'cd ' . DEPLOYPATH . ' && ';
    $command .= 'git pull > ' . LOGFILE . ' 2>&1 && ';
    $command .= 'chown -R apache.apache ./*  && ';
    $command .= '/bin/rm -f ' . LOCKFILE . ' ' . DEPLOYFILE;

    // Execute deploy commands
    $result = shell_exec($command);

    // Read log file and delete it
    $postdat = [
                 'username' => 'deployer',
                 'icon_emoji' => ':ghost:',
                                  'text' => 'デプロイをやってみたらこうなりましたよ!',
                 'attachments' => [
                     0 => [
                         'color' => '#B90A21',
                         'text' => htmlspecialchars(file_get_contents(LOGFILE), ENT_QUOTES, 'UTF-8')
                     ]
                 ]
               ];
    unlink(LOGFILE);

    // Post to entry point
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, SLACK_ENTRYPOINT);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postdat));
    curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ]);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);

    $result = curl_exec($curl);

    curl_close($curl);
}

流れ的には……、

  1. デプロイ指示ファイルとロックファイルの有無をチェック
  2. ロックファイルを生成
  3. デプロイとクリーンアップを実行
  4. Incoming Webhookを使って処理結果をSlackに通知

って感じですね。

Incoming Webhookを使えるようにする

しれっと、「Incoming Webhookを使って〜」とか書いちゃいましたが、何もせずに使えるわけではないので使えるようにしなければならないのdeath!

といっても、簡単な話なんですけどね(テヘペロ

まずは、https://www.slack.com/apps/A0F7XDUAZ-incoming-webhooksにアクセスしませぅ!……権限持ったユーザでログインしてね☆

pic01_resized

上記のような画面になるので、「Add Configuration」っていう緑のボタンをポチッと!

pic02_resized

上記のような画面になるので、メッセージをドーンしたいチャンネルを選択ぅ!

pic03_resized

するとこんな感じの設定画面になるです!各項目はこんな感じぃ〜。

項目名 必須 説明
Post to Channel Yes メッセージをポストするチャンネル。どれかひとつ選ぶ。
Webhook URL メッセージを送りつけるURL。ここにJSONとかでデータ突っ込む。ヒミツにしておく。
Descriptive Label No Integrationの一覧画面で識別するためのアレ。書かなくてもいいけど、書いとかないと数が増えたとき泣きを見る。
Customize Name No こいつのユーザ名。何でもOK。デフォルトのままでもOK
Customize Icon No コイツのアイコン。画像をアップロードするか絵文字を指定することも可。デフォルトのままでもOK。
Preview Message この設定でどんな感じになるかのプレビュー。確認して置くと吉。

シンプルですねぇ……。

メッセージの送り方〜

これはすっごく簡単で、JSON形式のデータをWebhook URLにPostしてあげるだけ!

細かい指定もいろいろできるので、下記URLを参照してみると幸せになれるかも!

最終的にこうなるよ!

全3回にわたって自社で使っているChatOpsもどきなデプロイシステムをご紹介しました。

実際にはもうちょっと手を入れていたりしますが、ここまでの作業をゴニョゴニョするとこんな感じのブツが出来上がります。

160711-0001

当社ではこのチャンネル自体は誰でも参加可能なので、開発の状況やデプロイは誰でもやることができますよ〜。
_ノ乙(、ン、)_

もっといい手段もあるけどね〜

今回ご紹介した方法でもいいんですけど、デプロイするならもっと良い方法もあるんですよね〜。まあ、そのあたりはいい感じにアレしていただければ。

しかしSlackのIntegrationというかWebhook系は簡単に使えて良いですね!これを応用すれば、お好きな言語でBotとか作り放題ですよ。しかもお手軽に!

あとでなにか作ってみても良いかもなぁ……。

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuta Hayakawa

2016年6月入社。2020年12月より取締役に就任しました。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

あと、我が子可愛い。

記事一覧