0
0

Zenhubと紐づいたGithubのPRをCSVに出力する方法

Last updated at Posted at 2024-09-18

はじめに

  • Zenhub公式ではCSV出力をサポートしていない
    • APIはあるので自分でコード書いてねというスタイル
  • この記事では自身が必要な情報だけ出力しているが、 他に欲しい情報がある場合はexport_to_csvのissue変数を出力して各自ピックアップしてもろて

前提

  • Python環境が用意されていること
    • requestsを入れてない場合は pip install requests
  • Zenhub側でやること
    • 取得したい課題のZenhubリポジトリIDをメモする
    • トークンを発行する
  • Github側でやること
    • 以下をメモする
      • リポジトリ名
      • 組織名 or ユーザー名
    • トークンを発行する

メモした内容はコード内の定数に入れる

コード

fetch_zenhub_issues.py
import csv
import datetime
import requests 

GITHUB_TOKEN = ''

ZENHUB_AUTHENTICATION_TOKEN = ''
ZENHUB_REPO_ID = ''
REPO = ''  # format is organization/repo or username/repo


def iterate_pages(repository):
    headers = {"Authorization": f"token {GITHUB_TOKEN}"}
    results = []
    page_number = 1

    # URL for the first page of issues
    issues_url = f'https://api.github.com/repos/{repository}/issues?state=all&per_page=100&page={page_number}'
    while issues_url:
        # Request issues from the current page
        request = requests.get(issues_url, headers=headers)
        if request.status_code != 200:
            print(f"Error fetching issues: {request.status_code}")
            break

        # Append the JSON response to results
        issues_data = request.json()
        results.extend(issues_data)

        # Check if there is a 'Link' header to get the next page
        if 'link' in request.headers:
            links = request.headers['link'].split(',')
            next_url = None
            for link in links:
                if 'rel="next"' in link:
                    next_url = link.split(';')[0].strip('<> ')
                    break
            issues_url = next_url  # Set URL for the next page, or None if it doesn't exist
        else:
            issues_url = None  # No more pages

    return results

def export_to_csv(filename="zenhub_issues.csv"):
    keys = ["PR_No", "title", "state", "body"]
    with open(filename, "w", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=keys)
        writer.writeheader()

        for issue in total_result:
            if isinstance(issue, dict):
                if issue.get('pull_request') is not None:
                    writer.writerow({
                        "PR_No": issue.get("number", ""),
                        "title": issue.get("title", ""),
                        "state": issue.get("state", ""),
                        "body": issue.get("body", ""),
                    })

if __name__ == '__main__':
    total_result = iterate_pages(REPO)
    export_to_csv()

補足

  • 定数の内容及びコードは合ってるのに取得できないIssueがある場合はGithubトークンの権限が狭すぎるかも?
    • その辺いじったけど記憶にない

終わりに

  • ChatGPT使ってベース作った後に軽くしか修正してないので、コードはお察し()
  • どこ調べても記事でまとめられてなかったのつらい
    • 質問サイトで「解決しました!」だけ書くのやめてね(経緯も書いてもろて)

参考

上記リポジトリ内のコードは動作しない模様

(追記)

  • 本当はZenhubで作成した課題を出力したかったが想定と異なり、GithubのPRしか取得できなかったためタイトルを変更

以上

0
0
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
0
0