とあるきっかけがあり、Google App Script(以下、GAS)を使ってGitHubAPIを動かすことを最近行っていました。意外と記事があまりなかったこともあり、同様のことをやりたい人向けにまとめてみようと思います。
GitHub ではAPIが公開されていて、これを利用することによりブラウザでの操作なしでGit Hubの操作ができるようになります。
また、GASはGoogleアカウントを持っていれば環境構築不要で開発ができます。(Googleは”ローコードプラットホーム”と謳ってますね)
そこでこの記事では、Google App Script使って、
①プルリクの情報を取得する➁プルリクの作成をGitHub APIで動作できるようにしたいと思います。
例としてプルリクの情報取得と作成のふたつとしていますが、同様の記述の仕方で上記ドキュメントに記載されていることは操作ができますので、GitHubを操作してみたい方には参考になると思っています。
それではいきましょう!
誰がAPIを送るかを決める
まずはGithubを動かす際、「どこのアカウントからGitHubを操作するか」を決める必要があります。
方法は自分が知ってる限りでは「パーソナルアクセストークンを使って、個人のアカウントから動かす」または、「GitHub Appsを作成してBotから動かす」の2種類があります。
両方試したのですが、特徴としては
パーソナルアクセストークン | 作成が楽 |
GitHub Apps | 設定が手間がかかる。複数名で使う時に良い(運用しやすい)。都度トークンを作るので安全 |
という感じです。個人で使う場合はパーソナルアクセストークンで、チームで使っていく場合はGitHub Appsを作成して使っていくのが良いのではと思います。
この記事内ではトークンを使い個人利用したい場合を主に想定しています。
トークンを作成
上記の公式の手順の通りに作成します。
期間はお好みとし、実際に操作したいGitHubの操作にチェックを入れることだけ気をつけてください。 すぐ使うので、「Generate token」を押してトークンが発行されたらコピーしておいてください。
なお、GitHub Appsの場合もさっと記載します。 こちらの記事および記事の筆者が作成されたライブラリを使用させてもらいました。
行っている処理を要約すると、GitHub Apps のプライベートキーから署名したトークン(JWT)を利用し、アクセストークンを取得する流れとなります。
パーソナルアクセストークンを取得するだけに比べると手間はかかってしまいますね、、ただ堅牢なので個人で使うのじゃなければこちらの方が良いと思います。
トークンを保存
上で取得したパーソナルアクセストークンを使ってAPIを送りますが、
コードに直接トークンを記載するのはセキュリティの観点から避けておきましょう。
GASのエディタから、「プロジェクトの設定」→「スクリプトプロパティ」でkey value形式で保存できます。 名前は任意で良いですが、とりあえずgithub_token というプロパティ名にして、値にはトークンをペーストして設定します。
こちらの記事が詳しかったので参考にしてください。
GASを実装
いよいよ実装です!
サンプルコードを記載します。
①プルリクの情報を取得
→サンプルとしてプルリク#1の情報を取得するとしている
function getPullReqest() {
let url = "https://api.github.com/repos/{オーナー名}/{リポジトリ名}/pulls/1";
let token = PropertiesService.getScriptProperties().getProperties('github_token');
let option = {
method: 'get',
contentType: 'application/json; charset=utf-8',
muteHttpExceptions: true,
"headers": {"Authorization": "token " + token}
};
// UrlFetchでデータを取得して、JSONデータを解析する
let response = UrlFetchApp.fetch(url,option);
let data =JSON.parse(response);
console.log(data)
}
波かっこのところは適切なのに変えてください!
プルリクの情報を取得はGETメソッドになります。
オーナー名とリポジトリ名はご自身の情報としてください。
この記述でgetPullReqest関数を実行するとプルリクの情報が取得されます。
let token = PropertiesService.getScriptProperties().getProperties('github_token');
こちらのように記載することで、スクリプトプロパティに設定したトークンの情報を取得することができます!
UrlFetchApp.fetch()メソッドで、叩きたいURLとヘッダーのついたオプションを引数に入れることで取得がされます。あとはJSONデータを解析すればプルリクの情報が取得できる形となっています。
今回は雑にプルリクの番号を1としていますが、getPullReqest関数に引数をつけるなどして、動的に取得したい番号の情報がとれるようにしてください。
次はPOSTメソッドを使って、プルリクを作成してみましょう。
➁プルリクの作成
function createPullRequest() {
let url = "https://api.github.com/repos/{オーナー名}/{リポジトリ名}/pulls";
let token = PropertiesService.getScriptProperties().getProperties('github_token');
let data = {
'owner': '{オーナー名}',
'repo': "{リポジトリ名}",
'title': "{任意のプルリクのタイトル}",
'head': '{オーナー名}:{マージ元のリポジトリ名}',
'base': '{マージ先のリポジトリ名}',
};
let option = {
method: 'POST',
contentType: 'application/json; charset=utf-8',
muteHttpExceptions: true,
"headers": {"Authorization": "token " + token},
"payload": JSON.stringify(data)
};
// UrlFetchでデータを取得して、JSONデータをパースする
let response = UrlFetchApp.fetch(url,option);
let datas = JSON.parse(response);
console.log(datas)
}
こちらも、波かっこのところは適切なのに変えてください!
postで送るため、payloadもオプションに加えて送信したいデータを送る必要があるのがgetとの違いとなります。
最後のJSON.parseやconsoleはなくてよいですが、情報を取得することができるので、後続の処理をしたい場合は記述してください。(例えば作成したプルリク番号を取得してスプシに書き出すなどができます)
アイディア次第で効率化・自動化が図れる
いかがだったでしょうか?
今回getでプルリクの情報を取得でき、postでプルリクを作成するコードを紹介しましたが、これらを組み合わせればかなり自由なGitHubの操作が実現できるのではないでしょうか?
環境構築不要で、お手軽にデバッグもできるGASは手に取り掛かるハードルが低いので、ぜひ参考としてください!
コメント