0%

Gitlab CE Webhook

处理 Gitlab Issue 的事件,使用微信公众号的模板消息,提醒项目成员。

使用 Laravel 框架来接收 Gitlab 的事件,通过 gitlab 用户 email 和该用户的公众号 openid 的map,用公众号 push 模板消息 推送给对应的 openid

用这个包接收 webhook :

https://github.com/TJVB/gitlab-webhooks-receiver-for-laravel
扩展介绍:这个包处理 webhook 数据的接收、验证和存储。收到后,它将发送一个事件,该事件可用于处理适合您的应用程序的数据。

在项目-设置-Webhooks可以设置链接和token以及通知类型。

按照 gitlab-webhooks-receiver-for-laravel 的文档,Listener事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

namespace App\Listeners;

use TJVB\GitLabWebhooks\Events\HookStored;
use App\Lib\WxNotice;

class GitlabWebhooksListener
{
public function __construct()
{
}

public function handle(HookStored $event)
{
$body = $event->getHook()->body;
..

// 获取要发信的成员
$exclude_user_id = $user_id; // 排除发消息的人
if (!key_exists($project_id, config('wxmap'))) {
return;
}
$users = config('wxmap')[$project_id];
if (key_exists($exclude_user_id, $users)) {
unset($users[$exclude_user_id]);
}
$users = array_filter(array_values($users));

foreach ($users as $key => $value) {
if ($body['event_type'] == 'note') {
$res = WxNotice::note($value, $title, $user, $created_at, $note, $url);
}
}
}
}

在 App\Providers\EventServiceProvider.php 设置 listen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
...
\TJVB\GitLabWebhooks\Events\HookStored::class => [
\App\Listeners\GitlabWebhooksListener::class,
],
...
];
..

WxNotice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
namespace App\Lib;

use EasyWeChat\Factory;

class WxNotice
{
public static function note($open_id, $title, $user, $date, $content, $url)
{

$config = [
'app_id' => 'xx',
'secret' => 'xx',

// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
'response_type' => 'array',

//...
];

$app = Factory::officialAccount($config);

$res = $app->template_message->send([
'touser' => $open_id,
'template_id' => 'xx',
'url' => $url,
'data' => [
'first' => $title,
'keyword1' => $user,
'keyword2' => $date,
'keyword3' => $content,
'remark' => ''
]
]);
return $res;
}
}

wxmap.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

return [

// 上海朗沐/询价
'4' => [ // project id
'1' => 'xx', // 我的openid
'5' => '', //
'6' => '' // aa
// .. 把这个项目里的用户都加进来,这样才能通知到
],

// xx
'6' => [ // project id
'11' => '', //
'15' => '', //
'16' => '', //
'7' => '' //
],

];

欢迎关注我的其它发布渠道