GitHubのチームはオーガナイゼーションに紐づくサブ組織的な位置付けです。
GitHubのオーガナイゼーションとチーム
このような階層構造になっています。
オーガナイゼーション1
|--チームA
|--チームB
|--チームC
オーガナイゼーションのメンバーとして管理権限がないと、オーガナイゼーション外のユーザーをオーガナイゼーション配下のチームに追加することは出来ません。
例えば、チームBにだけメンバーを追加しようとしても、オーガナイゼーション1に先に追加しないといけません。さらにこれをやる場合、オーガナイゼーション1の管理権限がないといけません。
オーガナイゼーション1に所属している管理権限がない人でもチームに人を追加できるように出来ないかと思い、APIを使ってみました。
GitHubのAPIアクセストークンを発行
こちら(個人アクセストークンを使用する)をみてアクセストークンを取得します。
Settings
> Developer settings
> Personal access tokens
で見れます
オーガナイゼーションだけのコントロールをしたいのでこんなチェックにしてトークンを発行しました。
ghp_
で始まる文字列がトークンとして発行されます。
GitHubのチーム追加のAPIをまずはCURLで試す
Add or update team membership for a userを見てみます。
/orgs/{org}/teams/{team_slug}/memberships/{username}
という形式でAPIを叩くことで利用できます。
$ curl -u {ORG_NAME}:{トークン} -X PUT -H "Accept: application/vnd.github.inertia-preview+json" https://api.github.com/orgs/{ORG_NAME}/teams/{TEAM_NAME}/memberships/{USER_NAME} -d '{"role":"member"}'
こんな形式で利用することができました。
Node.js(axios)からAPIを利用する
先程のCURLのコマンドからaxiosに書き換えてみます。-uオプションはベーシック認証なんですね。
$ npm i axios
const axios = require(`axios`);
const gh = async () => {
const TOKEN = `トークンを指定`;
const ORG = `protoout`; //追加先のオーガナイゼーション
const TEAM = `protoout-student`; //追加するチーム名
const USER_NAME = `n0bisuke`; //追加するユーザー
const BASE_URL = `https://api.github.com`;
const PATH = `/orgs/${ORG}/teams/${TEAM}/memberships/${USER_NAME}`
const config = {
baseURL: BASE_URL,
url: PATH,
method: 'put',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.inertia-preview+json',
},
auth: {
username: ORG,
password: TOKEN
},
data: {
'role': 'member' //固定 API経由で管理者を追加することはあんまりなさそう
}
};
const res = await axios.request(config);
console.log(res.data);
}
gh();
実行結果
$ node app.js
{
state: 'active',
role: 'maintainer',
url: 'https://api.github.com/organizations/XXXXXX/team/XXXXXX/memberships/n0bisuke'
}
すでに入っているもしくは招待に成功すると、acitve
のステータスが返ってきます。
オーガナイゼーション外部の人を招待する場合は、一旦メールがユーザーに飛び、ユーザーが許可するとチームにも追加されるという流れなので、最初はpending
のステータスになると思います。
まとめ
こんな感じでオーガナイゼーション招待&チーム追加ができました。
ユーザーにはメールが飛んでいるので、オーガナイゼーションに参加してもらいます。ユーザーが参加ボタンを押すことでオーガナイゼーションにやっと追加されるので、追加後にはユーザーに確認を入れると良さそうですね。
実際の運用だと、こんな感じでDiscordのBOTから呼び出せるようにしてみています。
便利だ。。