はじめに
Githubのissueを使ってプロジェクトのタスクを管理している会社は多いと思いますが、それぞれ自社独自のラベル設定があるのではないでしょうか。
この記事では、Githubに新しくリポジトリを作成した際に、自社独自のカスタムラベルのセットをコマンド一発で作成します。
手順
アクセストークンを取得する
まずはAPIを使用するためのアクセストークンを取得します。アクセストークンはパスワードの代わりに使用してリポジトリの情報をいろいろと操作します。
トークンの取得方法は下記を参照。
https://help.github.com/articles/creating-an-access-token-for-command-line-use/
以下の様なトークンが取得できます。
これをAPIへのアクセス時にパラメータとして使用します。
1234abcd5678efgh9012ijkl3456mnop7890rstu
CurlでAPIへアクセスする
以下、{xxxxxx}
となっている箇所は実際の値に置き換えてください。
たとえば {repo}
だったらリポジトリ名に置き換えます。
どんなAPIがあるか調べる
https://developer.github.com/v3/
ここにドキュメントもあるので、別にコマンドで調べる必要はありませんが、APIでも確認できます。
curl https://api.github.com
$ curl https://api.github.com
{
"current_user_url": "https://api.github.com/user",
"current_user_authorizations_html_url": "https://github.com/settings/connections/applications{/client_id}",
"authorizations_url": "https://api.github.com/authorizations",
"code_search_url": "https://api.github.com/search/code?q={query}{&page,per_page,sort,order}",
"emails_url": "https://api.github.com/user/emails",
"emojis_url": "https://api.github.com/emojis",
"events_url": "https://api.github.com/events",
"feeds_url": "https://api.github.com/feeds",
"followers_url": "https://api.github.com/user/followers",
"following_url": "https://api.github.com/user/following{/target}",
"gists_url": "https://api.github.com/gists{/gist_id}",
"hub_url": "https://api.github.com/hub",
"issue_search_url": "https://api.github.com/search/issues?q={query}{&page,per_page,sort,order}",
"issues_url": "https://api.github.com/issues",
"keys_url": "https://api.github.com/user/keys",
"notifications_url": "https://api.github.com/notifications",
"organization_repositories_url": "https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort}",
"organization_url": "https://api.github.com/orgs/{org}",
"public_gists_url": "https://api.github.com/gists/public",
"rate_limit_url": "https://api.github.com/rate_limit",
"repository_url": "https://api.github.com/repos/{owner}/{repo}",
"repository_search_url": "https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order}",
"current_user_repositories_url": "https://api.github.com/user/repos{?type,page,per_page,sort}",
"starred_url": "https://api.github.com/user/starred{/owner}{/repo}",
"starred_gists_url": "https://api.github.com/gists/starred",
"team_url": "https://api.github.com/teams",
"user_url": "https://api.github.com/users/{user}",
"user_organizations_url": "https://api.github.com/user/orgs",
"user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
"user_search_url": "https://api.github.com/search/users?q={query}{&page,per_page,sort,order}"
}
今回は repository_url
を利用すれば良さそうです。
Labelsの情報にアクセスするAPIを調べる
ここからは認証が必要なので、-u {user}:{token}
オプションを付けます。
curl https://api.github.com/repos/{owner}/{repo} -u {user}:{token}
$ curl https://api.github.com/repos/kung-fu/labels-sample -u kung-fu:{token}
:
"labels_url": "https://api.github.com/repos/kung-fu/labels-sample/labels{/name}",
:
labels_url
を利用します。
URLの最後に {/name}
をつけなければ全labesが取得できそうです。
登録されているラベルを取得
リポジトリ作成時にデフォルトで登録されているラベルを取得します。
curl https://api.github.com/repos/{owner}/{repo}/labels -u {user}:{token}
$ curl https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token}
[
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/bug",
"name": "bug",
"color": "fc2929"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/duplicate",
"name": "duplicate",
"color": "cccccc"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/enhancement",
"name": "enhancement",
"color": "84b6eb"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/help%20wanted",
"name": "help wanted",
"color": "159818"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/invalid",
"name": "invalid",
"color": "e6e6e6"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/question",
"name": "question",
"color": "cc317c"
},
{
"url": "https://api.github.com/repos/kung-fu/labels-sample/labels/wontfix",
"name": "wontfix",
"color": "ffffff"
}
]
現在、登録されているラベルの一覧が取得できました。デフォルトのものですね。
デフォルトのラベルを削除
デフォルトのラベルをすべて削除してから独自のラベルを登録してみます。
ループで回せばいいのですが、名前も数も決まってるので、今回は1件ずつ削除してしまいます。
curl -X DELETE https://api.github.com/repos/{owner}/{repo}/labels/{name} -u {user}:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/bug -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/duplicate -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/enhancement -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/help%20wanted -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/invalid -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/question -u kung-fu:{token}
$ curl -X DELETE https://api.github.com/repos/kung-fu/labels-sample/labels/wontfix -u kung-fu:{token}
ラベルを追加
ラベル追加のAPIはPOSTパラメータにjsonを渡す必要があります。
curlでjsonをpostするには以下のようにします。
なお、1ラベルずつしか作成できないようです。
curl -X POST https://api.github.com/repos/{owner}/{repo}/labels -u {user}:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"{ラベル名}","color":"{カラーコード}"}'
ラベル名が日本語の場合はunicodeエスケープしてください。
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"0:\u672a\u5bfe\u5fdc","color":"dbefff"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"1:\u5bfe\u5fdc\u4e2d","color":"bbdefb"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"2:\u52d5\u4f5c\u691c\u8a3c","color":"90caf9"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"3:\u958b\u767a\u5b8c\u4e86","color":"2196f3"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"4:\u78ba\u8a8d\u6e08\u307f","color":"1976d2"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"5:\u672c\u756a\u53cd\u6620\u6e08","color":"0d47a1"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"8:\u4fdd\u7559","color":"CCCCCC"}'
$ curl -X POST https://api.github.com/repos/kung-fu/labels-sample/labels -u kung-fu:{token} -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"9:\u5bfe\u5fdc\u3057\u306a\u3044","color":"666666"}'
結果
適当にシェルスクリプトにしてみる
#!/bin/sh
API_URL="https://api.github.com/repos"
if [ $# -ne 4 ]; then
echo "[usage]" 1>&2
echo "setup_labels.sh {owner} {repo} {user} {token} " 1>&2
exit 1
fi
curl -X DELETE $API_URL/$1/$2/labels/bug -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/duplicate -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/enhancement -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/help%20wanted -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/invalid -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/question -u $3:$4
curl -X DELETE $API_URL/$1/$2/labels/wontfix -u $3:$4
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"0:\u672a\u5bfe\u5fdc","color":"dbefff"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"1:\u5bfe\u5fdc\u4e2d","color":"bbdefb"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"2:\u52d5\u4f5c\u691c\u8a3c","color":"90caf9"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"3:\u958b\u767a\u5b8c\u4e86","color":"2196f3"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"4:\u78ba\u8a8d\u6e08\u307f","color":"1976d2"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"5:\u672c\u756a\u53cd\u6620\u6e08","color":"0d47a1"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"8:\u4fdd\u7559","color":"CCCCCC"}'
curl -X POST $API_URL/$1/$2/labels -u $3:$4 -H "Accept: application/json" -H "Content-type: application/json" -d '{"name":"9:\u5bfe\u5fdc\u3057\u306a\u3044","color":"666666"}'
$ ./setup_labels.sh {owner} {repo} {user} {token}
ぎりぎりコマンド一発です。