systembankスタッフのブログ

システムバンクスタッフのブログです。

SlackとSubVersionの連携(Windows)

Slackはじめました

しばらく更新できなかったのですが、社内メンバーのコミュニケーション用にSlackを使用し始めましたのでその設定やなんやで手が空きませんでした。

やっとこれでよいかなという設定になったのでこれに関して少し書こうかと。

slack.com

社内で運用しているシステムと何か連携させたいなと思っていたのでまずソース管理と連携してみました。

備忘録を兼ねてここに書き留めておこうと思います。

Subversion

subversion.apache.org

会社ではSubversionを使っているので(Gitに変えたいな)これのコミット時にSlackにメッセージを投稿します。

アプリの追加

Slackのアプリをワークスペースに追加します。

追加するのはカスタムインテグレーションのIncoming Webhookです。

SubVersionをWindowsServerに設定して使っているのでWindowsのコマンドを使ってメッセージを送ろうかと思ったのですが、いろいろできるのはPowerShellなのでこれで作ります。

Incoming Webhookの設定

アプリを追加するとどのチャンネルへ投稿するかを聞いてくるのでチャンネルを選択します。

するとWebhook URLが表示されるのでこれを書き留めておきます。

Slack側は一旦ここで設定終了。

SubVersionの設定

リポジトリのhooksフォルダに「post-commit.cmd」「Post-Commit.ps1」を作りました。

post-commit.cmd

powershell -ExecutionPolicy RemoteSigned -File %1\hooks\Post-Commit.ps1 -repo %1 -rev %2    

 PowerShellの実行権限をRemoteSigned にしてローカルファイルの実行には制限がないようにセットしてPost-Commit.ps1を実行するようにします。 -repo と -rev はPost-Commit.ps1内で利用する引数です、Subversionリポジトリのパスとコミットしたリビジョンがセットされます。

Post-Commit.ps1

Param([string]$repo, [int]$rev)
$author = svnlook author $repo -r $rev
$author += "さんがコミットしました。"
$log = svnlook log $repo -r $rev
$log = $log -split "`r`n"
$log = $log -join "`r`n"
$changed = svnlook changed $repo -r $rev
$changed = $changed -split "`r`n"
$changed = $changed -join "`r`n"
$changed = "```````r`n" + $changed + "`r`n```````r`n"
$dir = $repo.Split("\")
$repository = $dir[-1]
$text = "`{`"text`": `"Repository:$repository Revision:$rev`r`n$author`r`n$log`r`n$changed`"`}"
$Byte = [System.Text.Encoding]::UTF8.GetBytes($text)
Invoke-RestMethod -Uri "https://hooks.slack.com/services/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" -Method Post -Body $Byte

PowerShellスクリプトの中身はこんな感じです。

細かく解説入れておきます。

基本事項ですが$...は変数です。

Param([string]$repo, [int]$rev)

Paramコマンドで実行時のコマンドライン引数を変数に代入します。

括弧()内の変数名を呼び出しのコマンドライン引数の名前と一致させて保持します。

次行意向でSubversionのコマンドを使うのでそれに必要な引数を保持しました。

$author = svnlook author $repo -r $rev
$author += "さんがコミットしました。"

svnlookコマンドでコミットログを取得します。svnlook auther でコミットした人を取得できるので、その結果を変数に保持しておきます。

$log = svnlook log $repo -r $rev
$log = $log -split "`r`n"
$log = $log -join "`r`n"

svnlook logでコミットしたときに記入したメッセージを取得します。

PowerShellエスケープシーケンスはよくある[\]ではなく[`]なので[``````]は[```]になります。なので[`r`n]は改行コードです。

取得した内容の改行コードがその後の文字列編集でなぜかわからないけど消えてしまうので、やっつけですがsplitコマンド配列に変換、joinコマンドで変換した配列を改行コードを付けて結合しています。

$changed = svnlook changed $repo -r $rev
$changed = $changed -split "`r`n"
$changed = $changed -join "`r`n"
$changed = "```````r`n" + $changed + "`r`n```````r`n"

svnlookでコミットしたファイルの一覧が取得できます。

[``````]は[```]でSlackのコードブロック表示なのでコミットしたファイルを成形なしで表示するようにしています。

$dir = $repo.Split("\")
$repository = $dir[-1]

リポジトリパスをディレクトリ毎に区切って最後のディレクトリを取得しています。配列の最後を取得する場合は気持ち悪いですが添え字を-1にすると良いみたいです。

$text = "`{`"text`": `"Repository:$repository Revision:$rev`r`n$author`r`n$log`r`n$changed`"`}"

Slackに渡す内容をJSON形式に成形しています。ここではシンプルに内容(text)に今まで取得した情報の全てを載せています。

$Byte = [System.Text.Encoding]::UTF8.GetBytes($text)

Slackで受け付ける文字がUTF-8なので.NET FrameworkのUTF8エンコーディングクラスでエンコードしています。

Invoke-RestMethod -Uri "https://hooks.slack.com/services/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" -Method Post -Body $Byte    

最後がSlackに投稿する部分でLinuxcurlと同じようなコマンドでInvoke-RestMethodっていう何を行うかはっきりとわかる丁寧な名前のコマンドで送信します。

HTTPメソッドがPost、送信部分はBodyに付けて送信します。

これでSubversionとSlackが連携出来ました。