前回の
GitHub WebhooksによるSlackとの連携
前回の
GitHubを活用した開発ワークフロー
Pull Requestやissueなどの通知について、
しかし、
GitHub Webhooksの設定
GitHub Webhooksは、
Webhookの設定方法については、
Webhookを受信するアプリケーションの作成
では、
PerlとSlackの連携には、WebService::Slack::WebApi
モジュールを用いますMojolicious::Lite
を用います
前回の例ではチーム内のメンバーを取得していましたが、
use Mojolicious::Lite -signatures;
use JSON;
use Pithub;
use WebService::Slack::WebApi;
my $slack_token = 'my_slack_token_xxxxxxxx';
my $github_token = 'my_github_token_xxxxxxx';
# 連携したいSlackのチャンネルID
my $slack_channel_id = 'XXXXXXXX';
my $pit = Pithub->new(token => $github_token);
post '/:payload' => sub ($c) {
# トリガしたイベント名
my $method =
$c->req->headers->header('X-GitHub-Event');
# ペイロード(イベントデータ本体のJSON)
my $payload = eval { decode_json $c->req->body };
# イベントをトリガした際のアクション
my $action = $payload->{action};
# Pull Requestイベント受信時
if ($method eq 'pull_request') {
# Pull Request作成時にレビュアーが未設定の場合
if ($action eq 'opened'
&& !$payload->{requested_reviewers}) {
update_random_reviewer($payload);
}
# レビュアーが設定された場合
if ($action eq 'review_requested') {
# アサインされたユーザーをSlackに通知
post_slack($payload->{requested_reviewer}
->{login} . " さんがアサインされました。\n"
. $payload->{pull_request}->{html_url});
}
}
# レビューコメント受信時
if ($method eq 'pull_request_review_comment') {
if ($action =~ /created|edited/) {
# レビューコメントをSlackに通知
post_slack($payload->{comment}->{body}
. "\n" . $payload->{comment}->{html_url});
}
}
$c->render(json => {success => 1});
};
sub update_random_reviewer {
my $payload = shift;
my $random_user = random_collaborator($payload);
my $pull = $payload->{pull_request};
# GitHub APIで取得したコラボレータをレビュアーに設定
$pit->repos->pull_requests->reviewers->update(
repo => $pull->{base}->{repo}->{name},
user => $pull->{base}->{user}->{login},
data => { reviewers => [$random_user] },
pull_request_id => $pull->{number},
)->response;
}
sub random_collaborator {
my $payload = shift;
my $pull = $payload->{pull_request};
# GitHub APIでリポジトリのコラボレータ一覧を取得
my $res = $pit->repos->collaborators->list(
user => $pull->{base}->{user}->{login},
repo => $pull->{base}->{repo}->{name},
)->response;
my $json = decode_json($res->content);
my @users = ();
for my $user (@{$json}) {
# Pull Request作成者以外を対象にする
if ($user->{login} ne $pull->{user}->{login}) {
push @users, $user->{login};
}
}
# ランダムに1人抽出
my $randomized_user = $users[int(rand(@users))];
return $randomized_user;
}
sub post_slack {
my $message = shift;
my $slack_api =
WebService::Slack::WebApi->new(
token => $slack_token
);
# Slackにメッセージを通知
$slack_api->chat->post_message(
channel => $slack_channel_id,
text => $message,
);
}
app->start;
このアプリケーションを、https://
のように/payload
を付けてください。
このように、
まとめ
駆け足になりましたが、
さて、
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT