感動の最終回だよ〜
思いの外長くなってしまったこの連載……。今回が……最後です……。
前回は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); }
流れ的には……、
- デプロイ指示ファイルとロックファイルの有無をチェック
- ロックファイルを生成
- デプロイとクリーンアップを実行
- Incoming Webhookを使って処理結果をSlackに通知
って感じですね。
Incoming Webhookを使えるようにする
しれっと、「Incoming Webhookを使って〜」とか書いちゃいましたが、何もせずに使えるわけではないので使えるようにしなければならないのdeath!
といっても、簡単な話なんですけどね(テヘペロ
まずは、https://www.slack.com/apps/A0F7XDUAZ-incoming-webhooksにアクセスしませぅ!……権限持ったユーザでログインしてね☆
上記のような画面になるので、「Add Configuration」っていう緑のボタンをポチッと!
上記のような画面になるので、メッセージをドーンしたいチャンネルを選択ぅ!
するとこんな感じの設定画面になるです!各項目はこんな感じぃ〜。
項目名 | 必須 | 説明 |
---|---|---|
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もどきなデプロイシステムをご紹介しました。
実際にはもうちょっと手を入れていたりしますが、ここまでの作業をゴニョゴニョするとこんな感じのブツが出来上がります。
当社ではこのチャンネル自体は誰でも参加可能なので、開発の状況やデプロイは誰でもやることができますよ〜。
_ノ乙(、ン、)_
もっといい手段もあるけどね〜
今回ご紹介した方法でもいいんですけど、デプロイするならもっと良い方法もあるんですよね〜。まあ、そのあたりはいい感じにアレしていただければ。
しかしSlackのIntegrationというかWebhook系は簡単に使えて良いですね!これを応用すれば、お好きな言語でBotとか作り放題ですよ。しかもお手軽に!
あとでなにか作ってみても良いかもなぁ……。