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執行役員

投稿者プロフィール

2016年6月入社。社内システムチームの全体統括担当として、東京本社にて本社業務を行っている。第5期(2019年12月1日)より執行役員に就任。日本語の能力を活かし、さまざまな分野の業務に携わる。

エンジニアとしての専門分野はGNU/LinuxやPHPのあたり。セキュリティにも興味を持っており、某IT系ニュースサイトにて連載経験があるのが密かな自慢。

プライベートではDTMを嗜んでおり、セール時を中心にプラグインを買いあさるのが日課。ハムスターと生活しており、愛らしい姿に日々癒されている。下手ではあるものの、ゲームもそこそこ楽しむ方。

この著者の最新の記事

関連記事

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

募集中!(o゜▽゜)o

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

コッチもヨロシク!



最近のネタ!

  1. 2019-12-7

    お小遣いを握りしめてガチャガチャをしにいく話【Agent Grow Advent Calendar 2019:7日目】

    (さらに…)…
  2. 2019-12-6

    2019年度エージェントグロー全社員総会の様子+二次会

    2019年度エージェントグロー全社員総会 さる2019年11月15日 (金) に行われました全社員…
  3. 2019-12-6

    ゲーム性があれば飽き性でも運動できた!【Agent Grow Advent Calendar 2019:6日目】

    この記事はAgent Grow Advent Calendar 2019 6日目の記事です。 はじ…
  4. 2019-12-5

    現代社会を生きる人々に贈るスッキリ映画5選【Agent Grow Advent Calendar 2019:5日目】

    この記事は Agent Grow Advent Calendar 2019 :5日目の記事です。…
  5. 2019-12-4

    来年の干支にちなんで世界の珍しいネズミと動物園をご紹介【Agent Grow Advent Calendar 2019:4日目】

    来年はネズミ年です。 この記事は Agent Grow Advent Calendar 2019 …
ページ上部へ戻る

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

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

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

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