PyGithubを使って、GitHubの情報を取得してみた
サーモン大好き横山です。
本日は社内リリース作業で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の情報を取得してどうこうしたい場合はオススメです。