Dataverse savienojuma izveide un atvienošana no Git repozitorija, izmantojot kodu

Izmantojiet ConnectToGit un DisconnectFromGit API, lai programmiski integrētu savu Microsoft Dataverse vidi ar Git avota vadīklu. Izmantojot šos API, jūs varat savienot atsevišķus risinājumus vai veselas vides ar atbalstītiem Git repozitorijiem un pārvaldīt šos savienojumus caur kodu.

Priekšnosacījumi

Pirms šo API izmantošanas pārliecinieties, vai jums ir:

  • Piekļuve Microsoft Dataverse videi
  • Sistēmas administratora atļaujas
  • Lasīšanas un rakstīšanas piekļuve Git repozitorijam

ConnectToGit API

Izveido savienojumu starp Dataverse risinājumu vai vidi un Git repozitoriju. Izmantojot šo savienojumu, varat pārvaldīt avota kontroli saviem Dataverse komponentiem.

Parametri

API ConnectToGit akceptē šādus parametrus:

Parametrs Tips Obligāts Apraksts
GitFolder Virkne Tās mapes nosaukums, kurai vēlaties piesaistīt risinājumu vai vidi.
Branch Virkne Tās filiāles nosaukums, ar kuru vēlaties izveidot savienojumu.
ConnectionType Integer Nē. Norāda, ar ko izveidot savienojumu. Skatiet parametru ConnectionType.
GitProvider Integer Nē. Git pakalpojumu sniedzējs. Skatiet parametru GitProvider.
Organization Virkne Nē. Organizācijas nosaukums, ar kuru vēlaties izveidot savienojumu.
Project Virkne Nē. Projekta nosaukums, ar kuru vēlaties izveidot savienojumu.
Repository Virkne Nē. Repozitorija nosaukums, ar kuru vēlaties izveidot savienojumu.
RootFolder Virkne Nē. Tās saknes mapes nosaukums, kurā visi risinājumi atrodas risinājuma tvērumā.
SolutionUniqueName Virkne Nē. Risinājuma unikālais nosaukums, kuru vēlaties izveidot ar git.
UpstreamBranch Virkne Nē. Augšupējā filiāle, ar kuru vēlaties izveidot savienojumu, nosaukums. Noklusējums ir repozitorija noklusējuma filiāle.
GitHubConnectionId Virkne Nē. Savienojuma ID Power Platform GitHub savienojumam. Nepieciešams, ja GitProvider vien 1 jūs nesniedzat GitHubPAT. To nevar izmantot, ja virtuālā tīkla (VNET) atbalsts ir ieslēgts Dataverse vidē.
GitHubPAT Virkne Nē. GitHub personīgais piekļuves tokens ar piekļuvi mērķa repozitorijam. Nepieciešams, ja GitProvider vien 1 jūs nesniedzat GitHubConnectionId. Nepieciešams, kad virtuālā tīkla (VNET) atbalsts ir ieslēgts Dataverse vidē.
GitHubAppConfigId Virkne Nē. Atsauce uz GitHub lietotnes konfigurācijas ierakstu. Nepieciešams, kad GitProvider ir 1. Izmantojiet formātu githubappconfigs(<recordId>).

ConnectionType parametrs

Parametrs ConnectionType kontrolē, vai izveidot savienojumu ar visu Dataverse vidi vai konkrētu risinājumu.

Vērtība Etiķete Apraksts
0 Risinājums Savieno konkrētu Dataverse risinājumu ar Git.
1 Vide Savieno visu Dataverse vidi ar Git.

GitProvider parametrs

Izmantojiet parametru GitProvider , lai norādītu izmantotā Git nodrošinātāja tipu — Azure DevOps vai GitHub.

Vērtība Etiķete Apraksts
0 Azure DevOps Izmantojiet repozitorijiem, kas tiek viesoti Azure DevOps
1 GitHub Izmantojiet GitHub viesotiem repozitorijiem

DisconnectFromGit API

Noņem Git savienojumu no Dataverse risinājuma vai vides un atspējo avota kontroles integrāciju.

Parametrs

API DisconnectFromGit ir tikai viens parametrs.

Parametrs Tips Obligāts Apraksts
SolutionUniqueName Virkne Nē. Risinājuma unikālais nosaukums, kuru vēlaties atvienot no Git. Izlaist, lai atvienotu visus risinājumus vai vidi.

Papildinformācija

Tālāk ir norādītas dažas parametru vērtības opcijas, kas jānorāda, izsaucot DisconnectFromGit.

  • Atvienot vienu risinājumu: nodrošiniet SolutionUniqueName konkrēta risinājuma atvienošanu.
  • Atvienot visus risinājumus: nenorādiet parametrus, lai atvienotu visus risinājuma līmeņa savienojumus.
  • Atvienot vidi: nenorādiet parametrus, lai atvienotu vides līmeņa savienojumu.

Piemēri

Tālāk minētie piemēri apraksta scenārijus, kā izmantot un ConnectToGitDisconnectFromGit API:

Visas Dataverse vides savienošana ar Azure DevOps repozitoriju

Šis savienojums iespējo avota kontroli visām vides līmeņa konfigurācijām un komponentiem.

Neizmantojiet šos parametrus ar šo savienojumu:

  • RootFolder
  • SolutionUniqueName
  • UpstreamBranch

Šajā piemērā parādīts, kā izmantot darbību ConnectToGit , lai savienotu visu Dataverse vidi ar Azure DevOps repozitoriju.

Pieprasījums

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

Atbilde

HTTP/1.1 204 No Content
OData-Version: 4.0

Uzziniet, kā izsaukt tīmekļa API darbības

Savienojums ar GitHub repozitoriju

Pirms izmantojat API, lai pieslēgtos GitHub, izpildiet iestatīšanas soļus, lai izveidotu GitHub lietotni, instalētu to mērķa repozitorijā, importētu tās privāto atslēgu Azure Key Vault un izveidotu Power Platform GitHub savienojumu. Papildu informācijai skatiet sadaļu Savienojums ar GitHub.

Izveidojiet GitHub lietotnes konfigurācijas ierakstu, izmantojot Web API

Izmantojiet Dataverse OData Web API, lai izveidotu ierakstu.githubappconfig Nosūtiet POST pieprasījumu ar GitHub lietotnes klienta ID, Key Vault URI un atslēgas nosaukumu.

Jūs varat izmantot jebkuru HTTP klientu, piemēram, Insomnia, Visual Studio Code REST Client vai curl, lai veiktu šos izsaukumus. Autentifikācijai nepieciešams nesēja žetons. Papildu informācijai skatiet Use the Microsoft Dataverse Web API.

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

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

Svarīgi

Pievērsiet uzmanību ieraksta ID, kas tika atgriezts atbildes galvenē. Šī vērtība ir nepieciešama, lai identificētu pārvaldīto identitāti, konfigurētu RBAC un izsauktu ConnectToGit. Ieraksta ID tiek izmantots formāts, piemēram, 13d565bb-4c22-f111-a546-7ced8d6e3e85.

Pēc GitHub lietotnes konfigurācijas ieraksta izveides piešķiriet Key Vault Crypto User lomu Dataverse pārvaldītajai identitātei, kā aprakstīts Configure Key Vault lomas bāzētajā piekļuves kontrolē (RBAC).

Izsauciet ConnectToGit API

Pēc ieraksta izveides githubappconfig un Key Vault RBAC konfigurēšanas izmantojiet Dataverse Web API, lai izveidotu avota kontroles savienojumu, izsaucot darbībuConnectToGit.

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

Svarīgi

Zars jau noteikti atrodas krātuvē. Ja nepieciešams, vispirms izveido to GitHub. Vērtībai GitHubAppConfigId jāizmanto formāts githubappconfigs(<recordId>).

Ekrānuzņēmums ar HTTP pieprasījuma saturu ConnectToGit API un GitHub parametriem.

Ja saņemat veiksmīgu atbildi, vide tiek savienota ar GitHub.

Savienojieties ar GitHub repozitoriju, izmantojot PowerShell

Nākamais PowerShell piemērs izveido GitHub lietotnes konfigurācijas ierakstu, gaida, kad Dataverse pārvaldītā identitāte parādīsies Microsoft Entra ID, piešķir pārvaldītajai identitātei Key Vault Crypto User lomu un izsauc ConnectToGit darbību. Ja jums jau ir GitHub lietotnes konfigurācijas ieraksts, piedāvājiet GitHubAppConfigId izlaist konfigurācijas un Key Vault lomas piešķiršanas soļus.

Instalējiet un importējiet Az.Accounts, Az.KeyVault, un Az.Resources PowerShell moduļus pirms piemēra palaišanas. Piesakieties, Connect-AzAccount izmantojot kontu, kuram ir piekļuve Dataverse videi un atļauja piešķirt Key Vault lomas.

Ja virtuālā tīkla (VNET) atbalsts ir ieslēgts Dataverse vidē, nodrošināt GitHubPAT. GitHub savienojumus nevar izmantot ar virtuālā tīkla atbalstu.

[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."

Visas Dataverse vides atvienošana no Git avota vadīklas

Šī darbība noņem vides līmeņa Git savienojumu. Šai operācijai neizmantojiet parametru SolutionUniqueName . Dataverse automātiski identificē un noņem vides līmeņa Git savienojumu.

Šajā piemērā parādīts, kā izmantot darbību DisconnectFromGit , lai atvienotu visu Dataverse vidi no Git avota vadīklas.

Pieprasījums

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

Atbilde

HTTP/1.1 204 No Content
OData-Version: 4.0

Uzziniet, kā izsaukt tīmekļa API darbības

Pirmā risinājuma savienošana ar Git repozitoriju

Šis savienojums izveido repozitorija saiti un mapju struktūru risinājuma līmeņa avota vadībai uz pirmo risinājumu vidē.

Lai norādītu risinājumu, ir jāiekļauj šo parametru vērtības:

  • RootFolder
  • SolutionUniqueName

Šajā piemērā ir parādīts, kā izmantot darbību ConnectToGit , lai savienotu pirmo risinājumu ar Git repozitoriju.

Pieprasījums

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

Atbilde

HTTP/1.1 204 No Content
OData-Version: 4.0

Uzziniet, kā izsaukt tīmekļa API darbības

Papildu risinājumu savienošana ar to pašu Git repozitoriju pēc sākotnējā risinājuma pievienošanas

Pēc pirmā risinājuma pievienošanas ir nepieciešami tikai risinājumam specifiskie parametri. Repozitorija savienojuma detaļas tiek mantotas no sākotnējā savienojuma.

Iestatiet tikai šos parametrus:

  • SolutionUniqueName
  • Branch
  • GitFolder

Svarīgi

Vispirms ir jāpievieno pirmais risinājums, pirms tas darbojas. Skatiet sadaļu Pirmā risinājuma savienošana ar Git repozitoriju.

Šajā piemērā ir parādīts, kā izmantot darbību ConnectToGit , lai savienotu turpmākos risinājumus ar Git repozitoriju.

Pieprasījums

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

Atbilde

HTTP/1.1 204 No Content
OData-Version: 4.0

Uzziniet, kā izsaukt tīmekļa API darbības

Konkrēta risinājuma atvienošana no Git avota vadīklas, vienlaikus saglabājot citu risinājumu savienojumu

Izmantojiet šo pieeju, lai noņemtu avota kontroli vienam risinājumam, neietekmējot citus.

Šajā piemērā ir parādīts, kā izmantot darbību DisconnectFromGit , lai noņemtu avota kontroli vienam risinājumam, neietekmējot citus.

Pieprasījums

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

Atbilde

HTTP/1.1 204 No Content
OData-Version: 4.0

Uzziniet, kā izsaukt tīmekļa API darbības

Kļūdu apstrāde

Ne the , ConnectToGit ne API DisconnectFromGit neatgriež vērtību, kad tā ir veiksmīgi pabeigta. Ja API neizdodas, tas atgriež kļūdu.

Bieži sastopamie kļūdu scenāriji ir šādi:

  • Nederīgi akreditācijas dati: pārliecinieties, vai jums ir derīga autentifikācija Git pakalpojumu sniedzējam.
  • Repozitorijs nav atrasts: pārbaudiet organizācijas, projekta un repozitoriju nosaukumus.
  • Atļauja liegta: pārliecinieties, vai jūsu Dataverse kontam ir avota kontroles pārvaldības atļaujas.
  • Risinājums nav atrasts: pārbaudiet, vai SolutionUniqueName tas pastāv jūsu vidē.
  • Filiāle nepastāv: apstipriniet, ka norādītā filiāle pastāv repozitorijā.

Atbalsts un papildu resursi

Papildinformāciju par avota vadības integrāciju ar Dataverse skatiet šeit: