まくろぐ
更新: / 作成:

GitHub の GraphQL API を使ってリポジトリの情報を取得するには、次のような方法があります。

  • repository クエリ … 組織名(あるいはユーザ名)とリポジトリ名が分かっている場合
  • organization クエリ … ある組織内のリポジトリの一覧を取得する場合(こちらの記事 を参考にしてください)
  • search クエリ汎用的な検索用クエリ でリポジトリを検索する

search クエリでリポジトリを検索する

特定の組織 (organization) 内のリポジトリを取得するには、organization クエリを使って 得られた Organization オブジェクトの repositories を参照する方法もありますが、最初から search クエリを使っていろいろな条件を指定して検索する方が早いです。

次の例では、myorg という組織内の、product というトピックの付けられたリポジトリの一覧を取得しています。

クエリ例
query {
  search(type: REPOSITORY, query: "org:myorg topic:product", last: 100) {
    repositoryCount
    nodes {
      ... on Repository {
        id
        url
        name
        description
        createdAt
      }
    }
  }
}
実行結果
{
  "data": {
    "search": {
      "repositoryCount": 3,
      "nodes": [
        {
          "id": "DEMwOlJlcG9zaXRvcnkzODA5MTQ0OQ==",
          "url": "https://github.com/myorg/Repo1",
          "name": "Repo1",
          "description": "Repo1 の概要説明",
          "createdAt": "2015-06-26T04:54:51Z"
        },
        {
          "id": "DEMwOlJlcG9zaXRvcnkxNjI2NjczMjY=",
          "url": "https://github.com/myorg/Repo2",
          "name": "Repo2",
          "description": "Repo2 の概要説明",
          "createdAt": "2018-12-21T04:51:54Z"
        },
        {
          "id": "DEMwOlJlcG9zaXRvcnkyNDUzMjU1NDI=",
          "url": "https://github.com/myorg/Repo3",
          "name": "Repo3",
          "description": "Repo3 の概要説明",
          "createdAt": "2020-03-06T03:56:40Z"
        },
      ]
    }
  }
}

あるリポジトリのマイルストーンの一覧を取得する

repository クエリ を使用すると、指定した組織(ユーザー)の、指定したリポジトリの情報を取得することができます。

次の GraphQL クエリは、apollographql/apollo-client リポジトリで設定されているマイルストーンの一覧を要求しています。 milestones クエリで最初の 3 件分を取得していますが、最大 100 件まで同時に取得することができます。 100 件を超えるデータを取得したいときは、ページネーション処理 が必要です。

クエリ例
query {
  repository(owner: "apollographql", name: "apollo-client") {
    name
    url
    milestones(states: [OPEN,CLOSED], first: 3) {
      totalCount
      nodes {
        url
        title
        dueOn
        closed
        description
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}
実行結果
{
  "data": {
    "repository": {
      "name": "apollo-client",
      "url": "https://github.com/apollographql/apollo-client",
      "milestones": {
        "totalCount": 17,
        "nodes": [
          {
            "url": "https://github.com/apollographql/apollo-client/milestone/1",
            "title": "alpha",
            "dueOn": "2016-04-19T07:00:00Z",
            "closed": true,
            "description": "Alpha release of the client, with enough features to be useful in a real app."
          },
          {
            "url": "https://github.com/apollographql/apollo-client/milestone/2",
            "title": "newspring-production",
            "dueOn": null,
            "closed": true,
            "description": ""
          },
          {
            "url": "https://github.com/apollographql/apollo-client/milestone/3",
            "title": "5/10 cycle",
            "dueOn": null,
            "closed": true,
            "description": "Some things to button down in the short term, that a lot of people have been asking about!"
          }
        ],
        "pageInfo": {
          "endCursor": "Y3Vyc29yOnYyOpHOABqZMg==",
          "hasNextPage": true
        }
      }
    }
  }
}

マイルストーンの一覧をソートする

milestones クエリを発行するときに、orderBy パラメータを指定すると、特定のフィールドの値を使ってソートされた結果を取得することができます。 次の例では、マイルストーンの Due Date が遅いものから順番に 100 件分を取得します。

GraphQL クエリ
query {
  repository(owner: "apollographql", name: "apollo-client") {
    milestones(states: [OPEN,CLOSED], last: 100,
        orderBy: {field: DUE_DATE, direction: DESC}) {
      nodes {
        url
        title
        dueOn
        closed
      }
    }
  }
}

マイルストーンに所属するイシューを取得する

milestones クエリを発行するときに、入れ子の形で issues を要求することで、各マイルストーンに所属するイシューのリストまで同時に取得してしまうことができます。

クエリ例
query {
  repository(owner: "apollographql", name: "apollo-client") {
    name
    url
    milestones(states: [OPEN,CLOSED], first: 3) {
      totalCount
      nodes {
        url
        title
        dueOn
        closed
        description
        issues(states: [OPEN,CLOSED], first: 10, labels: ["EPIC"]) {
          nodes {
            url
            title
            closed
          }
          pageInfo {
            endCursor
            hasNextPage
          }
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}
実行結果
省略

関連記事

まくろぐ
サイトマップまくへのメッセージ