git push
の際に Chatwork や Slack へ通知メッセージを送信する場合の設定やフックスクリプトの書き方について説明します。
Chatwork 側の設定
Chatwork へのメッセージ送信には、Chatwork API を利用します。
まず Chatwork へログインし、右上のご自分の名前をクリックし、「サービス連携」を選択します。
左メニューの「API Token」をクリックし、パスワードを入力して 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
メッセージが投稿されました。
参考: APIドキュメント(チャットに新しいメッセージを追加)
続いて Slack の場合を説明します。
Slack 側の設定
Slack へのメッセージ送信には、Slack アプリの Incoming Webhooks という機能を利用します。
まず Slack へログインした状態で以下の URL へアクセスします。
https://api.slack.com/apps/
「Create an App」をクリックして Slack アプリを作成します。
アプリの名前と当該ワークスペースを選択し、「Create App」をクリックします。
左メニューの「Incoming Webhooks」を選択し、Active Incoming Webhooks を On にします。
「Add New Webhook to Workspace」というボタンが出てくるのでクリックします。
チャンネルを選択します。
これで Webhook URL が取得できました。
この 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
メッセージが投稿されました。
参考: Git を利用した開発環境・テスト環境・本番環境の構成
参考: Git ワークフロー(ブランチモデル)とその手順
参考: Git コンフリクトの解消
参考: Git のフックを利用したデプロイの方法
コメント