跳至主要内容

使用 API 管理项目

您可以使用 GraphQL API 自动化您的项目。

工具导航

本文演示如何使用 GraphQL API 管理项目。有关如何在 GitHub Actions 工作流中使用 API 的更多信息,请参阅“使用 Actions 自动化项目”。有关可用数据类型的完整列表,请参阅“参考”。

身份验证

在以下所有curl命令示例中,请将TOKEN替换为具有read:project作用域(用于查询)或project作用域(用于查询和变异)的令牌。该令牌可以是用户的个人访问令牌(经典)或GitHub App的安装访问令牌。有关创建个人访问令牌的更多信息,请参阅“管理您的个人访问令牌”。有关为GitHub App创建安装访问令牌的更多信息,请参阅“为GitHub App生成安装访问令牌”。

当为GitHub App使用安装访问令牌时,某些GraphQL变异需要额外的权限。例如,当使用createProjectV2变异时,如果指定了repositoryId输入参数,则还需要该存储库的Contents权限才能将项目链接到目标存储库。

要了解有关GitHub CLI的更多信息,请参阅“关于GitHub CLI”。

在运行GitHub CLI命令之前,必须通过运行gh auth login --scopes "project"进行身份验证。如果您只需要读取项目而不需要编辑,则可以使用read:project作用域代替project。有关命令行身份验证的更多信息,请参阅“gh auth login”。

使用变量

在以下所有示例中,您可以使用变量来简化脚本。使用-F传递数字、布尔值或空值变量。对于其他变量,请使用-f。例如:

my_org="octo-org"
my_num=5
gh api graphql -f query='
  query($organization: String! $number: Int!){
    organization(login: $organization){
      projectV2(number: $number) {
        id
      }
    }
  }' -f organization=$my_org -F number=$my_num

更多信息,请参阅“使用GraphQL构建调用”。

查找有关项目的信息

使用查询获取有关项目的数据。更多信息,请参阅“使用GraphQL构建调用”。

查找组织项目的节点ID

要通过API更新项目,您需要知道项目的节点ID。

如果您知道组织名称和项目编号,则可以找到组织项目的节点ID。将ORGANIZATION替换为您的组织名称。例如,octo-org。将NUMBER替换为项目编号。要查找项目编号,请查看项目URL。例如,https://github.com/orgs/octo-org/projects/5的项目编号为5。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{organization(login: \"ORGANIZATION\") {projectV2(number: NUMBER){id}}}"}'
gh api graphql -f query='
  query{
    organization(login: "ORGANIZATION"){
      projectV2(number: NUMBER) {
        id
      }
    }
  }'

您还可以找到组织中所有项目的节点ID。以下示例将返回组织中前20个项目的节点ID和标题。将ORGANIZATION替换为您的组织名称。例如,octo-org

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"{organization(login: \"ORGANIZATION\") {projectsV2(first: 20) {nodes {id title}}}}"}'
gh api graphql -f query='
  query{
    organization(login: "ORGANIZATION") {
      projectsV2(first: 20) {
        nodes {
          id
          title
        }
      }
    }
  }'

查找用户项目的节点ID

要通过API更新项目,您需要知道项目的节点ID。

如果您知道项目编号,则可以找到用户项目的节点ID。将USER替换为您的用户名。例如,octocat。将NUMBER替换为您的项目编号。要查找项目编号,请查看项目URL。例如,https://github.com/users/octocat/projects/5的项目编号为5。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{user(login: \"USER\") {projectV2(number: NUMBER){id}}}"}'
gh api graphql -f query='
  query{
    user(login: "USER"){
      projectV2(number: NUMBER) {
        id
      }
    }
  }'

您还可以找到所有项目的节点ID。以下示例将返回您的前20个项目的节点ID和标题。将USER替换为您的用户名。例如,octocat

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"{user(login: \"USER\") {projectsV2(first: 20) {nodes {id title}}}}"}'
gh api graphql -f query='
  query{
    user(login: "USER") {
      projectsV2(first: 20) {
        nodes {
          id
          title
        }
      }
    }
  }'

查找字段的节点ID

要更新字段的值,您需要知道字段的节点ID。此外,您还需要知道单选字段选项的ID和迭代字段迭代的ID。

