PyGithubでGitHubの管理タスクを自動化してみた(前編)

記事タイトルとURLをコピーする

G-gen の佐伯です。最近の業務で GitHub のブランチ作成やブランチ内のファイルの更新・削除を自動化する機会が多かったので、ご紹介したいと思います。

はじめに

PyGithub とは

当記事では、PyGithub の利用方法を解説しています。PyGithub は、GitHub の API を Python から利用するためのライブラリです。Python で GitHub の REST API をコールして、リポジトリ、Issue、プルリクエストなどの GitHub リソース管理を自動化するために使われます。

当記事でやること

当記事(前編)では、管理タスク自動化の事前準備・導入として、リポジトリのブランチ内のファイルパスの一覧取得手法を紹介します。

事前準備(アクセストークン生成)

GitHubのアカウント設定からアクセストークンを生成します。

GitHubにログインし、ページの右上にある『Setting』をクリック

開いたページの左側のメニューから『Developer Setting』を選択

『Developer Setting』ページから『Personal access tokens』⇛『Tokens(classic)』 を選択

access tokenの名称・有効期間・権限スコープを選択(権限スコープは今回は『repo』のみ)

ページの最下部の『generate token』を選択

生成されたtokenをコピーする。トークンの漏洩はそのままレポジトリ情報の漏洩に繋がるため、十分注意すること。

ライブラリの取得

pip を使い venv 環境に PyGithub をインストールします。

オーナーのリポジトリ一覧を取得

テストとして以下のプログラムを実行して、自分(アクセストークンを発行したアカウント)がオーナーとなっているリポジトリの一覧を取得します。

テストコードのためトークンがハードコーディングされていますが、本番プログラムでは決して行わないでください

from github import Github
   
# 上記で取得したaccess token
token = 'ghp_******************************'
   
# tokenを設定
   
g = Github(token)
   
for repo in g.get_user().get_repos(type='owner'):
     print(repo.name)

実行結果

特定のリポジトリ内の全ファイルのパスの一覧を取得

次に、上記を基に特定のリポジトリ(今回は Osamu-Saiki/test2)の main ブランチ内の全オブジェクトのパスの一覧を取得します。

Osamu-Saiki/test2リポジトリのmainブランチの中身

  • terraform/commom/**

  • terraform/env/

  • terraform/modules/

以下のプログラムを実行します。先程と同じくテストコードのためトークンがハードコーディングされていますが、本番プログラムでは決して行わないでください

from github import Github
   
# GitHubアクセストークンを設定
access_token = 'ghp_*************************'
   
# GitHubリポジトリとブランチ情報を設定
repository_name = 'Osamu-Saiki/test2'
   
branch_name = 'main'
   
# GitHubに接続
g = Github(access_token)
   
# リポジトリを取得
repo = g.get_repo(repository_name)
   
  
def folder_copy():
    source_branch = repo.get_branch(branch_name)
    source_tree = repo.get_git_tree(source_branch.commit.sha, recursive=True)
   
    for entry in source_tree.tree:
         print(entry.type, entry.path)
   
  
if __name__ == '__main__':
    folder_copy()

実行結果

なお他にも repo.get_contents で対象のリポジトリのファイルの中身の取得、repo.create_git_ref で新規のブランチを作成することができます。

後編では、新規ブランチの作成、ブランチ内ファイルの更新・削除、プルリクエストの自動化等をご紹介できればと思います。

佐伯 修 (記事一覧)

クラウドソリューション部

前職では不動産業でバックエンドを経験し、2022年12月G-genにジョイン。
入社後、Google Cloudを触り始め、日々スキル向上を図る。

SEの傍ら、農業にも従事。水耕を主にとする。