3
1

More than 5 years have passed since last update.

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

Posted at

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

基本的にはこちらの記事とほぼ同じ処理を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はこれらを呼び出すようにして利用しています。

Gist

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1