以下示例将返回项目中前20个字段的ID、名称、设置和配置。将PROJECT_ID替换为您的项目节点ID。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { fields(first: 20) { nodes { ... on ProjectV2Field { id name } ... on ProjectV2IterationField { id name configuration { iterations { startDate id }}} ... on ProjectV2SingleSelectField { id name options { id name }}}}}}}"}'
gh api graphql -f query='
  query{
  node(id: "PROJECT_ID") {
    ... on ProjectV2 {
      fields(first: 20) {
        nodes {
          ... on ProjectV2Field {
            id
            name
          }
          ... on ProjectV2IterationField {
            id
            name
            configuration {
              iterations {
                startDate
                id
              }
            }
          }
          ... on ProjectV2SingleSelectField {
            id
            name
            options {
              id
              name
            }
          }
        }
      }
    }
  }
}'

响应将类似于以下示例

{
  "data": {
    "node": {
      "fields": {
        "nodes": [
          {
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZY",
            "name": "Title"
          },
          {
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZc",
            "name": "Assignees"
          },
          {
            "id": "PVTSSF_lADOANN5s84ACbL0zgBZrZg",
            "name": "Status",
            "options": [
              {
                "id": "f75ad846",
                "name": "Todo"
              },
              {
                "id": "47fc9ee4",
                "name": "In Progress"
              },
              {
                "id": "98236657",
                "name": "Done"
              }
            ]
          },
          {
            "id": "PVTIF_lADOANN5s84ACbL0zgBah28",
            "name": "Iteration",
            "configuration": {
              "iterations": [
                {
                  "startDate": "2022-05-29",
                  "id": "cfc16e4d"
                }
              ]
            }
          }
        ]
      }
    }
  }
}

每个字段都有一个ID和名称。单选字段作为ProjectV2SingleSelectField对象返回,并具有options字段,您可以在其中找到单选字段中每个选项的ID。迭代字段作为ProjectV2IterationField对象返回,并具有configuration字段,该字段包含一个iterations字段,其中包含每个迭代的ID和信息。

如果您只需要字段的名称和ID,而不需要有关迭代或单选字段选项的信息,则可以使用ProjectV2FieldCommon对象。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { fields(first: 20) { nodes { ... on ProjectV2FieldCommon { id name }}}}}}"}'
gh api graphql -f query='
  query{
  node(id: "PROJECT_ID") {
    ... on ProjectV2 {
      fields(first: 20) {
        nodes {
          ... on ProjectV2FieldCommon {
            id
            name
          }
        }
      }
    }
  }
}'

使用ProjectV2FieldCommon对象时的响应将类似于以下示例

{
  "data": {
    "node": {
      "fields": {
        "nodes": [
          {
            "__typename": "ProjectV2Field",
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZY",
            "name": "Title"
          },
          {
            "__typename": "ProjectV2Field",
            "id": "PVTF_lADOANN5s84ACbL0zgBZrZc",
            "name": "Assignees"
          },
          {
            "__typename": "ProjectV2SingleSelectField",
            "id": "PVTSSF_lADOANN5s84ACbL0zgBZrZg",
            "name": "Status"
          },
          {
            "__typename": "ProjectV2IterationField",
            "id": "PVTIF_lADOANN5s84ACbL0zgBah28",
            "name": "Iteration"
          }
        ]
      }
    }
  }
}

查找项目中项目的信息

您可以查询API以查找项目中项目的信息。

