GitHub GraphQL API でIssuesのラベルを作成する
GitHubのGraphQL APIを利用して、Issuesのラベルを作成してみました。
2024.04.30
GitHubのGraphQL APIを利用して、Issuesのラベルを作成してみました。
おすすめの方
- GitHub GraphQL APIについて知りたい方
- GitHub GraphQL APIでIssuesのラベルを作成したい方
- GitHub GraphQL APIでIssuesのラベル一覧を取得したい方
- GitHub GraphQL APIで変数を使いたい方
GitHub GraphQL API でIssuesのラベルを作成するスクリプト
Issuesのラベルは、次のMutationを利用します。ただし、Previewのため、リクエストヘッダーのAcceptに指定の文字列を設定しています。
ラベルを作るためにはrepositoryIdが必要なため、事前に取得しています。
import requests import json import random ENDPOINT = "https://api.github.com/graphql" GITHUB_TOKEN = "xxx" GITHUB_REPOSITORY_OWNER = "yyy" GITHUB_REPOSITORY_NAME = "zzz" LABELS = [ "aaa", "bbb", "ccc", ] def main(): # リポジトリIDを取得する repository_id = get_repository_id(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME) # ラベル一覧を取得する labels = get_issue_labels(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME) print(json.dumps(labels, indent=2)) # ラベルを作成する for item in LABELS: create_issue_label(repository_id, item) # ラベル一覧を取得する labels = get_issue_labels(GITHUB_REPOSITORY_OWNER, GITHUB_REPOSITORY_NAME) print(json.dumps(labels, indent=2)) def get_repository_id( repository_owner, repository_name, ): query = """ query getProjectLabels($repositoryOwner:String!, $repositoryName:String!) { repository(owner: $repositoryOwner, name: $repositoryName) { id } } """ variables = { "repositoryOwner": repository_owner, "repositoryName": repository_name, } resp = requests.post( ENDPOINT, headers=get_headers(), data=json.dumps({"query": query, "variables": variables}), ) body = resp.json() return body["data"]["repository"]["id"] def create_issue_label(repository_id, name): mutation = """ mutation CreateLabel($repositoryId: ID!, $name: String!, $color: String!) { createLabel(input: {repositoryId: $repositoryId, name: $name, color: $color}) { label { id name color } } } """ variables = { "repositoryId": repository_id, "name": name, "color": random_color_hex(), } resp = requests.post( ENDPOINT, headers=get_headers(), data=json.dumps({"query": mutation, "variables": variables}), ) body = resp.json() return body["data"]["createLabel"]["label"]["id"] def get_issue_labels( repository_owner, repository_name, ): query = """ query getLabels($repositoryOwner:String!, $repositoryName:String!) { repository(owner: $repositoryOwner, name: $repositoryName) { labels(first: 100) { nodes { id name } } } } """ variables = { "repositoryOwner": repository_owner, "repositoryName": repository_name, } resp = requests.post( ENDPOINT, headers=get_headers(), data=json.dumps({"query": query, "variables": variables}), ) body = resp.json() return body["data"]["repository"]["labels"]["nodes"] def random_color_hex(): hex_chars = "0123456789abcdef" color_hex = "" for i in range(6): color_hex += random.choice(hex_chars) return color_hex def get_headers(): return { "Authorization": f"bearer {GITHUB_TOKEN}", "Accept": "application/vnd.github.bane-preview+json", } if __name__ == "__main__": main()
実行結果
GitHub Issuesのラベルを作成できました。
$ python create_issue_label.py [] [ { "id": "LA_kwDOLfC6C88AAAABkSNoSg", "name": "aaa" }, { "id": "LA_kwDOLfC6C88AAAABkSNoXA", "name": "bbb" }, { "id": "LA_kwDOLfC6C88AAAABkSNodA", "name": "ccc" } ]