【SVN】SVNコミットとChatworkを連携!

こんにちは、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アニメーション、テクニカルアーティストによるツール開発などを得意としています。
新規立ち上げにおけるコンサルティングから量産制作まで幅広く対応可能な体制を保有しており、出向にも柔軟に対応しております。


yamamoto takuya

COYOTE 3DCG STUDIO ツール作成・パイプライン系TA。
Maya, Photoshop, Unityのツール開発やサーバー管理を行っています。
Qtを使ったUI作成が好きです。
老後は猫と暮らしたい。

投稿者記事

  1. 【PySide】QToolButton ボタン色が反映されない解決法

    2024-05-28

  2. 【Photoshop】起動時にスクリプトを実行する方法

    2023-08-29

  3. 【PySide】QtDesignerでDrag and DropできるWidget設定

    2023-06-28

  4. Mayaツール開発入門!コマンド調査テクニック

    2022-10-26

関連記事

  1. いまさら聞けない業界用語 ~ライティング編②~

    2021-08-31

  2. 【PySide】QToolButton ボタン色が反映されない解決法

    2024-05-28

  3. 【Unreal Engine】ブループリントを使用してFBXのインポートを自動化する方法

    2022-12-07

  4. いまさら聞けない業界用語 ~ライティング編①~

    2021-07-27

スキルレーダーチャート

テクニカルアーティスト専用
スキルレーダーチャート
どなたでも無料でご利用いただけます。

ABOUT

TECH COYOTE​

テクニカルアーティストの為のまとめサイトです。​
本サイトでは、ツール開発、業務効率化等について情報発信をしていきます。

COYOTE 3DCG STUDIO

C&R Creative Studios

難易度別

RECENT TWEET

ページ上部へ戻る