PyGithubを使って、GitHubの情報を取得してみた

2018.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き横山です。

本日は社内リリース作業でGitHubのissues、milestoneをブラウザ経由で確認することが多くなったので、スクリプトで解決すべくPyGithubをご紹介します。

事前準備

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

GitHubにログインし、ページ右上にある「Settings」をクリック


アカウント設定ページにいったらページ左下にある「Developer settings」をクリック


開いたページの左に「Personal access tokens」をクリックし、「Generate new token」をクリック


一度ログインしているアカウントのパスワードを訪ねられるので、入力し、「Confirm password」をクリック


Token descriptionに使用用途を適宜入力し、Tokenの権限をチェックしていきます。今回は「repo」だけチェックを付けて、ページ下部にある「Generate token」をクリック


薄緑にハイライトされた部分の英数字の羅列が「アクセストークン」となります。この時以外このアクセストークンが表示されることがないので、必ず控えましょう。

インストール

virtualenv使って、PyGithubを入れていきます。

$ cd /path/to
$ virtualenv -p`which python3.6` venv
$ . venv/bin/activate
(venv) $ pip install PyGithub
Collecting PyGithub
  Downloading PyGithub-1.38.tar.gz (2.6MB)
    100% |████████████████████████████████| 2.6MB 3.3MB/s
Requirement already satisfied: pyjwt in ./venv/lib/python3.6/site-packages (from PyGithub)
Installing collected packages: PyGithub
  Running setup.py install for PyGithub ... done
Successfully installed PyGithub-1.38

自分がオーナーのリポジトリ名一覧を表示しよう

先程取得したtokenを使って動作するか確認します。
公式ドキュメントのvery short tutorialを少しいじって動かしてみます。

#!/usr/bin/env python
from github import Github

token = '657XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXe0b'

# or using an access token
g = Github(token)

for repo in g.get_user().get_repos(type='owner'):
    print(repo.name)

自分がOwnerのRepositoryの名前を表示します。実行結果は以下。

$ python sample.py
aurl
devio2017-terminal-animation
tellmewys
test-repo
turtle-graphics-do-it

特定のリポジトリのIssue一覧を表示しよう

もうちょい突っ込んで、うちが所属してる組織名「classmethod」の公開リポジトリにある「gradle-aws-plugin」のOpen Issueのタイトル一覧を表示します。

#!/usr/bin/env python
from github import Github

token = '657XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXe0b'

# or using an access token
g = Github(token)

for _repo in g.get_organization('classmethod').get_repos(type='public'):
    if _repo.name == 'gradle-aws-plugin':
        repo = _repo
        break

print(repo)

for _issue in repo.get_issues():
    print('  issue name: #{:<4} {}'.format(_issue.number, _issue.title))

実行結果が以下です。

$ python list.py
Repository(full_name="classmethod/gradle-aws-plugin")
  issue name: #140  AWS SAM Support
  issue name: #137  Expose UpdateLambdaConfigurationResult as an output of migrateLambda task
  issue name: #136  No task to download file from S3 bucket
  issue name: #134  Add property to configure for your own endpoint url
  issue name: #133  Lambda Publish Version, Create Alias and Update Alias tasks
  issue name: #128  Support for lambda traffic shifting param
  issue name: #127  Support for aliases and versions in Upload Lambda task
  issue name: #125  Import Error
  issue name: #121  Updating multiple Lambda Functions
  issue name: #119  Cannot find sydney region
  issue name: #117  publish parameter doesn't work as expected
  issue name: #116  Update BulkUploadTask
  issue name: #115  placeholder: support setSdkRequestTimeout when invoking lambda
  issue name: #113  Set the policy on s3 object when uploading
  issue name: #110  Nodejs 610 not supported
  issue name: #109  Change default overwrite policy for S3 upload tasks
  issue name: #103  Add Amazon ECS plugin
  issue name: #93   Establish role when using cloudformation
  issue name: #88   Lambda environment configuration fails when using 'GString' for value
  issue name: #84   SyncTask repeats auth exception for every source file
  issue name: #78   Complier warning with new release
  issue name: #75   Allow ElasticBeanstalk Config Template to not set optionSettings
  issue name: #72   placeholder: support aws-java-sdk-events functionality
  issue name: #71   Lambda now supports environment variables
  issue name: #69   Allow tags to be set on EC2 and VPC
  issue name: #64   Lambda: allow updating of Runtime property
  issue name: #62   path of "/" in AmazonIdentityManagementCreateRoleTask crashes buildship in eclipse.
  issue name: #61   Exception: Extension of type 'AmazonS3PluginExtension' does not exist
  issue name: #59   Provide Metadata of Files Uploaded During S3 SyncTask
  issue name: #58   Feature Request: Multiple Environments
  issue name: #57   Support uploading JAR to S3/Beanstalk
  issue name: #55   Misleading error message during S3 upload if overwrite is not enabled
  issue name: #54   Execution failed
  issue name: #50   Support for CAPABILITY_NAMED_IAM
  issue name: #48   CreateBucketTask ignores region
  issue name: #47   API GW support
  issue name: #43   Support version.description for ElasticBeanstalk
  issue name: #36   Latest version missing dependency
  issue name: #27   Feature Request: ECR
  issue name: #21   AmazonS3FileUploadTask finishes but the file isn't uploaded
  issue name: #19   AWSLambdaUpdateFunctionCodeTask support for S3 uploads for files over 10mb
  issue name: #12   AutoScaling support?
  issue name: #2    RDS Instance Support

また get_issues 引数によって、assignで絞ったり、milestoneで絞ったりできます。 詳しくは以下のドキュメントにて割愛。

まとめ

アクセストークンを発行してしまえば、欲しい情報をDocumentから探して叩くだけで簡単に取れるのでとてもいい感じです。

実際、リリース作業時にTagがPushされたか、Milestoneが閉じられたかを確認スクリプトが70行弱で作成できました。GitHubの情報を取得してどうこうしたい場合はオススメです。

参考