Skip to main content

Usando a API para gerenciar Projects

Você pode usar a API do GraphQL para automatizar seus projetos.

Tool navigation

Este artigo demonstra como usar a API do GraphQL para gerenciar um projeto. Para obter mais informações sobre como usar a API em um fluxo de trabalho do GitHub Actions, confira Automatizar Projects usando ações. Para ver a lista completa dos tipos de dados disponíveis, confira Referência.

Autenticação

Note

Para saber mais sobre GitHub CLI, confira Sobre o a CLI do GitHub.

Antes de executar os comandos da GitHub CLI, você precisa se autenticar executando gh auth login --scopes "project". Se você só precisar ler projetos, mas não editá-los, forneça o escopo read:project em vez do project. Para obter mais informações sobre a autenticação de linha de comando, confira gh auth login.

Usando variáveis

Em todos os exemplos a seguir, você pode usar variáveis para simplificar seus scripts. Use -F para transmitir uma variável que é um número, um booliano ou nula. Use -f para outras variáveis. Por exemplo:

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

Para saber mais, confira Realizar chamadas com o GraphQL.

Encontrando informações sobre os projetos

Use consultas para obter dados sobre projetos. Para saber mais, confira Realizar chamadas com o GraphQL.

Encontrando o ID do nó de um projeto da organização

Para atualizar seu projeto por meio da API, você precisará conhecer o nó de ID do projeto.

Você pode encontrar o nó do projeto de uma organização se você souber o nome da organização e o número do projeto. Substitua ORGANIZATION pelo nome da sua organização. Por exemplo, octo-org. Substitua NUMBER pelo número do projeto. Para encontrar o número do projeto, consulte a URL do projeto. Por exemplo, https://github.com/orgs/octo-org/projects/5 tem o número de projeto 5.

gh api graphql -f query='
  query{
    organization(login: "ORGANIZATION"){
      projectV2(number: NUMBER) {
        id
      }
    }
  }'

Você também pode encontrar o ID do nó de todos os projetos na sua organização. O exemplo a seguir retornará o ID do nó e o título dos primeiros 20 projetos em uma organização. Substitua ORGANIZATION pelo nome da sua organização. Por exemplo, octo-org.

gh api graphql -f query='
  query{
    organization(login: "ORGANIZATION") {
      projectsV2(first: 20) {
        nodes {
          id
          title
        }
      }
    }
  }'

Encontrar o ID do nó do projeto de um usuário

Para atualizar seu projeto por meio da API, você precisará conhecer o nó de ID do projeto.

Você pode encontrar o ID do nó do projeto se você souber o número do projeto. Substitua USER por seu nome de usuário. Por exemplo, octocat. Substitua NUMBER pelo número do projeto. Para encontrar o número do projeto, consulte a URL do projeto. Por exemplo, https://github.com/users/octocat/projects/5 tem o número de projeto 5.

gh api graphql -f query='
  query{
    user(login: "USER"){
      projectV2(number: NUMBER) {
        id
      }
    }
  }'

Também é possível encontrar o ID do nó para todos os seus projetos. O exemplo a seguir retornará o ID do nó e o título de seus primeiros 20 projetos. Substitua USER pelo seu nome de usuário. Por exemplo, octocat.

gh api graphql -f query='
  query{
    user(login: "USER") {
      projectsV2(first: 20) {
        nodes {
          id
          title
        }
      }
    }
  }'

Encontrando o ID do nó de um campo

Para atualizar o valor de um campo, você precisará saber o ID do nó do campo. Além disso, você precisará saber o ID das opções para um único campo selecionado e o ID das iterações para os campos de iteração.

O exemplo a seguir retornará a ID, o nome, as definições e as configurações dos primeiros 20 campos de um projeto. Substitua PROJECT_ID pela ID de nó do projeto.

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
            }
          }
        }
      }
    }
  }
}'

A resposta será semelhante ao seguinte exemplo:

{
  "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"
                }
              ]
            }
          }
        ]
      }
    }
  }
}

Cada campo tem uma ID e um nome. Os campos de seleção única são retornados como um objeto ProjectV2SingleSelectField e têm um campo options contendo a ID de cada opção da seleção única. Os campos de iteração são retornados como um objeto ProjectV2IterationField e têm um campo configuration que inclui um campo iterations contendo a ID e informações de cada iteração.

Se você precisar apenas do nome e da ID de um campo e não precisar de informações sobre iterações ou opções de um campo de seleção única, use o objeto ProjectV2FieldCommon.

gh api graphql -f query='
  query{
  node(id: "PROJECT_ID") {
    ... on ProjectV2 {
      fields(first: 20) {
        nodes {
          ... on ProjectV2FieldCommon {
            id
            name
          }
        }
      }
    }
  }
}'

A resposta ao usar o objeto ProjectV2FieldCommon será semelhante ao seguinte exemplo:

{
  "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"
          }
        ]
      }
    }
  }
}

Encontrando informações sobre os itens de um projeto

Você pode consultar a API para encontrar informações sobre itens no seu projeto.

O exemplo a seguir retornará os primeiros 20 problemas, solicitações de pull e problemas de rascunho em um projeto. Para os problemas e as solicitações de pull, ele também retornará o título e os dez primeiros destinatários. Para os problemas de rascunho, ele retornará o título e o corpo. O exemplo também retornará o nome e o valor de campos de texto, data ou seleção única nos primeiros oito campos do projeto. Substitua PROJECT_ID pela ID de nó do projeto.

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
                    }
                  }
                }
              }
            }
          }
        }
      }
    }'

Um projeto pode conter itens que um usuário não tem permissão para visualizar. Nesse caso, o tipo de item será retornado como REDACTED.

