私はSlackにかなり慣れていません。チームを作成し、SVN リポジトリとの統合を追加しました。「post-commit」スクリプトをセットアップし、目的の Slack チャネルで通知を受け取りました。それが行く限り、すべてが良いです。
Slack チャンネルの通知をカスタマイズしたいのですが、うまくいきません。
コミット後のスクリプトは Perl ベースです。多数のテンプレートが利用可能です。私はそれを使用し、次のように変更されたファイルを含める行を追加しました。
my $files = `/usr/bin/svnlook changed -r $ARGV[1] $ARGV[0]`;
my $date = `/usr/bin/svnlook date -r $ARGV[1] $ARGV[0]`;
my $log = `/usr/bin/svnlook log -r $ARGV[1] $ARGV[0]`;
my $who = `/usr/bin/svnlook author -r $ARGV[1] $ARGV[0]`;
chomp $who;
my $payload = {
'revision' => $ARGV[1],
'date' => $date,
'author' => $who,
'log' => $log,
'files' => $files,
};
my $ua = LWP::UserAgent->new;
$ua->timeout(15);
my $req = POST( "https://${opt_domain}/services/hooks/subversion?token=${opt_token}", ['payload' => encode_json($payload)] );
Slack チャネルで受け取る唯一のメッセージは次の形式です。
<rev number>:<author>-<log message>
日付が表示されず、変更されたファイルのリストが Slack メッセージに表示されない理由がわかりません。関連する svnlook コマンドをサーバー上で手動で実行すると、期待どおりの結果が得られます。スクリプトの関連する部分を次のように変更すると:
my $payload = {
'wibble' => $ARGV[1],
'date' => $date,
'author' => $who,
'log' => $log,
'files' => $files,
};
次に、手動でフックを呼び出します
post-commit /var/svn/repo 5966
(例) 以下を含む出力が得られます。
payload=%7B%22wibble%22%3A%225966%22
(私が期待した/望んでいたように)しかし、その後
Response:
HTTP/1.1 500 Server Error
Connection: close
...
X-Cache: Error from cloudfront
X-Frame-Options: SAMEORIGIN
invalid_payload
ペイロードがメッセージを指定することを素朴に期待していたので、次のようなメッセージを作成できます。
revision: 5696
date: 2016/03/14 12:00:00
author: ...
log: <log text>
files: myfile.c, myfile.h
上記の例では、取得できるかどうか疑問に思っていました
wibble: 5696
したがって、Slack 側の何かが、受信したJSONの特定のフィールドのみを必要とし、何らかのルールに従ってチャネル メッセージにフォーマットするという結論に達する必要があります。どのフィールドが受け入れ可能で、どのように書式設定を制御できるかについては、まったくわかりませんでした。たとえば、無効なペイロードに関するエラーが発生しないという事実は、日付とファイルのフィールド名が有効であることを示唆していますが、それらを Slack メッセージに表示するにはどうすればよいでしょうか?