חיבור ותנתק Dataverse ממאגר Git באמצעות קוד

השתמש בממשקי ConnectToGit ה DisconnectFromGit - API כדי לשלב באופן תיכנותי את סביבת Microsoft Dataverse שלך עם בקרת המקור של Git. באמצעות ממשקי API אלה, באפשרותך לחבר פתרונות בודדים או בסביבות שלמות למאגרים נתמכים של Git ולנהל חיבורים אלה באמצעות קוד.

דרישות מוקדמות

לפני השימוש בממשקי API אלה, ודא שיש לך:

  • גישה לסביבה של Microsoft Dataverse
  • הרשאות מנהל מערכת
  • קריאה וכתיבה של גישה למאגר Git

ConnectToGit API

יצירת חיבור בין פתרון Dataverse או סביבה למאגר Git. באמצעות חיבור זה, באפשרותך לנהל בקרת מקור עבור רכיבי Dataverse שלך.

פרמטרים

ה ConnectToGit - API מקבל את הפרמטרים הבאים:

פרמטר סוג נדרש Description
GitFolder מחרוזת ‏‏כן‬ שם התיקיה שאליה ברצונך לאגד את הפתרון או הסביבה שלך.
Branch מחרוזת ‏‏כן‬ שם הענף שאליו ברצונך להתחבר.
ConnectionType מספר שלם‬ לא מציין לאן יש להתחבר. ראה פרמטר ConnectionType.
GitProvider מספר שלם‬ לא ספק Git. ראה פרמטר GitProvider.
Organization מחרוזת לא שם הארגון שאליו ברצונך להתחבר.
Project מחרוזת לא שם הפרוייקט שאליו ברצונך להתחבר.
Repository מחרוזת לא שם המאגר שאליו ברצונך להתחבר.
RootFolder מחרוזת לא שם תיקיית הבסיס שבה כל הפתרונות שלך נמצאים בטווח הפתרון.
SolutionUniqueName מחרוזת לא השם הייחודי של הפתרון שברצונך להתחבר ל- git.
UpstreamBranch מחרוזת לא שם הענף במעלה הזרם שאליו ברצונך להתחבר. מעבר לענף מאגר המוגדר כברירת מחדל.
GitHubConnectionId מחרוזת לא מזהה חיבור עבור חיבור GitHub Power Platform. נדרש כאשר GitProvider הוא 1, אלא אם תספק GitHubPAT. לא ניתן להשתמש כאשר תמיכה ברשת וירטואלית (VNET) זמינה עבור סביבת Dataverse.
GitHubPAT מחרוזת לא GitHub אסימון גישה אישית עם גישה למאגר היעד. נדרש כאשר GitProvider הוא 1, אלא אם תספק GitHubConnectionId. נדרש כאשר תמיכה ברשת וירטואלית (VNET) זמינה עבור הסביבה Dataverse.
GitHubAppConfigId מחרוזת לא הפניה לרשומת התצורה של יישום GitHub. נדרש כאשר GitProvider הוא 1. השתמש בתבנית githubappconfigs(<recordId>).

פרמטר סוג חיבור

הפרמטר ConnectionType קובע אם להתחבר לסביבה כולה של Dataverse או לפתרון ספציפי.

ערך: תווית Description
0 הפתרון חיבור פתרון Dataverse ספציפי ל- Git.
1 סביבה מחבר את סביבת Dataverse כולה ל- Git.

פרמטר GitProvider

השתמש בפרמטר GitProvider כדי לציין את סוג ספק Git שבו אתה משתמש, Azure DevOps או GitHub.

ערך: תווית Description
0 Azure DevOps השתמש למאגרים המתארחים ב- Azure DevOps
1 GitHub השתמש למאגרים המתארחים ב- GitHub

DisconnectFromGit API

הסרה של חיבור Git מפתרון או מסביבה של Dataverse, והשבתת שילוב בקרת המקור.

פרמטר

ל DisconnectFromGit - API יש פרמטר אחד בלבד.

פרמטר סוג נדרש Description
SolutionUniqueName מחרוזת לא השם הייחודי של הפתרון שברצונך לנתק מ- Git. אל תשמיט את ההוראה לנתק את כל הפתרונות או הסביבה.

מידע נוסף

