Posted at

fastlaneでマイルストーンに紐付いたIssueの一覧を取得する

自動化を進めるにあたりザッと作ったやつをメモ。

基本的にはこちらの記事とほぼ同じ処理をlane化したものです。

github_apiのレスポンスからjsonを取り出すあたりの記述がもっさりしているのが微妙なので、もっと良い書き方あれば教えていただけると嬉しいです。


fastfile

lane :get_issues_with_milestone do |options|

title = options[:title]
milestone_state = options[:milestone_state]
issue_state = options[:issue_state]

url = YOUR_REPO # e.g. "fastlane/fastlane"
token = YOUR_GITHUB_API_TOKEN

# Milestoneの取得
UI.message("Getting milestone on GitHub | Title: #{title}, State: #{milestone_state}")

milestones_result = github_api(
api_token: token,
http_method: "GET",
path: "repos/#{url}/milestones?state=#{milestone_state}"
)

# 指定されたタイトルに一致するものを抽出
milestones = milestones_result[:json]
milestone = milestones.find { |m| m['title'] == title }

# 一致しなければ終了
if milestone.nil? then
UI.message("No milestones")
next
end

milestone_number = milestone['number']

UI.success("Milestone \##{milestone_number} found")
UI.message(milestone)

# 取得できたMilestoneの`number`をもとに、Issueを取得
UI.message("Getting issues on GitHub | Milestone number: \##{milestone_number}, State: #{issue_state}")

issues_result = github_api(
api_token: token,
http_method: "GET",
path: "repos/#{url}/issues?milestone=#{milestone_number}&state=#{issue_state}"
)

issues = issues_result[:json]

if issues.nil? then
UI.message("No issues")
next
end

UI.success("Issues found")
UI.message(issues)
end


実行結果は以下のようになります。

$ bundle exec fastlane get_issues_with_milestone milestone_title:0.0.1 milestone_state:all issue_state:all

[✔] 🚀

[11:58:25]: --- Step: default_platform ---

[11:58:25]: Driving the lane 'ios get_issue_with_milestone' 🚀
[11:58:25]: Getting milestone on GitHub | Title: 0.0.1, State: all

[11:58:25]: --- Step: github_api ---

[11:58:25]: Milestone #1 found
[11:58:25]: {"url"=>"https://api.github.com/repos/some/repo/milestones/1", …}
[11:58:25]: Getting issues on GitHub | Milestone number: #1, State: all

[11:58:25]: --- Step: github_api ---

[11:58:26]: Issues found
[11:58:26]: [{"url"=>"https://api.github.com/repos/some/repo/issues/1", …}]

自分たちのチームでは、Release作成時に上記の方法でIssueを取得し、descriptionを自動で生成するようにしています。

ただ、Release作成の処理内にMilestoneおよびIssueの取得処理も含めると、laneの記述が長くなりがちです。

そのため、これらの処理は個別のCustom actionとして定義しておき、Release作成用laneはこれらを呼び出すようにして利用しています。


Gist