Perl Hackers Hub
第67回 GitHub APIによるチーム開発の効率化 ―基本操作から,GitHub Webhooksの活用まで(2)
2021年6月18日
初出:WEB+DB PRESS Vol.122(2021年4月24日発売)
Perl, プログラミング言語, GitHub, GitHub API, GitHub Webhooks, チーム開発, 開発, 運用, 管理
前回の
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
を付けてください。
このように,
- 注1)
WebService::Slack::WebApi
について詳しくは,本連載第37回 「PerlでInfrastructure as Code ──IaaSやSaaSをコードで自動化」 を参照してください。 - 注2)
Mojolicious::Lite
について詳しくは,本連載第33回 「MojoliciousでかんたんWebアプリケーション開発」 を参照してください。 - 注3)
- ngrokについては,
本連載第44回 「LINE Messaging APIで作るchatbot ──LINE::Bot::APIとngrokでお手軽に!」 でも紹介しています。
まとめ
駆け足になりましたが,
さて,
本誌最新号をチェック!
WEB+DB PRESS Vol.128
2022年4月23日発売
B5判/160ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-12789-3
- 特集1
演習で慣れる!
データベース入門
SQL操作,テーブル設計,分析用データ処理 - 特集2
クラウド構築ツールの大本命!
ゼロから学ぶTerraform - 特集3
チャットやIssueでちゃんと伝えたい!
エンジニアのための英語
Perl, プログラミング言語, GitHub, GitHub API, GitHub Webhooks, チーム開発, 開発, 運用, 管理
バックナンバー
Perl Hackers Hub
- 第71回 ISUCONの実装から最近のPerlを学ぶ ―わかりやすく変更しやすいコードを実現する考え方と方法(2)
- 第71回 ISUCONの実装から最近のPerlを学ぶ ―わかりやすく変更しやすいコードを実現する考え方と方法(1)
- 第70回 Raisin入門 ―Rest APIマイクロフレームワークを使ってみよう!(2)
- 第70回 Raisin入門 ―Rest APIマイクロフレームワークを使ってみよう!(1)
- 第69回 表形式データを操るUNIXシェル型Perl製コマンド群 ―ビッグデータ時代の汎用的なデータ整備と分析のために(2)
- 第69回 表形式データを操るUNIXシェル型Perl製コマンド群 ―ビッグデータ時代の汎用的なデータ整備と分析のために(1)
- 第68回 他言語のライブラリをPerlに移植する(2)
- 第68回 他言語のライブラリをPerlに移植する(1)
- 第67回 GitHub APIによるチーム開発の効率化 ―基本操作から,GitHub Webhooksの活用まで(2)
- 第67回 GitHub APIによるチーム開発の効率化 ―基本操作から,GitHub Webhooksの活用まで(1)