こんにちは、COYOTE 3DCG STUDIO TAのやまたくです。
弊スタジオでは、チャットツールにChatwork、データ管理にSVNを使用しています。
とあるチームから、「CheckフォルダにコミットするとリーダーへChatworkメッセージを自動で送信できないか?」
と相談があったので、今回はChatworkとSVNを連携させる方法をご紹介します。
目次
Chatwork APIトークンを取得
Chatworkを自動化させるためには、Chatwork APIを使用します。
下記URLからChatwork APIトークンを発行します!
APIトークンを発行する
Chatwork APIからメッセージ送信テスト
トークンが取得できたら、APIを使ってメッセージを送信してみましょう!
下記URLにアクセスし、テキストフィールドを埋め、`Try It!`ボタンを押すと、メッセージが送信されます。
room_idの調べ方
1. グループチャットを開く
2. 右上歯車アイコンをクリック
3. グループチャット設定をクリック
4. 一番下にroom_idが表示されています
SVNコミットしたら自動送信する設定
SVNサーバーにあるリポジトリにフックを設定して、コミット時にChatworkにメッセージを送信します!
1. リポジトリのhooksフォルダ内に`post-commit.bat`ファイルを作成する。
2. `post-commit.bat`ファイルに下記のコードを記述する。
@echo off
REM 現在のスクリプトのディレクトリを取得
set HOOKS_DIR=%~dp0
set REPOSITORY_PATH=%1
set REVISON=%2
REM Pythonスクリプトを実行してChatworkに通知
python "%HOOKS_DIR%chatwork_notify.py" "%REPOSITORY_PATH%" "%REV%"
1. `hooks`フォルダ内に`chatwork_notify.py`ファイルを作成する。
2. `chatwork_notify.py`ファイルに下記のコードを記述する。
import subprocess
import sys
import requests
CHATWORK_API_TOKEN = "xxxxxxxxxxx" # ここにAPIトークンを入力
CHATWORK_ROOM_ID = "xxxxxx" # ここにルームIDを入力
def get_svn_info(command, repository_path, revision):
"""svnlook コマンドを実行して、リポジトリの情報を取得する。
Args:
command (str): 実行する svnlook コマンド(例: 'author', 'log', 'changed')
repository_path (str): リポジトリのパス
revision (str): リビジョン番号
Returns:
str: コマンドの実行結果(標準出力)
"""
try:
result = subprocess.run(['svnlook', command, '-r', revision, repository_path], capture_output=True, text=True, check=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"svnlook コマンドの実行エラー: {e}")
return None
def send_chatwork_message(author, revision, log, api_token, room_id):
"""Chatwork API を使用してメッセージを送信する。
Args:
author (str): コミット者
revision (str): リビジョン番号
log (str): コミットメッセージ
api_token (str): Chatwork API トークン
room_id (str): Chatwork ルームID
"""
url = f"https://api.chatwork.com/v2/rooms/{room_id}/messages"
message = f"Log:\n{log}\n\n" \
f"Author: {author}\n" \
f"Revision: {revision}\n"
payload = {
"self_unread": 0,
"body": message
}
headers = {
"accept": "application/json",
"content-type": "application/x-www-form-urlencoded",
"x-chatworktoken": api_token
}
response = requests.post(url, data=payload, headers=headers)
if response.status_code != 200:
print(f"送信エラー: {response.status_code}, {response.text}")
else:
print("送信成功")
if __name__ == "__main__":
# コマンドライン引数からリポジトリパスとリビジョン番号を取得
repos, revision = sys.argv[1:3]
# リポジトリ情報を取得
author = get_svn_info("author", repos, revision)
log = get_svn_info("log", repos, revision)
# いずれかの情報が取得できなかった場合、スクリプトを終了
if author is None or log is None:
sys.exit(1)
# Chatwork にメッセージを送信
send_chatwork_message(author, revision, log, CHATWORK_API_TOKEN, CHATWORK_ROOM_ID)
これでコミットがあると、Chatworkにメッセージが送信されるようになりました!
send_chatwork_messageメソッドのmessage変数を変更することで、送信するメッセージをカスタマイズできます!
特定のディレクトリからコミットした時だけ送信
全てのコミットに対してメッセージを送信すると、メッセージが多くなりすぎてしまいます。
特定のディレクトリからコミットした時だけメッセージを送信するようにしましょう!
pythonにTARGET_DIRとchangedを追加して、コミット内容をチェックするようにします。
import subprocess
import sys
import requests
CHATWORK_API_TOKEN = "xxxxxxxxxxx" # ここにAPIトークンを入力
CHATWORK_ROOM_ID = "xxxxxx" # ここにルームIDを入力
TARGET_DIR = "trunk/works/check" # 監視する対象ディレクトリ
def get_svn_info(command, repository_path, revision):
"""svnlook コマンドを実行して、リポジトリの情報を取得する。
Args:
command (str): 実行する svnlook コマンド(例: 'author', 'log', 'changed')
repository_path (str): リポジトリのパス
revision (str): リビジョン番号
Returns:
str: コマンドの実行結果(標準出力)
"""
try:
result = subprocess.run(['svnlook', command, '-r', revision, repository_path], capture_output=True, text=True, check=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"svnlook コマンドの実行エラー: {e}")
return None
def send_chatwork_message(author, revision, log, api_token, room_id):
"""Chatwork API を使用してメッセージを送信する。
Args:
author (str): コミット者
revision (str): リビジョン番号
log (str): コミットメッセージ
api_token (str): Chatwork API トークン
room_id (str): Chatwork ルームID
"""
url = f"https://api.chatwork.com/v2/rooms/{room_id}/messages"
message = f"Log:\n{log}\n\n" \
f"Author: {author}\n" \
f"Revision: {revision}\n"
payload = {
"self_unread": 0,
"body": message
}
headers = {
"accept": "application/json",
"content-type": "application/x-www-form-urlencoded",
"x-chatworktoken": api_token
}
response = requests.post(url, data=payload, headers=headers)
if response.status_code != 200:
print(f"送信エラー: {response.status_code}, {response.text}")
else:
print("送信成功")
if __name__ == "__main__":
# コマンドライン引数からリポジトリパスとリビジョン番号を取得
repos, revision = sys.argv[1:3]
# リポジトリ情報を取得
author = get_svn_info("author", repos, revision)
log = get_svn_info("log", repos, revision)
changed = get_svn_info("changed", repos, revision)
# いずれかの情報が取得できなかった場合、スクリプトを終了
if author is None or log is None or changed is None:
sys.exit(1)
# 対象ディレクトリに変更がない場合、メッセージを送信せずに終了
if not any(TARGET_DIR in line for line in changed.splitlines()):
print("対象ディレクトリに変更がないため、メッセージを送信しません。")
sys.exit(0)
# Chatwork にメッセージを送信
send_chatwork_message(author, revision, log, CHATWORK_API_TOKEN, CHATWORK_ROOM_ID)
work/checkフォルダ以下にコミットした時だけメッセージが送信されるようになりました!
これで設定は以上です!
おわりに
今回はChatworkとSVNを連携させる方法をご紹介しました。
チームでのコミュニケーションを効率化するために、ぜひご活用頂けると嬉しいです。
COYOTE 3DCG STUDIO
公式HP:https://3d.crdg.jp/
COYOTE 3DCG STUDIOはクリーク・アンド・リバー社が運営するゲーム専門3DCG制作集団です。
キャラモデル、背景モデル、3Dアニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。