本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはtecklこと菅井茂樹さんで、
本稿のコードは、
チーム開発をもっと便利にするGitHub API
ソフトウェア開発にとって欠かせない存在となったGitHubですが、
本稿では、
GitHub APIとは
GitHub APIとは、
GitHub APIの種類
2021年3月現在、
GitHub Enterpriseの場合
GitHub Enterpriseという法人向けのGitHubを利用している方もいるでしょう。GitHub Enterpriseも、
GitHub API開発の準備
GitHub APIを使う準備を行いましょう。
OAuthトークンの取得
GitHub APIでは、
OAuthトークンの取得には、
GitHub APIクライアントのインストール
CPANにはPerlでGitHub APIを利用するためのクライアントがいくつも公開されています。代表的なのはPithub
とNet::GitHub
です。どちらもほとんど同じことができますが、Pithub
を使用します。Pithub
はv3 REST APIのみの対応となるため、Net::GitHub::V4
を利用するとよいでしょう。
Pithubは、
$ cpanm Pithub $ perl -MPithub -E 'say $Pithub::VERSION' 0.01036
これで、 それでは、 たとえば運用しているOrganizationが、 ※ これ以降に登場するコードでは、 この程度であればブラウザ上での確認で十分ではないかと思われるかもしれませんが、 なお、 たとえばみなさんのOrganizationにおいて、 ここからは、 たとえばissueの件数が増えてくると、 次のコードは、 これをcronなどに設定して毎日特定の時間に未解決のissueの通知を流すようにすることで、 Pull Requestの操作もAPIで行えます。たとえばPull Requestのレビュアーは、 レビューを担当するTeam IDは、 なお、 たとえば、 これも定期的に通知を流すようにすることで、 <続きの 2022年8月24日発売GitHub APIの実用例
組織の公開リポジトリ一覧を取得する
use strict;
use warnings;
use feature 'say';
use Pithub;
# 前節で取得したOAuthトークン
my $token = 'my_oauth_token';
my $pit = Pithub->new(
token => $token,
);
my $result = $pit->repos->list( …(1)
org => 'org_name_xxxxx',
params => {
type => 'public',
},
);
while ( my $row = $result->next ) {
say $row->{name};
}
$pit->repos
としている箇所は、my $pit = Pithub->new(
token => $token,
api_uri => 'https://example.com/api/v3/',
);
組織のメンバー一覧を取得する
my $pit = Pithub->new(
token => $token,
);
my $res = $pit->orgs->members->list( …(1)
org => 'org_name_xxxxx',
params => {
filter => '2fa_disabled',
},
);
my $members = $res->content;
for my $member (@{$members}) {
say $member->{login};
}
$pit->orgs
としている箇所は、issueを検索する
bug
のラベルが付いたissueを取得して、use JSON;
my $pit = Pithub->new(
user => 'XXXXX',
repo => 'YYYYY',
token => 'my_oauth_token',
);
my $res = $pit->repos->issues->list(
params => {
state => 'open',
labels => 'bug', # 抽出対象のラベル
since => '2021-01-01', # 更新日(設定日時以降)
direction => 'asc', # 昇順
sort => 'updated', # 最終更新日時順
}
)->response;
my $json = decode_json($res->content);
for my $rec (@{$json}) {
say(join(',', $rec->{html_url}, $rec->{title}));
}
Pull Requestのレビュアーをランダムに設定する
use JSON;
my $pit = Pithub->new(
token => 'my_oauth_token',
);
# レビュアーの所属するTeam ID。実際は数字
my $reviewer_team_id = NN;
# レビュアーを指定するPull Request ID。実際は数字
my $pull_request_id = MM;
# レビュアー担当のチームメンバー一覧を取得
my $res = $pit->orgs->teams->list_members(
team_id => $reviewer_team_id,
)->response;
my $json = decode_json($res->content);
my @members = ();
for my $member (@{$json}) {
push @members, $member->{login};
}
# レビュアー用のチームメンバーからランダムに1人を抽出
my $randomized_member = $members[int(rand(@members))];
# ランダムに抽出したメンバーをレビュアーに設定
$pit->repos->pull_requests->reviewers->update(
repo => 'XXXXXX',
user => 'YYYYYY',
pull_request_id => $pull_request_id,
data => { reviewers => [$randomized_member] },
);
レビューが放置されているPull Request一覧を取得する
use Encode;
use Time::Piece;
use Time::Seconds;
use JSON;
my $now = localtime;
my $yesterday = $now - ONE_DAY;
my $pit = Pithub->new(
token => 'my_oauth_token',
);
my $response = $pit->repos->pull_requests->list(
user => 'XXXXX',
repo => 'YYYYY',
params => {
state => 'open',
}
)->response;
my $json = decode_json($res->content);
for my $rec (@{$json}) {
my $updated_at = Time::Piece->strptime(
$rec->{updated_at}, '%Y-%m-%dT%H:%M:%SZ'
);
# Pull Requestの更新後1日以上経過している場合
if ($updated_at < $yesterday) {
printf("[%s] が長時間確認されていません。 %s\n",
encode_utf8($rec->{title}),
$rec->{html_url});
}
}
本誌最新号をチェック!
WEB+DB PRESS Vol.130
B5判/
定価1,628円
ISBN978-4-297-13000-8
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
いまはじめるFlutter
iOS/
作って学ぶWeb3
ブロックチェーン、