LoginSignup
3
0

More than 1 year has passed since last update.

Node.jsでGitHubのオーガナイゼーションとチームにユーザーを追加する

Last updated at Posted at 2021-06-09

GitHubのチームはオーガナイゼーションに紐づくサブ組織的な位置付けです。

GitHubのオーガナイゼーションとチーム

このような階層構造になっています。

オーガナイゼーション1
    |--チームA
    |--チームB 
    |--チームC

オーガナイゼーションのメンバーとして管理権限がないと、オーガナイゼーション外のユーザーをオーガナイゼーション配下のチームに追加することは出来ません。

例えば、チームBにだけメンバーを追加しようとしても、オーガナイゼーション1に先に追加しないといけません。さらにこれをやる場合、オーガナイゼーション1の管理権限がないといけません。

オーガナイゼーション1に所属している管理権限がない人でもチームに人を追加できるように出来ないかと思い、APIを使ってみました。

GitHubのAPIアクセストークンを発行

こちら(個人アクセストークンを使用する)をみてアクセストークンを取得します。

Settings > Developer settings > Personal access tokensで見れます

オーガナイゼーションだけのコントロールをしたいのでこんなチェックにしてトークンを発行しました。

スクリーンショット 2021-06-09 1.25.02.png

ghp_で始まる文字列がトークンとして発行されます。

スクリーンショット 2021-06-09 1.26.12.png

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オプションはベーシック認証なんですね。

逆引きcurlコマンドのオプション一覧

$ npm i axios
app.js
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から呼び出せるようにしてみています。

スクリーンショット 2021-06-09 20.03.20.png

便利だ。。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0