本文演示了如何使用 GraphQL API 管理项目。有关如何在 GitHub Actions 工作流程中使用 API 的更多信息,请参阅“使用 Actions 自动化项目”。有关可用数据类型的完整列表,请参阅“参考”。
身份验证
在以下所有 curl
命令示例中,将 TOKEN
替换为具有 read:project
范围(用于查询)或 project
范围(用于查询和变异)的令牌。该令牌可以是用户的个人访问令牌(经典)或 GitHub 应用程序的安装访问令牌。有关创建个人访问令牌的更多信息,请参阅“管理您的个人访问令牌”。有关为 GitHub 应用程序创建安装访问令牌的更多信息,请参阅“为 GitHub 应用程序生成安装访问令牌”。
当使用 GitHub 应用程序的安装访问令牌时,某些 GraphQL 变异需要额外的权限。例如,当使用 createProjectV2
变异时,如果您指定 repositoryId
输入参数,则还需要该存储库的 Contents
权限才能将项目链接到目标存储库。
要了解有关 GitHub CLI 的更多信息,请参阅“关于 GitHub CLI”。
在运行 GitHub CLI 命令之前,您必须通过运行 gh auth login --scopes "project"
进行身份验证。如果您只需要读取项目,而不需要编辑项目,则可以提供 read:project
范围而不是 project
。有关命令行身份验证的更多信息,请参阅“gh auth login”。
使用变量
在以下所有示例中,您可以使用变量来简化脚本。使用-F
传递数字、布尔值或 null 类型的变量。使用-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。将 TITLE
和 BODY
替换为新草稿问题的内容。
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
更改 Assignees
、Labels
、Milestone
或 Repository
,因为这些字段是拉取请求和问题的属性,而不是项目项目的属性。您可以使用以下变异来代替
更新单选字段
以下示例将更新项目的单选字段值。
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
}
}'
管理项目
创建项目
您可以使用 mutation 创建新项目。有关更多信息,请参阅 "使用 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
}
}
}'
使用 Webhook
您可以使用 Webhook 订阅项目中发生的事件。例如,当项目被编辑时,GitHub 可以将 HTTP POST 负载发送到 Webhook 配置的 URL,这可以在您的服务器上触发自动化。有关 Webhook 的更多信息,请参阅 "关于 Webhook。" 要了解有关 projects_v2_item
Webhook 事件的更多信息,请参阅 "Webhook 事件和负载。"。