以下示例将返回项目中的前20个问题、拉取请求和草稿问题。对于问题和拉取请求,它还将返回标题和前10个受让人。对于草稿问题,它将返回标题和正文。该示例还将返回项目前8个字段中任何文本、日期或单选字段的字段名称和值。将PROJECT_ID替换为您的项目节点ID。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"query{ node(id: \"PROJECT_ID\") { ... on ProjectV2 { items(first: 20) { nodes{ id fieldValues(first: 8) { nodes{ ... on ProjectV2ItemFieldTextValue { text field { ... on ProjectV2FieldCommon {  name }}} ... on ProjectV2ItemFieldDateValue { date field { ... on ProjectV2FieldCommon { name } } } ... on ProjectV2ItemFieldSingleSelectValue { name field { ... on ProjectV2FieldCommon { name }}}}} content{ ... on DraftIssue { title body } ...on Issue { title assignees(first: 10) { nodes{ login }}} ...on PullRequest { title assignees(first: 10) { nodes{ login }}}}}}}}}"}'
gh api graphql -f query='
  query{
    node(id: "PROJECT_ID") {
        ... on ProjectV2 {
          items(first: 20) {
            nodes{
              id
              fieldValues(first: 8) {
                nodes{                
                  ... on ProjectV2ItemFieldTextValue {
                    text
                    field {
                      ... on ProjectV2FieldCommon {
                        name
                      }
                    }
                  }
                  ... on ProjectV2ItemFieldDateValue {
                    date
                    field {
                      ... on ProjectV2FieldCommon {
                        name
                      }
                    }
                  }
                  ... on ProjectV2ItemFieldSingleSelectValue {
                    name
                    field {
                      ... on ProjectV2FieldCommon {
                        name
                      }
                    }
                  }
                }              
              }
              content{              
                ... on DraftIssue {
                  title
                  body
                }
                ...on Issue {
                  title
                  assignees(first: 10) {
                    nodes{
                      login
                    }
                  }
                }
                ...on PullRequest {
                  title
                  assignees(first: 10) {
                    nodes{
                      login
                    }
                  }
                }
              }
            }
          }
        }
      }
    }'

项目可能包含用户无权查看的项目。在这种情况下,项目类型将返回为REDACTED

更新项目

使用变异来更新项目。更多信息,请参阅“使用GraphQL构建调用”。

注意

您不能在同一个调用中添加和更新项目。您必须使用addProjectV2ItemById添加项目,然后使用updateProjectV2ItemFieldValue更新项目。

向项目添加项目

