前回の
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


