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が必要なため、事前に取得しています。
create_issue_label.py
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"
}
]