Edited at

[Ruby] Backlogの課題コメントをまとめて出力する

More than 1 year has passed since last update.


概要


  • 会社管理のBacklogに、技術メモやリンクを無造作にコメントで残す課題が複数ある

  • その会社を退職することになったが、技術メモは貰っておきたい

  • Backlog APIをRubyで呼び出して、全コメントを出力できるようにしよう

  • 技術メモはBacklog記法で書いてるので、個人用Backlogへの移植を想定


APIキーを取得

BacklogのAPIは非常に簡単に使えます。個人設定→APIから、APIキーを発行すればすぐに使えるようになります。


Backlog APIの使い方確認

APIキーを取得できたら、以下ページを参照して認証方法を確認します。

認証と認可 | Backlog Developer API | Nulab

curlで試してみます。BacklogスペースIDがhogeで、APIキーがfugafugaの場合、以下のURLで、自身の情報を取得できます。これが返ってくれば認証情報が有効であることがわかります。

$ curl https://hoge.backlog.jp/api/v2/users/myself?apiKey=fugafuga

{"id":000000,"userId":"sa2knight","name":"sa2knight","roleType":2,"lang":"ja","mailAddress":"hogehoge@fugafuga.com","nulabAccount":null}


コメント取得APIの確認

今回は特定課題のコメントをすべて取得したいので、課題コメントの取得 | Backlog Developer API | Nulab を使います。

オプションとして、取得件数countは、1課題に100コメントも無いので100に、orderは古い順に出力したいのでascにすると良いでしょう。

それらを踏まえてURLを構築すると以下のようになります。(issue_keyは課題ID)

"https://#{space}.backlog.jp/api/v2/issues/#{issue_key}/comments?apiKey=#{api_key}&count=100&order=asc"


実装

今回はコメント本文が丸々欲しいだけなので、CUIで標準出力させるスクリプトで充分です。また、複数課題に対してコメントを一覧したいので、コマンドライン引数で複数の課題キーを与える形式にします。イメージは以下の感じです。

$ ruby main.rb ISSUE-1 ISSUE-2 ISSUE-3

適当に実装します。完全に個人用なのでエラー系とかも無いです。


main.rb

require 'json'

require 'net/http'

# 認証情報を環境変数から取得
API_KEY = ENV['BACKLOGAPI']
SPACE = ENV['BACKLOG_SPACE']

# 課題キーを指定して、その課題に投稿されたコメントをすべて標準出力
def print_comments(issue_key)
url = "https://#{SPACE}.backlog.jp/api/v2/issues/#{issue_key}/comments?apiKey=#{API_KEY}&count=100&order=asc"
comments = fetch(url)
comments.each do |comment|
puts "* #{comment['updated'].split('T')[0]}"
print comment['content']
puts "\n\n"
end
end

# APIを呼び出してレスポンスをparseする
def fetch(url)
uri = URI.parse(url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
req = Net::HTTP::Get.new(uri.request_uri)
res = https.request(req)
JSON.parse(res.body)
end

ARGV.each(&method(:print_comments))


APIキーとスペースIDを環境変数に入れて実行すると、コメントの一覧を良い感じに整形した標準出力が得られます。

* 2017-10-12

{quote}
プログラミングをする上で覚えておくべき原理原則 - Qiita https://qiita.com/iyuku/items/7055bfc6c36a35edae44
{/quote}
この手の原則は何度も読んでるし、可能な限りコーディングで心がけてるけど、やっぱりプログラミングやり始めた頃に知っておくべきだったとは思う。やり始めの頃のクセとかはどうしても矯正しきれない。

{quote}
不慣れなコードベースで短期間に生産性を高めるための7つの方法 | プログラミング | POSTD http://postd.cc/7-strategies-to-quickly-become-productive-in-an-unfamiliar-codebase/
{/quote}
XXXX関連のコードに関わるとこの問題に直面する。謙虚な気持ちで、何故そのコードに至ったのかを考えながら、未知のコードベースを自分のものに出来ると良い。なるべく関わりたくないけど。

{quote}
コーディング入門以前 by @Yutaka_Kinjyo https://www.slideshare.net/yutakakinjyo/ss-37372648 @SlideShareさんから
{/quote}
スライド内でも触れられてるけど、「リーダブルコード」はプログラミングの義務教育の教科書にしても良いぐらい必読書だと思う。
XXXの本棚にも多分置いてるので、読んでない方はぜひ。
関係ないけど、高橋メソッド好きで、自分も学生時代によく使ってプレゼンしてたけど、容量制限のある4G回線だと辛いな‥‥。

{quote}
何も知らない人を育てるために(新人教育情報キュレーション) - Qiita https://qiita.com/itagakishintaro/items/ca4b60e5fb652160685f
{/quote}
まだ仕事として人に技術を教えた経験はないし、自分自身がまだそのレベルに達してないとは思うけど、将来的なキャリアを考えるとやっぱりこういうことを考えられるようになっておかないと。というか自信が初心者から離れれば離れるほど初心者に教えるのは難しくなるのでは‥‥??

量が膨大になるので、ファイル出力するのが無難そうです。

$ ruby main.rb DEVS-101 DEVS-142 DEVS-151 DEVS-160 > backup.md


コメントが100件以上ある場合の対応 (2018/07/31追記)

使ってるうちにやっぱりコメントが100件以上ある課題もあったのでそれへの対応を追加。

コメント一覧APIは、取得するコメントのIDをminIdで指定することで、そのコメント以降のみを取得することができる。それを活用して、再帰的にメソッド呼び出しを行うことで、101件目以降のコメントも取得できるようにする


main.rb

require 'json'

require 'net/http'

# 認証情報を環境変数から取得
API_KEY = ENV['BACKLOGAPI']
SPACE = ENV['BACKLOG_SPACE']

# 課題キーを指定して、その課題に投稿されたコメントをすべて標準出力
# 1回の呼び出しで100コメントまでしか取れないので、last_idを指定して繰り返す
def print_comments(issue_key, last_id = nil)
url = "https://#{SPACE}.backlog.jp/api/v2/issues/#{issue_key}/comments?apiKey=#{API_KEY}&count=100&order=asc&minId=#{last_id}"
comments = fetch(url)
comments.each do |comment|
print comment['content']
puts "\n\n"
end
print_comments(issue_key, comments.last['id']) unless comments.empty?
end

# APIを呼び出してレスポンスをparseする
def fetch(url)
uri = URI.parse(url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
req = Net::HTTP::Get.new(uri.request_uri)
res = https.request(req)
JSON.parse(res.body)
end

ARGV.each(&method(:print_comments))



個人用Backlogへの保管

出力されたテキストはMarkdownでなくBacklog記法で書いてしまってるので、そのまま別のBacklogに貼り付けるのが無難そうです。個人用のBacklogスペースを持っているので、そこにwikiでページを作って丸々貼り付けます。

いい感じに残すことができました。

もちろんWikiの投稿なんかもAPIで出来るので、その気になれば個人用Backlogへの同期を自動で行うこともできます。が、今回は退職時に1回きりの異色なので手動コピペで対応。

BacklogAPIについては稚拙ですが別途記事を投稿しているのでご参考までにどうぞ。

RubyでBacklogを操作する - Qiita