ConnectToGit 및 DisconnectFromGit API를 사용하여 프로그래밍을 통해 Microsoft Dataverse 환경을 Git 소스 관리와 통합합니다. 이러한 API를 사용하면 개별 솔루션 또는 전체 환경을 지원되는 Git 리포지토리에 연결하고 코드를 통해 이러한 연결을 관리할 수 있습니다.
Prerequisites
이러한 API를 사용하기 전에 다음이 있는지 확인합니다.
- Microsoft Dataverse 환경에 대한 액세스
- 시스템 관리자 권한
- Git 리포지토리에 대한 읽기 및 쓰기 권한
ConnectToGit API
Dataverse 솔루션 또는 환경과 Git 리포지토리 간에 연결을 만듭니다. 이 연결을 사용하여 Dataverse 구성 요소에 대한 소스 제어를 관리할 수 있습니다.
Parameters
API는 ConnectToGit 다음 매개 변수를 허용합니다.
| 매개 변수 | Type | 필수 | Description |
|---|---|---|---|
GitFolder |
String | 예 | 솔루션 또는 환경을 바인딩할 폴더의 이름입니다. |
Branch |
String | 예 | 연결하려는 분기의 이름입니다. |
ConnectionType |
Integer | No | 연결할 내용을 지정합니다. ConnectionType 매개 변수를 참조하세요. |
GitProvider |
Integer | No | Git 공급자입니다. GitProvider 매개 변수를 참조하세요. |
Organization |
String | No | 연결하려는 조직의 이름입니다. |
Project |
String | No | 연결할 프로젝트의 이름입니다. |
Repository |
String | No | 연결할 리포지토리의 이름입니다. |
RootFolder |
String | No | 모든 솔루션이 솔루션 범위에 있는 루트 폴더의 이름입니다. |
SolutionUniqueName |
String | No | git에 연결하려는 솔루션의 고유한 이름입니다. |
UpstreamBranch |
String | No | 연결하려는 업스트림 분기의 이름입니다. 기본값은 리포지토리의 기본 브랜치입니다. |
GitHubConnectionId |
String | No | Power Platform GitHub 연결에 대한 연결 ID입니다.
GitProvider이 GitHubPAT인 경우 1를 제공하지 않는 한 필수입니다. Dataverse 환경에 대해 VNET(가상 네트워크) 지원을 사용하도록 설정한 경우 사용할 수 없습니다. |
GitHubPAT |
String | No | 대상 리포지토리에 액세스할 수 있는 GitHub 개인 액세스 토큰.
GitProvider이 GitHubConnectionId인 경우, 1를 제공하지 않는 한 필수입니다. Dataverse 환경에 대해 VNET(가상 네트워크) 지원을 사용하도록 설정하는 경우 필요합니다. |
GitHubAppConfigId |
String | No | GitHub 앱 구성 레코드에 대한 참조입니다.
GitProvider이 1인 경우 필요합니다.
githubappconfigs(<recordId>) 형식을 사용합니다. |
ConnectionType 매개 변수
매개 변수는 ConnectionType 전체 Dataverse 환경 또는 특정 솔루션에 연결할지 여부를 제어합니다.
| 가치 | 레이블 | Description |
|---|---|---|
| 0 | 해결 방법 | 특정 Dataverse 솔루션을 Git에 연결합니다. |
| 1 | 환경 | 전체 Dataverse 환경을 Git에 연결합니다. |
GitProvider 매개 변수
매개 변수를 GitProvider 사용하여 사용 중인 Git 공급자 유형(Azure DevOps 또는 GitHub)을 지정합니다.
| 가치 | 레이블 | Description |
|---|---|---|
| 0 | Azure DevOps | Azure DevOps에서 호스트되는 리포지토리에 사용 |
| 1 | 깃허브 | GitHub에서 호스트되는 리포지토리에 사용 |
Git 연결해제 API
Dataverse 솔루션 또는 환경에서 Git 연결을 제거하고 소스 제어 통합을 사용하지 않도록 설정합니다.
매개 변수
API에는 DisconnectFromGit 매개 변수가 하나만 있습니다.
| 매개 변수 | Type | 필수 | Description |
|---|---|---|---|
SolutionUniqueName |
String | No | Git에서 연결을 끊을 솔루션의 고유한 이름입니다. 모든 솔루션 또는 환경의 연결을 끊지 마십시오. |
추가 정보
다음은 호출할 때 지정할 몇 가지 매개 변수 값 옵션입니다 DisconnectFromGit.
-
단일 솔루션 연결 끊기: 특정 솔루션의 연결을 끊기 위해 제공합니다
SolutionUniqueName. - 모든 솔루션 연결 끊기: 모든 솔루션 수준 연결을 끊을 매개 변수를 제공하지 않습니다.
- 환경 연결 끊기: 환경 수준 연결을 끊을 매개 변수를 제공하지 않습니다.
예시
다음 예에서는 DisconnectFromGit 및 ConnectToGit API를 사용하는 시나리오를 설명합니다.
- 전체 Dataverse 환경을 Azure DevOps 리포지토리에 연결
- GitHub 리포지토리에 연결
- PowerShell을 사용하여 GitHub 리포지토리에 연결
- Git 소스 제어에서 전체 Dataverse 환경 연결 끊기
- 첫 번째 솔루션을 Git 리포지토리에 연결
- 초기 솔루션을 연결한 후 동일한 Git 리포지토리에 추가 솔루션 연결
- 다른 솔루션을 연결 상태로 유지하면서 Git 소스 제어에서 특정 솔루션 연결 끊기
전체 Dataverse 환경을 Azure DevOps 리포지토리에 연결
이 연결을 사용하면 모든 환경 수준 구성 및 구성 요소에 대한 소스 제어를 사용할 수 있습니다.
이 연결에는 다음 매개 변수를 사용하지 마세요.
RootFolderSolutionUniqueNameUpstreamBranch
이 예제에서는 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
GitHub 리포지토리에 연결
API를 사용하여 GitHub 연결하기 전에 설정 단계를 완료하여 GitHub 앱을 만들고, 대상 리포지토리에 설치하고, 프라이빗 키를 Azure Key Vault 가져오고, Power Platform GitHub 연결을 만듭니다. 자세한 내용은 GitHub 연결을 참조하세요.
Web API를 사용하여 GitHub 앱 구성 레코드 만들기
Dataverse OData Web API를 사용하여 레코드를 만듭니다 githubappconfig . GitHub 앱 클라이언트 ID, Key Vault URI 및 키 이름을 사용하여 POST 요청을 보냅니다.
불면증, Visual Studio Code REST 클라이언트 또는 curl과 같은 HTTP 클라이언트를 사용하여 이러한 호출을 수행할 수 있습니다. 인증을 위해 전달자 토큰이 필요합니다. 자세한 내용은 Microsoft Dataverse Web API 사용을 참조하세요.
POST {{DataverseOrgUrl}}/api/data/v9.2/githubappconfigs
Authorization: Bearer {{token}}
Content-Type: application/json
{
"githubappid": "Iv23liBWoH9sf7xDrRe6",
"keyvaulturi": "{{KeyVaultUri}}",
"keyname": "demoGitHubKey"
}
Important
응답 헤더에 반환된 레코드 ID를 확인합니다. 관리 ID를 식별하고, RBAC를 구성하고, 호출 ConnectToGit하려면 이 값이 필요합니다. 레코드 ID는 다음과 같은 13d565bb-4c22-f111-a546-7ced8d6e3e85형식을 사용합니다.
GitHub 앱 구성 레코드를 만든 후 KEY VAULT RBAC(역할 기반 액세스 제어) 구성에 설명된 대로 Key Vault Crypto 사용자 역할을 Dataverse 관리 ID에 할당합니다.
ConnectToGit API 호출
레코드를 githubappconfig 만들고 Key Vault RBAC를 구성한 후 Dataverse Web API를 사용하여 작업을 호출 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>)"
}
Important
브랜치는 리포지토리에 이미 존재해야 합니다. 필요한 경우 먼저 GitHub에서 만드세요. 값은 GitHubAppConfigId 형식 githubappconfigs(<recordId>)을 사용해야 합니다.
성공적인 응답을 받으면 환경이 GitHub 연결됩니다.
PowerShell을 사용하여 GitHub 리포지토리에 연결
다음 PowerShell 예제에서는 GitHub 앱 구성 레코드를 만들고, Dataverse 관리 ID가 Microsoft Entra ID 나타날 때까지 대기하고, Key Vault Crypto User 역할을 관리 ID에 할당하고, 작업을 호출 ConnectToGit 합니다. GitHub 앱 구성 레코드가 이미 있는 경우 구성 및 Key Vault 역할 할당 단계를 건너뛰려면 GitHubAppConfigId를 제공하세요.
예제를 실행하기 전에 Az.Accounts, Az.KeyVault, Az.Resources PowerShell 모듈을 설치하고 가져오세요.
Connect-AzAccount Dataverse 환경에 대한 액세스 권한이 있는 계정과 Key Vault 역할을 할당할 수 있는 권한을 사용하여 로그인합니다.
Dataverse 환경에 대해 VNET(가상 네트워크) 지원을 사용하도록 설정된 경우 다음을 제공합니다 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."
Git 소스 제어에서 전체 Dataverse 환경 연결 끊기
이 작업은 환경 수준 Git 연결을 제거합니다. 이 작업에는 매개 변수를 SolutionUniqueName 사용하지 마세요. Dataverse는 환경 수준 Git 연결을 자동으로 식별하고 제거합니다.
이 예제에서는 DisconnectFromGit 작업을 사용하여 Git 소스 제어에서 전체 Dataverse 환경의 연결을 끊는 방법을 보여 줍니다.
요청
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
첫 번째 솔루션을 Git 리포지토리에 연결
이 연결은 환경의 첫 번째 솔루션에 대한 솔루션 수준 소스 제어를 위한 리포지토리 링크 및 폴더 구조를 설정합니다.
솔루션을 지정하려면 이러한 매개 변수에 대한 값을 포함해야 합니다.
RootFolderSolutionUniqueName
이 예제에서는 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
초기 솔루션을 연결한 후 동일한 Git 리포지토리에 추가 솔루션 연결
첫 번째 솔루션을 연결한 후에는 솔루션별 매개 변수만 필요합니다. 초기 연결에서 리포지토리 연결 세부 정보를 상속합니다.
다음 매개 변수만 설정합니다.
SolutionUniqueNameBranchGitFolder
Important
이 작업을 수행하려면 먼저 첫 번째 솔루션을 연결해야 합니다. 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
다른 솔루션을 연결 상태로 유지하면서 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
오류 처리
ConnectToGit API와 DisconnectFromGit API 모두 성공적으로 완료되었을 때 값을 반환하지 않습니다. API가 실패하면 오류가 반환됩니다.
일반적인 오류 시나리오는 다음과 같습니다.
- 잘못된 자격 증명: Git 공급자에 대한 유효한 인증이 있는지 확인합니다.
- 리포지토리를 찾을 수 없음: 조직, 프로젝트 및 리포지토리 이름을 확인합니다.
- 사용 권한 거부: Dataverse 계정에 소스 제어 관리 권한이 있는지 확인합니다.
-
솔루션을 찾을 수 없음: 사용자 환경에
SolutionUniqueName가 존재하는지 확인하십시오. - 분기가 없습니다. 지정된 분기가 리포지토리에 있는지 확인합니다.
지원 및 추가 리소스
Dataverse와 소스 제어 통합에 대한 자세한 내용은 다음을 참조하세요.