Conectar e desconectar o Dataverse de um repositório Git usando código

Use as APIs ConnectToGit e DisconnectFromGit para integrar programaticamente seu ambiente do Microsoft Dataverse ao controle do código-fonte do Git. Usando essas APIs, você pode conectar soluções individuais ou ambientes inteiros a repositórios Git compatíveis e gerenciar essas conexões por meio do código.

Pré-requisitos

Antes de usar essas APIs, verifique se você tem:

  • Acesso a um ambiente do Microsoft Dataverse
  • Permissões de administrador do sistema
  • Acesso de leitura e gravação a um repositório Git

ConnectToGit API

Cria uma conexão entre uma solução ou ambiente do Dataverse e um repositório Git. Usando essa conexão, você pode gerenciar o controle do código-fonte para seus componentes do Dataverse.

Parâmetros

A ConnectToGit API aceita os seguintes parâmetros:

Parâmetro Tipo Obrigatório Descrição
GitFolder String Sim Nome da pasta à qual você deseja associar sua solução ou ambiente.
Branch String Sim Nome do branch ao qual você deseja se conectar.
ConnectionType Integer Não Especifica ao que se conectar. Consulte o parâmetro ConnectionType.
GitProvider Integer Não O provedor Git. Consulte o parâmetro GitProvider.
Organization String Não Nome da organização à qual você deseja se conectar.
Project String Não Nome do projeto ao qual você deseja se conectar.
Repository String Não Nome do repositório ao qual você deseja se conectar.
RootFolder String Não Nome da pasta raiz em que todas as soluções residem no escopo da solução.
SolutionUniqueName String Não O nome exclusivo da solução que você deseja conectar ao git.
UpstreamBranch String Não Nome do branch upstream ao qual você deseja se conectar. O padrão para ramificação padrão do repositório.
GitHubConnectionId String Não ID de conexão para a conexão GitHub do Power Platform. Obrigatório quando GitProvider for 1, a menos que você forneça GitHubPAT. Não pode ser usado quando o suporte à VNET (rede virtual) está habilitado para o ambiente do Dataverse.
GitHubPAT String Não Token de acesso pessoal do GitHub com acesso ao repositório de destino. Necessário quando GitProvider for 1, a menos que você forneça GitHubConnectionId. Necessário quando o suporte à VNET (rede virtual) estiver habilitado para o ambiente do Dataverse.
GitHubAppConfigId String Não Referência ao registro de configuração do aplicativo GitHub. Necessário quando GitProvider é 1. Use o formato githubappconfigs(<recordId>).

Parâmetro ConnectionType

O ConnectionType parâmetro controla se deve se conectar a todo o ambiente do Dataverse ou a uma solução específica.

Valor Rótulo Descrição
0 Solução Conecta uma solução específica do Dataverse ao Git.
1 Ambiente Conecta todo o ambiente do Dataverse ao Git.

Parâmetro GitProvider

Use o GitProvider parâmetro para especificar o tipo de provedor Git que você está usando, o Azure DevOps ou o GitHub.

Valor Rótulo Descrição
0 Azure DevOps Usar para repositórios hospedados no Azure DevOps
1 GitHub Usar para repositórios hospedados no GitHub

DisconnectFromGit API (Desconectar do Git API)

Remove a conexão Git de uma solução ou ambiente do Dataverse e desabilita a integração do controle do código-fonte.

Parâmetro

A DisconnectFromGit API tem apenas um parâmetro.

Parâmetro Tipo Obrigatório Descrição
SolutionUniqueName String Não O nome exclusivo da solução que você deseja desconectar do Git. Omitir para desconectar todas as soluções ou o ambiente.

Informações adicionais

Aqui estão algumas opções de valor de parâmetro para especificar ao invocar DisconnectFromGit.

  • Desconectar solução única: forneça SolutionUniqueName para desconectar uma solução específica.
  • Desconecte todas as soluções: não forneça parâmetros para desconectar todas as conexões no nível da solução.
  • Desconectar o ambiente: não forneça parâmetros para desconectar a conexão no nível do ambiente.

Exemplos

Os exemplos a seguir descrevem cenários de uso das APIs DisconnectFromGit e ConnectToGit:

Conectar todo o ambiente do Dataverse a um repositório do Azure DevOps

Essa conexão permite o controle do código-fonte para todas as configurações e componentes de nível de ambiente.

Não use esses parâmetros com esta conexão:

  • RootFolder
  • SolutionUniqueName
  • UpstreamBranch

Este exemplo mostra como usar a ação ConnectToGit para conectar todo o ambiente do Dataverse a um repositório do Azure DevOps.

Solicitação

POST [Organization URI]/api/data/v9.2/ConnectToGit HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

