この記事は公開されてから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の情報を取得してどうこうしたい場合はオススメです。