Posted at

Github APIを使ってラベルのセットアップをする

More than 3 years have passed since last update.


はじめに

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"}'


結果

https://github.com/kung-fu/labels-sample/labels


適当にシェルスクリプトにしてみる


setup_labels.sh

#!/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}


ぎりぎりコマンド一発です。