Atualizando projetos

Use mutações para atualizar projetos. Para saber mais, confira Realizar chamadas com o GraphQL.

Note

Não é possível adicionar nem atualizar um item na mesma chamada. Você precisa usar addProjectV2ItemById para adicionar o item e usar updateProjectV2ItemFieldValue para atualizar o item.

Adicionando um item a um projeto

O exemplo a seguir adicionará um problema ou pull request ao seu projeto. Substitua PROJECT_ID pela ID de nó do projeto. Substitua CONTENT_ID pela ID de nó do problema ou da solicitação de pull que deseja adicionar.

gh api graphql -f query='
  mutation {
    addProjectV2ItemById(input: {projectId: "PROJECT_ID" contentId: "CONTENT_ID"}) {
      item {
        id
      }
    }
  }'

A resposta conterá o ID do nó do item recém-criado.

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

Se você tentar adicionar um item que já existe, o ID do item existente será retornado.

Como adicionar um problema de rascunho a um projeto

O exemplo a seguir adicionará um problema de rascunho ao projeto. Substitua PROJECT_ID pela ID de nó do projeto. Substitua TITLE e BODY pelo conteúdo desejado para o novo problema de rascunho.

gh api graphql -f query='
  mutation {
    addProjectV2DraftIssue(input: {projectId: "PROJECT_ID" title: "TITLE" body: "BODY"}) {
      projectItem {
        id
      }
    }
  }'

A resposta conterá a ID do nó do item do problema de rascunho recém-criado.

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

Atualizando configurações de um projeto

O exemplo a seguir irá atualizar as configurações do seu projeto. Substitua PROJECT_ID pela ID de nó do projeto. Defina public como true para tornar seu projeto público no GitHub. Modifique readme para fazer alterações no README do projeto.

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
      }
    }
  }'

Atualizando um campo de texto, número ou data personalizado

O exemplo a seguir atualizará o valor de um campo de texto de um item. Substitua PROJECT_ID pela ID de nó do projeto. Substitua ITEM_ID pela ID de nó do item que deseja atualizar. Substitua FIELD_ID pela ID do campo que deseja atualizar.

gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: {
          text: "Updated text"
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

Note

Não é possível usar updateProjectV2ItemFieldValue para alterar Assignees, Labels, Milestone ou Repository, porque esses campos são propriedades de pull requests e problemas, não de itens de projeto. Nesse caso, você pode usar as seguintes mutações:

Atualizando um único campo de seleção

O exemplo a seguir atualizará o valor de um campo de seleção única para um item.

  • PROJECT_ID – Substitua-a pela ID de nó do projeto.
  • ITEM_ID – Substitua-a pela ID de nó do item que deseja atualizar.
  • FIELD_ID – Substitua-a pela ID do campo de seleção única que deseja atualizar.
  • OPTION_ID – Substitua-a pela ID da opção de seleção única desejada.
gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: {
          singleSelectOptionId: "OPTION_ID"
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

Atualizando um campo de iteração

O exemplo a seguir atualizará o valor de um campo de iteração para um item.

  • PROJECT_ID – Substitua-a pela ID de nó do projeto.
  • ITEM_ID – Substitua-a pela ID de nó do item que deseja atualizar.
  • FIELD_ID – Substitua-a pela ID do campo de iteração que deseja atualizar.
  • ITERATION_ID – Substitua-a pela ID da iteração desejada. Essa iteração pode ser ativa ou concluída.
gh api graphql -f query='
  mutation {
    updateProjectV2ItemFieldValue(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
        fieldId: "FIELD_ID"
        value: {
          iterationId: "ITERATION_ID"
        }
      }
    ) {
      projectV2Item {
        id
      }
    }
  }'

Excluir um item de um projeto

O exemplo a seguir excluirá um item de um projeto. Substitua PROJECT_ID pela ID de nó do projeto. Substitua ITEM_ID pela ID de nó do item que deseja excluir.

gh api graphql -f query='
  mutation {
    deleteProjectV2Item(
      input: {
        projectId: "PROJECT_ID"
        itemId: "ITEM_ID"
      }
    ) {
      deletedItemId
    }
  }'

Como gerenciar projetos

Criando projetos

Você pode usar uma mutação para criar um projeto. Para saber mais, confira Realizar chamadas com o GraphQL.

Para criar um projeto usando a API, você precisará fornecer um nome para o projeto e a ID do nó de um usuário ou de uma organização do GitHub que passará a ser o proprietário do projeto.

Você conseguirá encontrar a ID do nó de um usuário ou de uma organização do GitHub se souber o nome de usuário. Substitua GITHUB_OWNER pelo nome de usuário do GitHub do novo proprietário do projeto.

gh api -H "Accept: application/vnd.github+json" /users/GITHUB_OWNER

Para criar o projeto, substitua OWNER_ID pela ID do nó do novo proprietário do projeto e substitua PROJECT_NAME por um nome do projeto.

gh api graphql -f query='
  mutation{
    createProjectV2(
      input: {
        ownerId: "OWNER_ID",
        title: "PROJECT_NAME"
      }
    ){
      projectV2 {
        id
      }
     }
  }'

Usando webhooks

Você pode usar webhooks para assinar eventos que ocorrem em seu projeto. Por exemplo, quando um item é editado, o GitHub pode enviar um conteúdo HTTP POST para a URL configurada do webhook que pode disparar a automação em seu servidor. Para obter mais informações sobre webhooks, confira Sobre webhooks. Para saber mais sobre o evento de webhook projects_v2_item, confira Eventos e cargas de webhook.