自動化を進めるにあたりザッと作ったやつをメモ。
基本的にはこちらの記事とほぼ同じ処理を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]: ------------------------------
[11:58:25]: --- Step: default_platform ---
[11:58:25]: ------------------------------
[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]: ------------------------
[11:58:25]: --- Step: github_api ---
[11:58:25]: ------------------------
[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]: ------------------------
[11:58:25]: --- Step: github_api ---
[11:58:25]: ------------------------
[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はこれらを呼び出すようにして利用しています。