{
   "GitFolder": "yourGitfolderName",
   "Branch": "yourBranchName",
   "ConnectionType": 1,
   "GitProvider": 0,
   "Organization": "yourOrganizationName",
   "Project": "yourProjectName",
   "Repository": "yourRepositoryName"
}

Resposta

HTTP/1.1 204 No Content
OData-Version: 4.0

Saiba como invocar ações de API Web

Conectar-se a um repositório GitHub

Antes de usar a API para se conectar ao GitHub, conclua as etapas de instalação para criar o aplicativo GitHub, instale-o no repositório de destino, importe sua chave privada para Azure Key Vault e crie a conexão GitHub do Power Platform. Para obter mais informações, consulte Conectar-se ao GitHub.

Criar um registro de configuração de aplicativo GitHub usando a API Web

Use a API Web OData do Dataverse para criar um githubappconfig registro. Envie uma solicitação POST com a ID do cliente do aplicativo GitHub, Key Vault URI e o nome da chave.

Você pode usar qualquer cliente HTTP, como Insônia, Visual Studio Code cliente REST ou curl, para fazer essas chamadas. Você precisa de um token de portador para autenticação. Para obter mais informações, consulte Usar a API Web Microsoft Dataverse.

POST {{DataverseOrgUrl}}/api/data/v9.2/githubappconfigs
Authorization: Bearer {{token}}
Content-Type: application/json

{
    "githubappid": "Iv23liBWoH9sf7xDrRe6",
    "keyvaulturi": "{{KeyVaultUri}}",
    "keyname": "demoGitHubKey"
}

Importante

Observe a ID do registro retornada no cabeçalho de resposta. Você precisa desse valor para identificar a identidade gerenciada, configurar o RBAC e chamar ConnectToGit. A ID do registro usa um formato como 13d565bb-4c22-f111-a546-7ced8d6e3e85.

Depois de criar o registro de configuração do aplicativo GitHub, atribua a função Key Vault Usuário de Criptografia à identidade gerenciada do Dataverse, conforme descrito em Configurar Key Vault RBAC (controle de acesso baseado em função).

Chamar a API ConnectToGit

Depois de criar o registro githubappconfig e configurar o RBAC do Key Vault, use a API Web do Dataverse para estabelecer a conexão com o controle de código-fonte ao chamar a ação ConnectToGit.

POST {{DataverseOrgUrl}}/api/data/v9.2/ConnectToGit
Authorization: Bearer {{token}}
Content-Type: application/json

{
    "GitProvider": 1,
    "ConnectionType": 1,
    "Organization": "YourGitHubOrg",
    "Repository": "YourRepo",
    "Project": "placeholder",
    "Branch": "yourBranch",
    "UpstreamBranch": "main",
    "GitFolder": "YourFolder",
    "GitHubConnectionId": "<connectionId>",
    "GitHubAppConfigId": "githubappconfigs(<recordId>)"
}

Importante

O branch já deve existir no repositório. Crie-o em GitHub primeiro, se necessário. O GitHubAppConfigId valor deve usar o formato githubappconfigs(<recordId>).

Captura de tela de um corpo de solicitação HTTP para a API ConnectToGit com parâmetros GitHub.

Se você receber uma resposta bem-sucedida, o ambiente será conectado a GitHub.

Conectar-se a um repositório GitHub usando o PowerShell

O exemplo do PowerShell a seguir cria o registro de configuração do GitHub App, aguarda que a identidade gerenciada do Dataverse apareça em Microsoft Entra ID, atribui a função Key Vault Usuário de Criptografia à identidade gerenciada e chama a açãoConnectToGit. Se você já tiver um registro de configuração de um GitHub App, forneça GitHubAppConfigId para ignorar as etapas de configuração e de atribuição de função do Key Vault.

Instale e importe os módulos do PowerShell Az.Accounts, Az.KeyVault e Az.Resources antes de executar o exemplo. Entre com Connect-AzAccount usando uma conta que tenha acesso ao ambiente do Dataverse e permissão para atribuir funções no Key Vault.

Se o suporte à VNET (rede virtual) estiver habilitado para o ambiente do Dataverse, forneça GitHubPAT. As conexões do GitHub não podem ser usadas com suporte à rede virtual.

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$DataverseOrgUrl,

    [Parameter(Mandatory)]
    [string]$GitHubOrg,

    [Parameter(Mandatory)]
    [string]$GitHubRepo,

    [Parameter(Mandatory)]
    [string]$Branch,

    [Parameter(Mandatory)]
    [string]$GitFolder,

    [string]$GitHubAppClientId,

    [string]$KeyVaultName,

    [string]$KeyVaultKeyName,

    [string]$GitHubAppConfigId,

    [string]$GitHubConnectionId,

    [string]$GitHubPAT,

    [ValidateSet(0, 1)]
    [int]$ConnectionType = 1,

    [string]$UpstreamBranch,

    [string]$RootFolder,

    [string]$SolutionUniqueName
)

Set-StrictMode -Version 3.0
$ErrorActionPreference = "Stop"

if (($GitHubConnectionId -and $GitHubPAT) -or (-not $GitHubConnectionId -and -not $GitHubPAT)) {
    throw "Specify either -GitHubConnectionId or -GitHubPAT, but not both."
}

if (-not $GitHubAppConfigId) {
    foreach ($name in @('GitHubAppClientId', 'KeyVaultName', 'KeyVaultKeyName')) {
        if ([string]::IsNullOrWhiteSpace((Get-Variable -Name $name -ValueOnly))) {
            throw "Specify -$name when -GitHubAppConfigId is not provided."
        }
    }
}

$dataverseResource = $DataverseOrgUrl.TrimEnd('/')
$tokenResult = Get-AzAccessToken -ResourceUrl $dataverseResource -AsSecureString
$dataverseToken = [System.Net.NetworkCredential]::new('', $tokenResult.Token).Password

function Invoke-DataverseApi {
    param(
        [Parameter(Mandatory)]
        [string]$Method,

        [Parameter(Mandatory)]
        [string]$Endpoint,

        [object]$Body,

        [switch]$ReturnHeaders
    )

    $headers = @{
        Authorization      = "Bearer $dataverseToken"
        "OData-MaxVersion" = "4.0"
        "OData-Version"    = "4.0"
    }

    $request = @{
        Method      = $Method
        Uri         = "$dataverseResource/api/data/v9.2/$Endpoint"
        Headers     = $headers
        ContentType = "application/json; charset=utf-8"
    }

    if ($Body) {
        $request.Body = $Body | ConvertTo-Json -Depth 10
    }

    if ($ReturnHeaders) {
        return (Invoke-WebRequest @request).Headers
    }

    Invoke-RestMethod @request
}

$appConfigRecordId = $GitHubAppConfigId

if (-not $appConfigRecordId) {
    $keyVault = Get-AzKeyVault -VaultName $KeyVaultName
    $keyVaultUri = 'https://' + $KeyVaultName + '.vault.azure.net/'

    $appConfigBody = @{
        githubappid = $GitHubAppClientId
        keyvaulturi = $keyVaultUri
        keyname     = $KeyVaultKeyName
    }

    $responseHeaders = Invoke-DataverseApi `
        -Method POST `
        -Endpoint "githubappconfigs" `
        -Body $appConfigBody `
        -ReturnHeaders

    $entityIdHeader = [string]$responseHeaders["OData-EntityId"]
    if ($entityIdHeader -notmatch '\(([0-9a-f-]+)\)') {
        throw "Could not read the GitHub App configuration record ID from the Dataverse response."
    }

    $appConfigRecordId = $Matches[1]
    $managedIdentityName = "PPMI-githubappconfigmanagedidentity-$appConfigRecordId"

    $servicePrincipal = $null
    for ($attempt = 1; $attempt -le 60; $attempt++) {
        $servicePrincipal = Get-AzADServicePrincipal -DisplayName $managedIdentityName -ErrorAction SilentlyContinue
        if ($servicePrincipal) {
            break
        }

        Start-Sleep -Seconds 1
    }

    if (-not $servicePrincipal) {
        throw "The Dataverse managed identity was not found in Microsoft Entra ID. Check Dataverse System Jobs for GitHub App configuration errors."
    }

    $keyVaultScope = $keyVault.ResourceId
    if (-not $keyVaultScope) {
        $subscriptionId = (Get-AzContext).Subscription.Id
        $keyVaultScope = "/subscriptions/$subscriptionId/resourceGroups/$($keyVault.ResourceGroupName)/providers/Microsoft.KeyVault/vaults/$KeyVaultName"
    }

    $keyVaultCryptoUserRoleId = "12338af0-0e69-4776-bea7-57ae8d297424"
    $existingAssignment = Get-AzRoleAssignment `
        -ObjectId $servicePrincipal.Id `
        -RoleDefinitionId $keyVaultCryptoUserRoleId `
        -Scope $keyVaultScope `
        -ErrorAction SilentlyContinue

    if (-not $existingAssignment) {
        New-AzRoleAssignment `
            -ObjectId $servicePrincipal.Id `
            -RoleDefinitionId $keyVaultCryptoUserRoleId `
            -Scope $keyVaultScope | Out-Null
    }
}

$connectBody = @{
    GitProvider          = 1
    ConnectionType       = $ConnectionType
    Organization         = $GitHubOrg
    Repository           = $GitHubRepo
    Project              = "placeholder"
    Branch               = $Branch
    GitFolder            = $GitFolder
    GitHubAppConfigId    = "githubappconfigs($appConfigRecordId)"
}

if ($GitHubConnectionId) { $connectBody.GitHubConnectionId = $GitHubConnectionId }
if ($GitHubPAT)          { $connectBody.GitHubPAT          = $GitHubPAT }
if ($UpstreamBranch)     { $connectBody.UpstreamBranch     = $UpstreamBranch }
if ($RootFolder)         { $connectBody.RootFolder         = $RootFolder }
if ($SolutionUniqueName) { $connectBody.SolutionUniqueName = $SolutionUniqueName }

Invoke-DataverseApi -Method POST -Endpoint "ConnectToGit" -Body $connectBody
Write-Host "Connected Dataverse Git integration to GitHub."

Desconectar todo o ambiente do Dataverse do controle de origem do Git

Essa ação remove a conexão Git no nível do ambiente. Não use o SolutionUniqueName parâmetro para esta operação. O Dataverse identifica e remove automaticamente a conexão Git no nível do ambiente.

Este exemplo mostra como usar a ação DisconnectFromGit para desconectar todo o ambiente do Dataverse do controle de origem do Git.

Solicitação

POST [Organization URI]/api/data/v9.2/DisconnectFromGit HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

Resposta

HTTP/1.1 204 No Content
OData-Version: 4.0

Saiba como invocar ações de API Web

Conectar a primeira solução a um repositório Git

Essa conexão estabelece o link do repositório e a estrutura de pastas para o controle do código-fonte no nível da solução para a primeira solução em um ambiente.

Você precisa incluir valores para esses parâmetros para especificar a solução:

  • RootFolder
  • SolutionUniqueName

Este exemplo mostra como usar a ação ConnectToGit para conectar a primeira solução a um repositório Git.

Solicitação

POST [Organization URI]/api/data/v9.2/ConnectToGit HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

{
   "GitFolder": "yourGitfolderName",
   "Branch": "yourBranchName",
   "ConnectionType": 1,
   "GitProvider": 0,
   "Organization": "yourOrganizationName",
   "Project": "yourProjectName",
   "Repository": "yourRepositoryName",
   "RootFolder": "yourRootFolderName",
   "SolutionUniqueName": "yourSolutionUniqueName"
}

Resposta

HTTP/1.1 204 No Content
OData-Version: 4.0

Saiba como invocar ações de API Web

Conectar soluções extras ao mesmo repositório Git depois de conectar a solução inicial

Depois de conectar a primeira solução, você só precisará dos parâmetros específicos da solução. Você herda os detalhes da conexão do repositório a partir da conexão inicial.

Defina apenas estes parâmetros:

  • SolutionUniqueName
  • Branch
  • GitFolder

Importante

Primeiro, você deve conectar a primeira solução antes que isso funcione. Consulte Conectar a primeira solução a um repositório Git.

Este exemplo mostra como usar a ação ConnectToGit para conectar soluções subsequentes a um repositório Git.

Solicitação

POST [Organization URI]/api/data/v9.2/ConnectToGit HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

{
   "GitFolder": "yourGitfolderName",
   "Branch": "yourBranchName",
   "SolutionUniqueName": "yourSolutionUniqueName"
}

Resposta

HTTP/1.1 204 No Content
OData-Version: 4.0

Saiba como invocar ações de API Web

Desconectar uma solução específica do controle do código-fonte git mantendo outras soluções conectadas

Use essa abordagem para remover o controle do código-fonte de uma solução sem afetar outras.

Este exemplo mostra como usar a ação DisconnectFromGit para remover o controle do código-fonte de uma solução sem afetar outras.

Solicitação

POST [Organization URI]/api/data/v9.2/DisconnectFromGit HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0

{
   "SolutionUniqueName": "yourSolutionUniqueName"
}

Resposta

HTTP/1.1 204 No Content
OData-Version: 4.0

Saiba como invocar ações de API Web

Tratamento de erros

Nem a ConnectToGit API nem a DisconnectFromGit API retornam um valor quando são concluídas com êxito. Quando uma API falha, ela retorna um erro.

Cenários de erro comuns incluem:

  • Credenciais inválidas: verifique se você tem autenticação válida para o provedor Git.
  • Repositório não encontrado: verifique os nomes da organização, do projeto e do repositório.
  • Permissão negada: verifique se sua conta do Dataverse tem permissões de gerenciamento de controle do código-fonte.
  • Solução não encontrada: verifique se SolutionUniqueName existe em seu ambiente.
  • Branch não existe: Confirme se o ramo especificado existe no repositório.

Suporte e recursos adicionais

Para obter mais informações sobre a integração do controle do código-fonte com o Dataverse, consulte: