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とか作り放題ですよ。しかもお手軽に!

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

Yuta Hayakawa

Yuta Hayakawaマネージャー

投稿者プロフィール

普段は東京本社で社内システム開発を中心とした本社業務を担当しています。

最近、マネージャー(部長相当)職になりまして、不慣れなアレでアレしている毎日です。

音楽とコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

この著者の最新の記事

関連記事

コメントは利用できません。

募集中!(o゜▽゜)o

エンジャパン
求む、社長!
follow us in feedly

コッチもヨロシク!





最近のネタ!

  1. 2019-8-19

    Web で物理アニメーション・その3 「簡単な物理法則に従うアニメーションを作ろう」

    前回の回答 前回の回答から行きましょう。 前回の宿題は 以下のように、近づいて右下に抜けてい…
  2. 2019-8-15

    2019年7月度社員総会&懇親会@Nagoya

    愛知は、わざいかぬっかど! 大田です。 さて!(笑) 今回は7/10(水)に行われた、名古屋社員総…
  3. 2019-8-13

    2019年7月度社員総会&懇親会@東京

    はじめに 今年もやってきました!みんな大好き、夏季休暇の季節! 40度近い気温が毎日どこかで計測さ…
  4. 2019-8-12

    Web で物理アニメーション・その2 「単純なアニメーションを作ろう」

    前回の回答 さて、まずは前回の宿題の答え合わせから。 問題は 三角形を一つ、canvas 上…
  5. 2019-8-5

    Web で物理アニメーション・その1 「canvas で絵を描いてみよう」

    アニメーションを作ってみよう! 最近、動きがある Web ページが多くなりましたね。 ここ数年で …
ページ上部へ戻る

当サイトに掲載されているコンテンツ(文書、画像等)は、許可なく複製・転用等する事を禁じます。

「フェアネス方式®」(登録6150741)は、日本国内における株式会社エージェントグローの登録商標です。

当サイトでは最低限必要と考えられる場合において、会社名/サービス名/商品名などを記載している場合があります。
これらはあくまでも説明の必要性に応じて用いているものであり、各社の権利等を侵害を目的とするものではございません。
不適切と考えられる場合には、当社お問い合わせフォームよりご連絡ください。

当サイトでは®や™などの表記を省略させていただいております。