Github appを使った組織メンバーをTeamに編成する

Githubの組織管理についての記事です。

ピンポイントで組織のTeamに追加したり削除したり
Team自体を作成したりなどを行う方法についてです。

詳細は下記公式ページを参照ください。

https://docs.github.com/ja/enterprise-cloud@latest/organizations


---

Teamにメンバーを追加する作業を行います。
下記公式を読む限り、メンバーを追加するボタンから
追加するしかなさそうです。

※csvから一括でインポートするというような項目がありません（汗）

※さらに、コピペでまとめて追加するという事もできそうにありません（汗汗汗）

https://docs.github.com/ja/enterprise-cloud@latest/organizations/organizing-members-into-teams/adding-organization-members-to-a-team

これ、、なん十件もあったら手間すぎる

---
### そんな時はAPIを使おう

Github appを使った組織メンバーをTeamに編成する手順です。

1. Github appのを構成する
1. Github appのインストール
1. Github appの認証と使用


#### 1.Github appを構成する

https://docs.github.com/ja/apps/creating-github-apps/about-creating-github-apps/about-creating-github-apps

※組織アカウントで作成、個人アカウントだと権限が反映されませんでした

組織アカウントに切り替えて、左のタブからDeveloper settingsを選択、Github appを選んでNew GitHub Appを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/dffea474-4966-51a4-c478-fa82b8d1fc9f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/2918c3fb-56a7-b446-320a-7139a701ec1f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/487b66dc-a501-a7c1-da9d-2093b036b784.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/778ee8de-be18-d9e8-9cc1-90dfa147573c.png)

項目は
- 名前
- Homepage URL　適当でも何でもいいです。
- Webhook Activeチェックは外しました WebhookURL求められるため
- Permissions
    - Organization permissionsのMembersにR/W権限、一応AdminにもReadを付けました。
- 作成
- 作成後、アプリのGeneral画面から秘密鍵を生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/432a986b-8a11-68ec-d6ce-0f6827ba087f.png)


各アクセス権限で実行可能なAPIは下記参照ください。

https://docs.github.com/ja/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28

---

#### 2.Github appのインストール

GitHub appの設定画面からInstall Appします。
付与したアクセス権限がインストールされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/0b281891-ff74-9031-8ca7-58d03198d2ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/df607a96-af7c-76e4-0a3c-b74e9de9a0c9.png)

---
#### 3.Github appの認証と使用

参考にしたのは下記記事です。

https://qiita.com/daisukeArk/items/8e9cc6cf4ebc944110f1

App IDはアプリのGeneral画面に表示されています。

Install IDはアプリ設定、インストール状態のページに表示されているURLに記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/85891563-19e4-ca98-91e1-5c83b57d3fe3.png)



```python:qiita.py
import jwt
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
import requests
import time

# アクセストークンの取得
with open('[秘密鍵ファイル名].pem', 'r') as f:
    pem_bin = f.read().encode()

private_key = serialization.load_pem_private_key(pem_bin, None, default_backend())

unix_time_now = int(time.time())

payload = {
    "iat": unix_time_now - 60,
    "exp": unix_time_now + (10 * 60),
    "iss": [App ID] # 1111111
}

jwt = jwt.encode(payload, private_key, algorithm='RS256')

headers = {
    "Authorization": f"Bearer {jwt}",
    "Accept": "application/vnd.github.v3+json"
}

# Install IDを上書きしてください。
url = 'https://api.github.com/app/installations/[Install ID]/access_tokens'

response = requests.post(url, headers=headers)

response_text = response.json()

token = response_text["token"]

# print(token)　アクセストークンが取得できていればOK

# APIの使用
headers = {
    "Authorization": f"Bearer {token}",
    "Accept": "application/vnd.github.v3+json",
    "X-GitHub-Api-Version": "2022-11-28"
}

# チーム情報の取得(Get)
# url = "https://api.github.com/orgs/[組織名]/teams/[チーム名]"

# チームにメンバーを追加する(Put)
# url = "https://api.github.com/orgs/[組織名]/teams/[チーム名]/memberships/[ユーザー名]"

payload = {
    "role": "maintainer"
}

url = "https://api.github.com/orgs/Qiita/teams/team-01/memberships/qiita_user

response = requests.put(url, headers=headers, params=payload)

print(response.text)


```