はじめに
- Zenhub公式ではCSV出力をサポートしていない
- APIはあるので自分でコード書いてねというスタイル
- この記事では自身が必要な情報だけ出力しているが、 他に欲しい情報がある場合は
export_to_csv
のissue変数を出力して各自ピックアップしてもろて
前提
- Python環境が用意されていること
- requestsを入れてない場合は
pip install requests
- 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しか取得できなかったためタイトルを変更
以上