経緯
リポジトリの必要・不必要の判断をしてもらうためGitHubのリポジトリ一覧を作成する必要がありました。
一覧はスプレッドシートで共有して判断をしてもらうという形式をとりました。
また、数百というリポジトリがあったので手動でやるには無理があったので簡単なスクリプトを作成しました。
事前準備
GitHubのAPIを利用するのでトークンを発行する必要があります。
GitHubの【Personal settings】から【Developer settings】を選択します。
【Personal access tokens】に遷移後、【Generate new token】を押下します。
【Token description】に任意のトークン名を入力して以下の【repo】にチェックを入れてください。
チェックを入れないとPrivateリポジトリの取得ができません。
【Generate token】を押下すればトークンが発行されますので控えておいてください。
前提
A1列にカラム名、A2列以降にリポジトリ名を記載することをイメージしております。
今回はパッと出したかったので転記するセルをガチガチに決めています。
実装
function getRepositoryList() {
// スプレッドシートの取得
// スプレッドシートとプロジェクトを分けたかったのでスプレッドシートを取得
var spreadsheet = SpreadsheetApp.openById('対象スプレッドシートのID');
// 対象シートの取得
var sheet = spreadsheet.getSheetByName('シート名');
// 記載済みのリポジトリ一覧をクリアにする
sheet.getRange(2, 1, sheet.getLastRow(), 1).clear();
// 一度に取得できるリポジトリ数が100なのでAPIを複数回実行する
var page = 1;
while(true) {
// :org部分は自分のOrganizationを指定
// Public・Private両方のリポジトリを取得
var apiUrl = "https://api.github.com/orgs/:org/repos?per_page=100&page=" + page +"&type=all&sort=full_name";
var repoList = exeGetGitHubAPI(apiUrl);
// リポジトリが取得できなくなったらループを抜ける
if(repoList.length == 0) {
break;
} else {
page++;
for(var i = 0; i < repoList.length; i++) {
// API実行結果からリポジトリ名を取り出す
sheet.getRange(sheet.getLastRow()+1, 1).setValue(repoList[i]['name']);
}
}
}
}
function exeGetGitHubAPI(apiUrl) {
var token = '先ほど取得したGitHubトークン';
var header = {
"Authorization" : "token " + token
};
var options = {
"method" : "get",
'contentType' : 'application/json',
'headers' : header
};
try {
var result = UrlFetchApp.fetch(apiUrl, options);
} catch(e) {
Logger.log("処理に失敗しました。エラー内容は以下です。\n" + e);
}
return JSON.parse(result);
}
トークンを直書きしているのでいけてないのですが、上記ソースコードが格納されたプロジェクトに権限を割り当てることで閲覧者を限定させています。