להלן כמה אפשרויות של ערך פרמטר שברצונך לציין בעת הפעלת DisconnectFromGit.

  • ניתוק פתרון יחיד: ספק SolutionUniqueName כדי לנתק פתרון ספציפי.
  • נתק את כל הפתרונות: אל תספק פרמטרים לניתוק כל החיבורים ברמת הפתרון.
  • סביבת ניתוק: אל תספק פרמטרים לניתוק החיבור ברמת הסביבה.

דוגמאות

הדוגמאות הבאות מתארות תרחישים לשימוש בממשקי ה-API ConnectToGit ו-DisconnectFromGit:

חבר את סביבת Dataverse כולה למאגר Azure DevOps

חיבור זה מאפשר בקרת מקור עבור כל התצורות והרכיבים ברמת הסביבה.

אל תשתמש בפרמטרים אלה עם חיבור זה:

  • RootFolder
  • SolutionUniqueName
  • UpstreamBranch

דוגמה זו מראה כיצד להשתמש בפעולה ConnectToGit כדי לחבר את סביבת Dataverse כולה למאגר Azure DevOps.

בקשה

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

תגובה

HTTP/1.1 204 No Content
OData-Version: 4.0

למד כיצד להפעיל פעולות API של אינטרנט

התחברות למאגר GitHub חדש

לפני שתשתמש ב- API כדי להתחבר ל- GitHub, השלם את שלבי ההגדרה כדי ליצור את יישום GitHub, התקן אותו במאגר היעד, ייבא את המפתח הפרטי שלו ל- Azure Key Vault וצור את חיבור Power Platform GitHub. לקבלת מידע נוסף, ראה התחברות GitHub.

יצירת רשומת תצורה GitHub App באמצעות ה- API של האינטרנט

השתמש ב- API של האינטרנט Dataverse OData כדי ליצור רשומה githubappconfig . שלח בקשת POST עם מזהה הלקוח של אפליקציית GitHub, ה-URI של Key Vault ושם המפתח.

באפשרותך להשתמש בכל לקוח HTTP, כגון Insomnia, Visual Studio Code REST או curl, כדי לבצע שיחות אלה. דרוש לך אסימון נושא לצורך אימות. לקבלת מידע נוסף, ראה שימוש ב- MICROSOFT DATAVERSE WEB API.

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

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

חשוב

שים לב למזהה הרשומה שהוחזר בכותרת התגובה. דרוש לך ערך זה כדי לזהות את הזהות המנוהלת, לקבוע את התצורה של RBAC ולבצע קריאה ל- ConnectToGit. מזהה הרשומה משתמש בתבנית כגון 13d565bb-4c22-f111-a546-7ced8d6e3e85.

לאחר יצירת רשומת התצורה של יישום GitHub, הקצה את התפקיד משתמש ההצפנה של Key Vault לזהות המנוהלת Dataverse כמתואר במאמר קביעת תצורה של בקרת גישה מבוססת תפקידים (RBAC) של Key Vault.

התקשר ל- API של ConnectToGit

לאחר יצירת הרשומה וקביעת githubappconfig התצורה של Key Vault RBAC, השתמש ב- API של Dataverse Web כדי ליצור את חיבור בקרת המקור על-ידי ביצוע 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>)"
}

חשוב

הענף חייב להיות קיים כבר במאגר. צור אותו GitHub במידת הצורך. הערך GitHubAppConfigId חייב להשתמש בתבנית githubappconfigs(<recordId>).

צילום מסך של גוף בקשת HTTP עבור ה- API של ConnectToGit עם GitHub פרמטרים.

אם אתה מקבל תגובה מוצלחת, הסביבה מחוברת ל- GitHub.

התחברות למאגר GitHub באמצעות PowerShell

הדוגמה הבאה של PowerShell יוצרת את רשומת התצורה של יישום GitHub, ממתינה עד שהזהות המנוהלת של Dataverse תופיע ב-Microsoft Entra ID, מקצה את תפקיד Key Vault Crypto User לזהות המנוהלת, וקוראת לפעולת ConnectToGit אם כבר יש לך רשומת תצורה של GitHub App, ציין GitHubAppConfigId כדי לדלג על שלבי התצורה והקצאת התפקידים ב-Key Vault.