以下示例将向您的项目添加问题或拉取请求。将PROJECT_ID替换为您的项目节点ID。将CONTENT_ID替换为您要添加的问题或拉取请求的节点ID。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {addProjectV2ItemById(input: {projectId: \"PROJECT_ID\" contentId: \"CONTENT_ID\"}) {item {id}}}"}'
gh api graphql -f query='
  mutation {
    addProjectV2ItemById(input: {projectId: "PROJECT_ID" contentId: "CONTENT_ID"}) {
      item {
        id
      }
    }
  }'

响应将包含新创建项目的节点ID。

{
  "data": {
    "addProjectV2ItemById": {
      "item": {
        "id": "PVTI_lADOANN5s84ACbL0zgBVd94"
      }
    }
  }
}

如果您尝试添加已存在的项目,则会返回现有项目的ID。

向项目添加草稿问题

以下示例将向您的项目添加草稿问题。将PROJECT_ID替换为您的项目节点ID。将TITLEBODY替换为您想要的新草稿问题的正文。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {addProjectV2DraftIssue(input: {projectId: \"PROJECT_ID\" title: \"TITLE\" body: \"BODY\"}) {projectItem {id}}}"}'
gh api graphql -f query='
  mutation {
    addProjectV2DraftIssue(input: {projectId: "PROJECT_ID" title: "TITLE" body: "BODY"}) {
      projectItem {
        id
      }
    }
  }'

响应将包含新创建的草稿问题的节点ID。

{
  "data": {
    "addProjectV2DraftIssue": {
      "projectItem": {
        "id": "PVTI_lADOANN5s84ACbL0zgBbxFc"
      }
    }
  }
}

更新项目的设置

以下示例将更新您的项目设置。将PROJECT_ID替换为您的项目节点ID。将public设置为true可在GitHub上公开您的项目。修改readme以更改项目的自述文件。

curl --request POST \
--url https://api.github.com/graphql \
--header 'Authorization: Bearer TOKEN' \
--data '{"query":"mutation { updateProjectV2(input: { projectId: \"PROJECT_ID\", title: \"Project title\", public: false, readme: \"# Project README\n\nA long description\", shortDescription: \"A short description\"}) { projectV2 { id, title, readme, shortDescription }}}"}'
gh api graphql -f query='
  mutation {
    updateProjectV2(
      input: {
        projectId: "PROJECT_ID", 
        title: "Project title",
        public: false,
        readme: "# Project README\n\nA long description",
        shortDescription: "A short description"
      }
    ) {
      projectV2 {
        id
        title
        readme
        shortDescription
      }
    }
  }'

更新自定义文本、数字或日期字段

以下示例将更新项目的文本字段的值。将PROJECT_ID替换为您的项目节点ID。将ITEM_ID替换为您要更新的项目的节点ID。将FIELD_ID替换为您要更新的字段的ID。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { text: \"Updated text\" }}) { projectV2Item { id }}}"}'
gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: { 
          text: "Updated text"        
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

注意

您不能使用updateProjectV2ItemFieldValue更改AssigneesLabelsMilestoneRepository,因为这些字段是拉取请求和问题的属性,而不是项目项目的属性。您可以使用以下变异:

更新单选字段

以下示例将更新项目的单选字段的值。

  • PROJECT_ID - 将其替换为您的项目节点ID。
  • ITEM_ID - 将其替换为您要更新的项目的节点ID。
  • FIELD_ID - 将其替换为您要更新的单选字段的ID。
  • OPTION_ID - 将其替换为所需的单选选项的ID。
curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { singleSelectOptionId: \"OPTION_ID\" }}) { projectV2Item { id }}}"}'
gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: { 
          singleSelectOptionId: "OPTION_ID"        
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

更新迭代字段

以下示例将更新项目的迭代字段的值。

  • PROJECT_ID - 将其替换为您的项目节点ID。
  • ITEM_ID - 将其替换为您要更新的项目的节点ID。
  • FIELD_ID - 将其替换为您要更新的迭代字段的ID。
  • ITERATION_ID - 将其替换为所需的迭代的ID。这可以是活动迭代或已完成迭代。
curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {updateProjectV2ItemFieldValue( input: { projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\" fieldId: \"FIELD_ID\" value: { iterationId: \"ITERATION_ID\" }}) { projectV2Item { id }}}"}'
gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: { 
          iterationId: "ITERATION_ID"        
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

从项目中删除项目

以下示例将从项目中删除项目。将PROJECT_ID替换为您的项目节点ID。将ITEM_ID替换为您要删除的项目的节点ID。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: Bearer TOKEN' \
  --data '{"query":"mutation {deleteProjectV2Item(input: {projectId: \"PROJECT_ID\" itemId: \"ITEM_ID\"}) {deletedItemId}}"}'
gh api graphql -f query='
  mutation {
    deleteProjectV2Item(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
      }
    ) {
      deletedItemId
    }
  }'

管理项目

创建项目

您可以使用变异来创建一个新项目。更多信息,请参阅“使用GraphQL构建调用”。

要使用API创建新项目,您需要提供项目的名称和将成为项目所有者的GitHub用户或组织的节点ID。

如果您知道用户名,则可以找到GitHub用户或组织的节点ID。将GITHUB_OWNER替换为新项目所有者的GitHub用户名。

curl --request GET \
  --url https://api.github.com/users/GITHUB_OWNER \
  --header 'Authorization: token TOKEN' \
  --header 'Accept: application/vnd.github+json'
gh api -H "Accept: application/vnd.github+json" /users/GITHUB_OWNER

要创建项目,请将OWNER_ID替换为新项目所有者的节点ID,并将PROJECT_NAME替换为项目的名称。

curl --request POST \
  --url https://api.github.com/graphql \
  --header 'Authorization: token TOKEN' \
  --data '{"query":"mutation {createProjectV2(input: {ownerId: \"OWNER_ID\" title: \"PROJECT_NAME\"}) {projectV2 {id}}}"}'
gh api graphql -f query='
  mutation{
    createProjectV2(
      input: {
        ownerId: "OWNER_ID",
        title: "PROJECT_NAME"
      }
    ){
      projectV2 {
        id
      }
     }
  }'

使用Webhooks

您可以使用 Webhook 订阅项目中发生的事件。例如,当项目项被编辑时,GitHub 可以向 Webhook 的已配置 URL 发送 HTTP POST 负载,从而触发您服务器上的自动化操作。有关 Webhook 的更多信息,请参阅“关于 Webhook”。要了解有关 projects_v2_item Webhook 事件的更多信息,请参阅“Webhook 事件和负载”。