git push を Chatwork や Slack へ通知する方法

Gitクラウド

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

Chatwork 側の設定
Chatwork へのメッセージ送信には、Chatwork API を利用します。
まず Chatwork へログインし、右上のご自分の名前をクリックし、「サービス連携」を選択します。

サービス連携

左メニューの「API Token」をクリックし、パスワードを入力して API トークンを取得します。

APIトークン

表示された API トークンは後から利用するためメモしておきます。

APIトークンの取得

なお、アカウントがビジネスプランの場合、API の利用には組織管理者からの承認が必要となります。

APIの利用申請

これで準備は完了です。


フックスクリプトの書き方
フックのスクリプトは.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"

	# ここから
	room_id="xxxxxxxx" # https://www.chatwork.com/#!ridXXXXXXXxのXXX部分
	api_token="xxxxxxxxxxx" # 取得したAPIトークン

	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} 本番適用されました。"

	# CURL で Chatwork API を呼び出す
	curl -X POST -H "X-ChatWorkToken: ${api_token}" -d "body=${message}&self_unread=0" "https://api.chatwork.com/v2/rooms/${room_id}/messages"
	# ここまで

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ドキュメント(チャットに新しいメッセージを追加)


続いて 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

メッセージが投稿されました。

Slackメッセージ



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

コメント