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

# はじめに

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
```


```console:実行結果
$ 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}
```


```console:実行結果
$ 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}
```


```console:実行結果
$ 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}
```


```console:実行結果
$ 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エスケープしてください。

```console:実行結果
$ 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

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

```bash: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"}'
```

```console:実行！
$ ./setup_labels.sh {owner} {repo} {user} {token}
```

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