git push を Slack へ通知する方法

Gitクラウド

git pushの際に Slack へ通知メッセージを送信する場合の Slack の設定やフックスクリプトの書き方について説明します。

Slack 側の設定
Slack へのメッセージ送信には、Slack アプリの Incoming Webhooks という機能を利用します。

まず Slack へログインした状態で以下の URL へアクセスします。

https://api.slack.com/apps/

Slack API

「Create an App」をクリックして Slack アプリを作成します。
アプリの名前と当該ワークスペースを選択し、「Create App」をクリックします。

Create a Slack App

左メニューの「Incoming Webhooks」を選択し、Active Incoming Webhooks を On にします。

Incoming Webhooks

「Add New Webhook to Workspace」というボタンが出てくるのでクリックします。

Webhook URLs for Your Workspace

チャンネルを選択します。

チャンネル選択

これで Webhook URL が取得できました。

Webhook URLs for Your Workspace

この Webhook URL をサンプルにあるように CURL で呼び出せば Slack へメッセージを送信できます。


フックスクリプトの書き方
フックのスクリプトは.git/hooks配下にあります。
前回の記事で紹介した post-update のフックスクリプトへ追記してみましょう。

参考: Git のフックを利用したデプロイの方法

#!/bin/sh

# 基本的に複数のブランチが同時に更新されることはないため、第一引数をチェックする
if [ $1 = "refs/heads/master" ]; then
	echo "deploy production"
	# GIT_DIR 環境変数が優先されるため、--git-dirでディレクトリを明示指定する
	ssh production "cd /path/to && git --git-dir=.git pull origin master"

	# ここから
	mhash=$(git log -1 --pretty=format:"%h" master)
	author=$(git log -1 --pretty=format:"%an" master)
	msg=$(git log -1 --pretty=format:"%s" master)
	message="*${author}* \`${mhash}\` - *${msg}*\n本番適用されました。"
	payload="payload={\"channel\": \"#チャンネル名\", \"username\": \"投稿ユーザ名\", \"text\": \"${message}\", \"icon_emoji\": \":computer:\"}"
	# CURL で Webhook URL を呼び出す
	curl -X POST --data-urlencode "${payload}" https://hooks.slack.com/services/XXX/XXX/XXX
	# ここまで

elif [ $1 = "refs/heads/develop" ]; then
	echo "deploy staging"
	ssh staging "cd /path/to && git --git-dir=.git pull origin develop"

fi

# リポジトリがHTTP公開の場合に必要(これがないと最新の情報をpullできない)
exec git update-server-info

参考までに、Chatwork だとこんな感じになります。
(事前に API Token の取得が必要になります)

curl -X POST -H "X-ChatWorkToken: ${api_token}" -d "body=${message}&self_unread=0" "https://api.chatwork.com/v2/rooms/${room_id}/messages"

参考: APIドキュメント(チャットに新しいメッセージを追加)


参考: Git を利用した開発環境・テスト環境・本番環境の構成
参考: Git ワークフロー(ブランチモデル)とその手順
参考: Git コンフリクトの解消
参考: Git のフックを利用したデプロイの方法

コメント