Masayan tech blog.

  1. ブログ記事一覧>
  2. GithubApiをPythonで叩いて大量のissueを一括で作成する

GithubApiをPythonで叩いて大量のissueを一括で作成する

公開日

環境

  • Python 3.10.1
  • windows 10

この記事は何?

  • 面倒なissue登録をpythonで一括登録できるようにするための記事です

事前準備

  • githubのアクセストークンを生成しておく
    https://github.com/settings/tokens
  • 上記のトークンをos.environ.getで環境変数として取得できるようにする

コードを書く

  • 各工程の内容はコメントで残しているのでそちらを参照ください
  • やっていることは結構単純で、csv(issueのリスト)を読み取り、それをPOSTする
  • for文の中で、作成したいissueとsession、apiのurlを引数としてRegisterGitHubIssueServiceを呼び出して渡す

packages\github_issue_register\main.py

import io, sys
from pprint import pprint
import os
import requests
from packages.github_issue_register.classes.Application.IssueConverter import IssueConverter
from packages.github_issue_register.classes.Application.RegisterGitHubIssueService import RegisterGitHubIssueService

from shared.Domain.xcsv import XCsv

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# issueのリスト(csv)を読み込み
filepath = 'C:\\Users\\nishigaki\\jupyter-lab\\packages\\github_issue_register\\issues.csv'
csv = XCsv()
issue_df = csv.read(filepath, encoding="shift-jis", header=0)

# GithubApiを叩く準備
GITHUB_USERNAME = "masayan1126"
GITHUB_REPO_OWNERNANE = "masayan1126"
GITHUB_REPO_NANE = "stocker"
# 事前にトークンを https://github.com/settings/tokens へ登録し、windowsの環境変数に追加しておくこと
GITHUB_PERSONAL_ACCESS_TOKENS = os.environ.get('GITHUB_PERSONAL_ACCESS_TOKENS')

session = requests.Session()
session.auth = (GITHUB_USERNAME, GITHUB_PERSONAL_ACCESS_TOKENS)
url = 'https://api.github.com/repos/%s/%s/issues' % (GITHUB_REPO_OWNERNANE, GITHUB_REPO_NANE)

# dfをissueオブジェクトに変換し、post
for issue_dict in issue_df.to_dict("index").values():
    issue = IssueConverter().to_issue(issue_dict)
    res = RegisterGitHubIssueService().execute(url, session,issue)

    if res.status_code == 201:
        pprint('Successfully created Issue "%s"' % issue.get_title())
    else:
        pprint('Could not create Issue "%s"' % issue.get_title())

1つ1つのissueオブジェクト

packages\github_issue_register\classes\Domain\issue.py

class Issue:

    def __init__(self, title, label):
        self.title = title
        self.label = label

    def get_title(self):
        return self.title

    def set_title(self, title):
        self.title = title
        return self

    def get_label(self):
        return self.label

    def set_label(self, label):
        self.label = label
        return self
   
    # TODO:body

packages\github_issue_register\classes\Application\RegisterGitHubIssueService.py

import json

from packages.github_issue_register.classes.Domain.issue import Issue

class RegisterGitHubIssueService:
    def execute(self, url, session, issue: Issue):
        res = session.post(url, json.dumps({
            "title": issue.get_title(),
            "body": "",
            # TODO: 複数登録できるように
            "labels": [issue.get_label()],
        }))

        return res

packages\github_issue_register\classes\Application\IssueConverter.py

from packages.github_issue_register.classes.Domain.issue import Issue

class IssueConverter:
    def to_issue(self,dict:dict):
        return Issue(title=dict["title"], label=dict["label"])

CSVの例

issues.csv

title

label

例外クラスの自作

バグ修正

バーコードの読み取り制度向上

新規追加

ローディングアニメーション

バグ修正

ナビゲーションバーのコンポーネント化

新規追加

以上です。

参考

https://docs.github.com/en/rest/reference/issues#create-an-issue

まとめ

いかがでしたでしょうか。本記事では、GithubApiをPythonで叩いて大量のissueを一括で作成する方法について紹介しています。ぜひ参考にしてみてください