התקן ויבא את Az.Accountsהמודולים Az.KeyVault, , Az.Resources ו- PowerShell לפני שתפעיל את הדוגמה. היכנס באמצעות Connect-AzAccount חשבון בעל גישה לסביבה Dataverse ולההרשאות להקצות Key Vault תפקידים.

אם התמיכה ברשת הווירטואלית (VNET) זמינה עבור הסביבה Dataverse, ספק GitHubPAT. לא ניתן להשתמש בחיבורי GitHub עם תמיכה ברשת וירטואלית.

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

נתק את כל סביבת Dataverse שלך לבקרת מקור של Git

פעולה זו מסירה את חיבור Git ברמת הסביבה. אל תשתמש בפרמטר SolutionUniqueName עבור פעולה זו. Dataverse מזהה ומסיר באופן אוטומטי את חיבור Git ברמת הסביבה.

דוגמה זו מראה כיצד להשתמש בפעולה DisconnectFromGit כדי לנתק את כל סביבת Dataverse שלך לבקרת מקור של Git.

בקשה

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

תגובה

HTTP/1.1 204 No Content
OData-Version: 4.0

למד כיצד להפעיל פעולות API של אינטרנט

חבר את הפתרון הראשון למאגר Git

חיבור זה יוצר את הקישור ואת מבנה התיקיות של המאגר עבור בקרת מקור ברמת הפתרון לפתרון הראשון בסביבה.

עליך לכלול ערכים עבור פרמטרים אלה כדי לציין את הפתרון:

  • RootFolder
  • SolutionUniqueName

דוגמה זו מראה כיצד להשתמש בפעולה ConnectToGit כדי לחבר את הפתרון הראשון למאגר Git.

בקשה

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

תגובה

HTTP/1.1 204 No Content
OData-Version: 4.0

למד כיצד להפעיל פעולות API של אינטרנט

חבר פתרונות נוספים לאותו מאגר Git לאחר חיבור הפתרון הראשוני

לאחר חיבור הפתרון הראשון, דרושים לך רק פרמטרים ספציפיים לפתרון. קבל בירושה את פרטי חיבור המאגר מהחיבור הראשוני.

הגדר פרמטרים אלה בלבד:

  • SolutionUniqueName
  • Branch
  • GitFolder

חשוב

עליך לחבר תחילה את הפתרון הראשון לפני שפתרון זה יפעל. ראה חיבור הפתרון הראשון למאגר Git.

דוגמה זו מראה כיצד להשתמש בפעולה ConnectToGit כדי לחבר את הפתרונות הבאים למאגר Git.

בקשה

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

תגובה

HTTP/1.1 204 No Content
OData-Version: 4.0

למד כיצד להפעיל פעולות API של אינטרנט

ניתוק פתרון ספציפי לבקרת מקור של Git תוך שמירה על חיבור פתרונות אחרים

השתמש בגישה זו כדי להסיר בקרת מקור עבור פתרון אחד מבלי להשפיע על אחרים.

דוגמה זו מראה כיצד להשתמש בפעולה DisconnectFromGit כדי להסיר בקרת מקור עבור פתרון אחד מבלי להשפיע על אחרים.

בקשה

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

תגובה

HTTP/1.1 204 No Content
OData-Version: 4.0

למד כיצד להפעיל פעולות API של אינטרנט

טיפול בשגיאות

אף ה-ConnectToGit API וגם ה-DisconnectFromGit API לא מחזירים ערך כאשר הם מסתיימים בהצלחה. כאשר API נכשל, הוא מחזיר שגיאה.

תרחישי שגיאה נפוצים כוללים:

  • ודא שיש לך אימות תקין לספק Git: פרטי זיהוי שגויים.
  • המאגר לא נמצא: אמת את שמות הארגון, הפרוייקט והמאגר.
  • ההרשאה נדחתה: ודא שלחשבון Dataverse שלך יש הרשאות ניהול בקרת מקור.
  • הפתרון לא נמצא: ודא שהפתרון SolutionUniqueName קיים בסביבה שלך.
  • הענף אינו קיים: ודא שהענף שצוין קיים במאגר.

תמיכה ומשאבים נוספים

לקבלת מידע נוסף אודות שילוב בקרת מקור עם Dataverse, ראה: