Conectează și deconectează Dataverse de la un depozit Git folosind cod

Folosește ConnectToGit API-urile AND DisconnectFromGit pentru a integra programat mediul tău Microsoft Dataverse cu controlul versiune Git. Prin utilizarea acestor API-uri, puteți să conectați soluții individuale sau medii întregi la depozitele de date Git acceptate și să gestionați aceste conexiuni prin cod.

Cerințe preliminare

Înainte de a folosi aceste API-uri, asigurați-vă că aveți:

  • Acces la un mediu Microsoft Dataverse
  • Permisiuni de administrator de sistem
  • Acces de citire și scriere la un depozit Git

ConnectToGit API

Creează o conexiune între o soluție sau un mediu Dataverse și un depozit Git. Folosind această conexiune, poți gestiona controlul versiunilor pentru componentele tale Dataverse.

Parametri

API-ul ConnectToGit acceptă următorii parametri:

Parametru Tip Obligatoriu Descriere
GitFolder Șir Da Numele folderului la care vrei să asociezi soluția sau mediul tău.
Branch Șir Da Numele sucursalei la care vrei să te conectezi.
ConnectionType Întreg Nu Specifică la ce să te conectezi. Vezi parametrul ConnectionType.
GitProvider Întreg Nu Furnizorul Git. Vezi parametrul GitProvider.
Organization Șir Nu Numele organizației cu care vrei să te conectezi.
Project Șir Nu Numele proiectului la care vrei să te conectezi.
Repository Șir Nu Numele depozitului la care vrei să te conectezi.
RootFolder Șir Nu Numele folderului rădăcină unde se află toate soluțiile tale în domeniul soluției.
SolutionUniqueName Șir Nu Numele unic al soluției pe care dorești să o conectezi la git.
UpstreamBranch Șir Nu Numele ramurii în amonte la care vrei să te conectezi. Implicit este ramura implicită a depozitului.
GitHubConnectionId Șir Nu ID-ul de conexiune pentru conexiunea GitHub Power Platform. Obligatoriu atunci când GitProvider nu 1 furnizați GitHubPAT. Nu se poate utiliza atunci când suportul pentru rețeaua virtuală (VNET) este activat pentru mediul Dataverse.
GitHubPAT Șir Nu GitHub tokenul de acces personal cu acces la depozitul țintă. Obligatoriu atunci când GitProvider nu 1 furnizați GitHubConnectionId. Obligatoriu atunci când suportul pentru rețeaua virtuală (VNET) este activat pentru mediul Dataverse.
GitHubAppConfigId Șir Nu Referință la înregistrarea de configurare a aplicației GitHub. Obligatoriu când GitProvider este 1. Utilizați formatul githubappconfigs(<recordId>).

Parametrul ConnectionType

Parametrul ConnectionType controlează dacă se conectează la întregul mediu Dataverse sau la o soluție specifică.

Valoare Etichetă Descriere
0 Soluție Conectează o soluție specifică Dataverse la Git.
1 Mediu Conectează întregul mediu Dataverse la Git.

Parametrul GitProvider

Folosește parametrul GitProvider pentru a specifica tipul de furnizor Git pe care îl folosești, fie Azure DevOps, fie GitHub.

Valoare Etichetă Descriere
0 Azure DevOps Use pentru depozite găzduite pe Azure DevOps
1 GitHub Utilizare pentru depozite găzduite pe GitHub

DeconectareFromGit API

Elimină conexiunea Git dintr-o soluție sau mediu Dataverse și dezactivează integrarea controlului versiunilor.

Parametru

API-ul DisconnectFromGit are un singur parametru.

Parametru Tip Obligatoriu Descriere
SolutionUniqueName Șir Nu Numele unic al soluției pe care vrei să o deconectezi de la Git. Omite să deconectezi toate soluțiile sau mediul înconjurător.

Informații suplimentare

