$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

git-pr-releaseのjsonオプションを利用してリリース情報のサマリーをSlackに投稿する

git-pr-releaseには--jsonオプションがあって、これはリリースPRを作り、その情報を標準出力にJSONで出力してくれる。これを利用することでgit-pr-releaseと連携していろんな用途に利用できる。

例えばこれを利用すると、以下のようにリリースPRのサマリー情報をSlackに投稿する、などの事ができる。下のものは適当にPerlスクリプトを書いてるけど、Pull RequestのAPIから取得された情報がJSONで渡ってくるので、いろんな言語から使えると思う。

use URI;
use JSON::XS qw(encode_json decode_json);
use List::UtilsBy qw(max_by);
use List::Util qw(sum);
use LWP::UserAgent;

# リリース用PRを作った後、その情報をSlackに投稿する

# git-pr-releaseしてjsonでデータを受け取る
my $release_json = `git-pr-release --json`;

my $data = decode_json($release_json);
my $release_pull_request = $data->{release_pull_request}; # リリースPRの情報
my $merged_pull_requests = $data->{merged_pull_requests}; # そのmergeされているPRの情報

# 追加行と削除行の合計が多いPRのタイトルを代表として表示する
my $max_merged_pr = max_by {
    $_->{data}->{additions} + $_->{data}->{deletions};
} @$merged_pull_requests;
my $max_merged_pr_title = $max_merged_pr->{data}->{title};

# 追加の合計行数を表示する
my $additions = sum map { $_->{data}->{additions} } @$merged_pull_requests;

# 削除の合計行数を表示する
my $deletions = sum map { $_->{data}->{deletions} } @$merged_pull_requests;

my $release_text = sprintf(
    "【リリース】 %s (%d件, +%d, -%d) %s",
    $max_merged_pr_title,
    scalar @$merged_pull_requests,
    $additions,
    $deletions,
    $release_pull_request->{data}->{html_url},
);

my $payload = {
    username => 'releasekun',
    text  => $release_text,
};

my $ua = LWP::UserAgent->new;
my $res = $ua->post('https://hooks.slack.com/services/...', {
    payload => encode_json($payload),
});