GitHub API

GitHub APIを使えば、GitHUbのWeb UI上で行っていた操作を自動化することができる。

Personal access token

APIの操作では認証にアクセストークを使用するので、あらかじめ作成しておく。

GitHubユーザのSettings -> Developer settings -> Personal access tokensで生成

GitHub PersonalAccessToken width=640

GitHub PersonalAccessToken width=640

認証とレートリミット

Basic authentication

ベーシック認証。

1
curl -u "username" https://api.github.com

OAuth2 token (sent in a header)

OAuth2認証。GitHubはトークンを使った認証を推奨。

1
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com

レートリミット

For unauthenticated requests, the rate limit allows for up to 60 requests per hour. Unauthenticated requests are associated with the originating IP address, and not the user making requests.

未認証の場合、60req/hourのレートリミットがある。

For API requests using Basic Authentication or OAuth, you can make up to 5000 requests per hour. Authenticated requests are associated with the authenticated user, regardless of whether Basic Authentication or an OAuth token was used. This means that all OAuth applications authorized by a user share the same quota of 5000 requests per hour when they authenticate with different tokens owned by the same user.

認証した場合は、5000req/hourまで利用できる。

認証なしの場合

認証なしで実行した場合、X-RateLimit-Limit: 60となっている。

1
2
3
4
5
6
7
$curl -i https://api.github.com/users/octocat/orgs
HTTP/1.1 200 OK
…略…
X-Ratelimit-Limit: 60
X-Ratelimit-Remaining: 58
X-Ratelimit-Reset: 1589977195
…略…

認証ありの場合

認証ありで実行した場合、X-RateLimit-Limit: 5000となっている。

ベーシック認証の場合、curl -uでユーザ名を指定。

1
2
3
4
5
6
7
8
$curl -u ${GITHUB_USER} -i "https://api.github.com/users/${GITHUB_USER}/orgs"
Enter host password for user 'XXXXXX':
HTTP/1.1 200 OK
…略…
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4998
X-RateLimit-Reset: 1589977514
…略…

アクセストークンを使う場合、Authorizationヘッダーでトークンを指定。
アクセストークン等は何度も使用するので、環境変数で設定する。

1
2
3
4
5
6
7
$curl -H "Authorization: token ${GITHUB_TOKEN}" -i "https://api.github.com/users/${GITHUB_USER}/orgs"
HTTP/1.1 200 OK
…略…
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4999
X-RateLimit-Reset: 1590012456
…略…

リポジトリ操作

トークンの権限

アクセストークンの権限でrepoを許可しておく必要がある。

1
2
3
4
5
6
7
repo Full control of private repositories
repo:status Access commit status
repo_deployment Access deployment status
public_repo Access public repositories
repo:invite Access repository invitations
security_events Read and write security events
delete_repo Delete repositories

リポジトリ作成

リポジトリ作成ではJSON形式で設定を行い、https://api.github.com/user/reposにPOSTする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ curl -H "Authorization: token ${GITHUB_TOKEN}" \
-X POST -H "Content-type: application/json" \
-d "{
\"name\": \"${REPO_NAME}\",
\"description\": \"This is ${REPO_NAME}\",
\"homepage\": \"https://github.com\",
\"private\": false,
\"has_issues\": true,
\"has_wiki\": true,
\"has_downloads\": true
}" \
-i "https://api.github.com/user/repos"
HTTP/1.1 201 Created
…略…
X-Accepted-OAuth-Scopes: public_repo, repo
Location: https://api.github.com/repos/<GITHUBUSER>/test_repo
X-GitHub-Media-Type: github.v3; format=json
…略…

{
"id": 26XXXXX770,
"node_id": "MDEwOlXXXXXXXXXXXXjU2OTU3NzA=",
"name": "test_repo",
"full_name": "<GITHUBUSER>/test_repo",
"private": false,
…略…
}

エラーの場合

1
2
3
4
5
6
HTTP/1.1 400 Bad Request
…略…
{
"message": "Problems parsing JSON",
"documentation_url": "https://developer.github.com/v3/repos/#create"
}

リポジトリ情報取得

1
2
3
4
5
6
7
8
9
10
11
$ curl -H "Authorization: token ${GITHUB_TOKEN}" -i "https://api.github.com/repos/${GITHUB_USER}/test_repo"
HTTP/1.1 200 OK
…略…

{
"id": 26XXXXX770,
"node_id": "MDEXXXXXXXXXXXXXXOTU3NzA=",
"name": "test_repo",
"full_name": "<GITHUBUSER>/test_repo",
"private": false,
…略…

リポジトリ削除

アクセストークンの権限でdelete_repoを許可しておく必要がある。

1
2
3
$ curl -H "Authorization: token ${GITHUB_TOKEN}" -X DELETE -i "https://api.github.com/repos/${GITHUB_USER}/test_repo"
HTTP/1.1 204 No Content
…略…

権限がない場合は以下のエラーに。

1
2
3
4
5
6
7
8
9
$ curl -H "Authorization: token ${GITHUB_TOKEN}" -i "https://api.github.com/repos/${GITHUB_USER}/test_repo"
curl -H "Authorization: token ${GITHUB_TOKEN}" -X DELETE -i "https://api.github.com/repos/${GITHUB_USER}/test_repo"
HTTP/1.1 403 Forbidden
…略…

{
"message": "Must have admin rights to Repository.",
"documentation_url": "https://developer.github.com/v3/repos/#delete-a-repository"
}