Iată câteva opțiuni de valoare a parametrilor pentru a specifica atunci când invoci DisconnectFromGit.

  • Deconectează soluția unică: Oferă SolutionUniqueName posibilitatea de a deconecta o soluție specifică.
  • Deconectați toate soluțiile: Nu oferiți parametri pentru a deconecta toate conexiunile la nivel de soluție.
  • Deconectarea mediului: Nu oferiți parametri pentru deconectarea conexiunii la nivel de mediu.

Exemple

Următoarele exemple descriu scenarii pentru utilizarea API-urilor ConnectToGit și DisconnectFromGit :

Conectează întregul tău mediu Dataverse la un depozit Azure DevOps

Această conexiune permite controlul sursei pentru toate configurațiile și componentele la nivel de mediu.

Nu folosi acești parametri cu această conexiune:

  • RootFolder
  • SolutionUniqueName
  • UpstreamBranch

Acest exemplu arată cum să folosești acțiunea ConnectToGit pentru a conecta întregul tău mediu Dataverse la un depozit Azure DevOps.

Solicitare

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

Răspuns

HTTP/1.1 204 No Content
OData-Version: 4.0

Învață cum să invoci acțiuni ale API-ului web

Conectarea la un depozit GitHub

Înainte de a utiliza API pentru a vă conecta la GitHub, parcurgeți pașii de configurare pentru a crea aplicația GitHub, instalați-l în depozitul țintă, importați cheia sa privată în Azure Key Vault și creați conexiunea GitHub Platformei Power. Pentru mai multe informații, consultați Conectarea la GitHub.

Creați o înregistrare de configurare a aplicației GitHub utilizând API-ul web

Utilizați API-ul Web Dataverse OData pentru a crea o githubappconfig înregistrare. Trimiteți o solicitare POST cu ID-ul de client de aplicație GitHub, URI-ul Key Vault și numele cheii.

Puteți utiliza orice client HTTP, cum ar fi Insomnie, Visual Studio Code REST Client, sau buclă, pentru a efectua aceste apeluri. Aveți nevoie de un token de urs pentru autentificare. Pentru mai multe informații, consultați Utilizarea Microsoft Dataverse API web.

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

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

Important

Rețineți ID-ul de înregistrare returnat în antetul de răspuns. Aveți nevoie de această valoare pentru a identifica identitatea gestionată, a configura RBAC și a apela ConnectToGit. ID-ul de înregistrare utilizează un format, cum 13d565bb-4c22-f111-a546-7ced8d6e3e85ar fi .

După ce creați înregistrarea de configurare a aplicației GitHub, atribuiți rolul de utilizator Crypto Key Vault identității gestionate Dataverse așa cum este descris în Configurarea controlului de acces bazat pe roluri Key Vault (RBAC).

Apelați API-ul ConnectToGit

După ce creați githubappconfig înregistrarea și configurați Key Vault RBAC, utilizați API-ul Web Dataverse pentru a stabili conexiunea de control sursă apelând ConnectToGit acțiunea.

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>)"
}

Important

Ramura trebuie să existe deja în depozit. Creați-l mai întâi în GitHub, dacă este necesar. Valoarea GitHubAppConfigId trebuie să utilizeze formatul githubappconfigs(<recordId>).

Captură de ecran a unui corp de solicitare HTTP pentru API-ul ConnectToGit cu parametri GitHub.

Dacă primiți un răspuns reușit, mediul este conectat la GitHub.

Conectarea la un depozit GitHub utilizând PowerShell

Următorul exemplu PowerShell creează înregistrarea de configurare a aplicației GitHub, așteaptă ca identitatea gestionată Dataverse să apară în Microsoft Entra ID, atribuie rolul de utilizator Criptomoned Key Vault identității gestionate și apelează ConnectToGit acțiunea. Dacă aveți deja o înregistrare de configurare a aplicației GitHub, furnizați GitHubAppConfigId pentru a omite pașii de atribuire a rolurilor și Key Vault.

Instalați și importați modulele Az.Accounts, Az.KeyVaultși Az.Resources PowerShell înainte de a rula exemplul. Conectați-vă cu Connect-AzAccount un cont care are acces la mediul Dataverse și permisiunea de a atribui roluri Key Vault.

Dacă suportul pentru rețeaua virtuală (VNET) este activat pentru mediul Dataverse, furnizați GitHubPAT. GitHub conexiunile nu pot fi utilizate cu suportul pentru rețeaua 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."

Deconectează întregul tău mediu Dataverse de controlul versiune Git

Această acțiune elimină conexiunea Git la nivel de mediu. Nu folosi parametrul SolutionUniqueName pentru această operație. Dataverse identifică și elimină automat conexiunea Git la nivel de mediu.

Acest exemplu arată cum să folosești acțiunea DisconnectFromGit pentru a deconecta întregul tău mediu Dataverse de controlul sursă Git.

Solicitare

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

Răspuns

HTTP/1.1 204 No Content
OData-Version: 4.0

Învață cum să invoci acțiuni ale API-ului web

Conectează prima soluție la un depozit Git

Această conexiune stabilește legătura depozitului și structura folderelor pentru controlul versiunilor la nivel de soluție către prima soluție dintr-un mediu.

Trebuie să incluzi valori pentru acești parametri pentru a specifica soluția:

  • RootFolder
  • SolutionUniqueName

Acest exemplu arată cum să folosești acțiunea ConnectToGit pentru a conecta prima soluție la un depozit Git.

Solicitare

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

Răspuns

HTTP/1.1 204 No Content
OData-Version: 4.0

Învață cum să invoci acțiuni ale API-ului web

Conectează soluții suplimentare la același depozit Git după ce conectezi soluția inițială

După ce conectezi prima soluție, ai nevoie doar de parametrii specifici ai soluției. Moștenești detaliile conexiunii depozitului de la conexiunea inițială.

Setează doar acești parametri:

  • SolutionUniqueName
  • Branch
  • GitFolder

Important

Trebuie mai întâi să conectezi prima soluție înainte ca acest lucru să funcționeze. Vezi Conectează prima soluție la un depozit Git.

Acest exemplu arată cum să folosești acțiunea ConnectToGit pentru a conecta soluțiile ulterioare la un depozit Git.

Solicitare

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

Răspuns

HTTP/1.1 204 No Content
OData-Version: 4.0

Învață cum să invoci acțiuni ale API-ului web

Deconectează o soluție specifică de la controlul versiune Git păstrând totodată celelalte soluții conectate

Folosește această abordare pentru a elimina controlul sursei pentru o soluție fără a afecta altele.

Acest exemplu arată cum să folosești acțiunea DisconnectFromGit pentru a elimina controlul versiune pentru o soluție fără a afecta altele.

Solicitare

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

Răspuns

HTTP/1.1 204 No Content
OData-Version: 4.0

Învață cum să invoci acțiuni ale API-ului web

Gestionarea erorilor

Nici API-ul ConnectToGit , nici DisconnectFromGit API-ul nu returnează o valoare atunci când aceasta se finalizează cu succes. Când un API eșuează, returnează o eroare.

Scenariile frecvente de eroare includ:

  • Acreditări invalide: Asigurați-vă că aveți o autentificare validă la furnizorul Git.
  • Depozit negăsit: Verificați numele organizației, proiectelor și depozitelor.
  • Permisiune refuzată: Asigură-te că contul tău Dataverse are permisiuni de gestionare a controlului versiunilor.
  • Soluție negăsită: Verifică că SolutionUniqueName există în mediul tău.
  • Ramura nu există: Confirmă că ramura specificată există în depozit.

Sprijin și resurse suplimentare

Pentru mai multe informații despre integrarea controlului versiunilor cu Dataverse, vezi: