GitHub GraphQL API でIssuesのラベルを作成する

GitHub GraphQL API でIssuesのラベルを作成する

GitHubのGraphQL APIを利用して、Issuesのラベルを作成してみました。
Clock Icon2024.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"
  }
]

01_github_issues

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.