perl – 从SVN集成中自定义Slack中显示的消息

我是
Slack的新手.我创建了一个团队,并且我添加了与SVN存储库的集成.我已经设置了一个“post-commit”脚本,并在预期的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消息中?

最佳答案 如果要创建自定义消息,则应在API中使用
Incoming Webhooks.我怀疑你使用的是Subversion钩子,它可能有一个固定的消息布局.

在有效负载的文本键中发布所需的文本.这样你就可以像普通的Slack消息那样格式化它.

点赞