特定のラベルのついたPRを拾ってくる
使い所
- "レビュー中" のPRをリマインドする
- まとめて複数PRをリリースするときの、PR一覧を知りたい (ラベル運用必須だけど)
などなど
API v3
#! /usr/bin/env ruby require 'rake' require 'octokit' GITHUB_TOKEN = 'personal access token' REPO = 'owner_name/repo_name' LABEL = 'label_name' namespace :pr do desc 'waiting for review' task :label do github_client.pull_requests(REPO).each do |pr| pr.rels[:issue].get.data.rels[:labels].get.data.each do |label| puts "#{pr[:title]} : #{pr[:html_url]}" if label[:name] == LABEL end end end private def github_client Octokit::Client.new(access_token: GITHUB_TOKEN) end end
API v4 (GraphQL)
#! /usr/bin/env ruby require 'json' require 'rake' require 'octokit' GITHUB_TOKEN = 'personal access token' REPO = 'owner_name/repo_name' LABEL = 'label_name' namespace :pr do desc 'waiting for review' task :label do graphql(query: pull_requests)[:data][:repository][:label][:pullRequests][:edges].each do |pr| puts "#{pr[:node][:title]} : #{pr[:node][:url]}" end end private def github_client Octokit::Client.new(access_token: GITHUB_TOKEN) end def graphql(query:, variables: {}) github_client.post '/graphql', {query: query, variables: variables}.to_json end def pull_requests(label: LABEL) owner, name = REPO.split('/') <<~"GRAPHQL" query { repository(owner: "#{owner}", name: "#{name}") { label(name: "#{label}") { pullRequests(last: 20) { edges { node { title url } } } } } } GRAPHQL end end
メモと所感
- v4 の GraphQL を使えばもっとラクにとってこれるのかなーと思ったけど、慣れが必要かなーという感じだった
- octokit の gem で返ってくるレスポンスは
Sawyer::Resource
になっててちょっと面倒 (GraphQL は、octokit 使わなくてもよかったかも) - debug のときに awesome_print 使ったら超絶便利だった
- せっかくなら、Go とかで書いてみればよかった