Поделиться через


Автоматизация интеграции Git с помощью API

Инструмент интеграции Git в Microsoft Fabric позволяет командам совместно работать с помощью системы управления версиями для создания эффективного и многократно используемого процесса выпуска для содержимого Fabric.

С помощью интерфейсов REST API Microsoft Fabric вы можете автоматизировать процедуры и процессы Microsoft Fabric для более быстрого выполнения задач и уменьшения количества ошибок. Эта эффективность приводит к экономии затрат и повышению производительности.

В этой статье описывается, как использовать REST API интеграции Git для автоматизации интеграции Git в Microsoft Fabric.

Prerequisites

Чтобы работать с API-интерфейсами Git Fabric, вам потребуется:

Интерфейсы REST API можно использовать без PowerShell, но скрипты в этой статье используют PowerShell. Чтобы запустить скрипты, выполните следующие действия.

Функции API интеграции Git

REST API для интеграции Git могут помочь вам достичь непрерывной интеграции и доставки контента (CI/CD). Ниже приведены несколько примеров того, что можно сделать с помощью API:

Examples

Используйте следующие сценарии PowerShell, чтобы понять, как выполнять несколько распространенных процессов автоматизации. Чтобы просмотреть или скопировать текст в примере PowerShell, используйте ссылки в этом разделе. Вы также можете просмотреть все примеры в репозитории GitHub с примерами интеграции Fabric через Git.

Подключение и обновление

В этом разделе описаны шаги, связанные с подключением и обновлением рабочей области с помощью Git.

Полный сценарий см. в разделе "Подключение и обновление" из Git. (Совместимость скрипта — PowerShell 5.1)

  1. Подключитесь к учетной записи Azure и получите токен доступа. Войдите в Fabric в качестве пользователя или служебного субъекта. Используйте команду Connect-AzAccount для подключения . Чтобы получить маркер доступа, используйте команду Get-AzAccessToken и преобразуйте маркер безопасной строки в обычный текст.

    Код должен выглядеть следующим образом:

     $global:resourceUrl = "https://api.fabric.microsoft.com"
    
     $global:fabricHeaders = @{}
    
     function SetFabricHeaders() {
    
        #Login to Azure
        Connect-AzAccount | Out-Null
    
        # Get authentication
        $secureFabricToken = (Get-AzAccessToken -AsSecureString -ResourceUrl $global:resourceUrl).Token
    
        # Convert secure string to plain test
        $ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureFabricToken)
        try {
            $fabricToken = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)
        } finally {
            [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)
       }
    
      $global:fabricHeaders = @{
         'Content-Type' = "application/json"
         'Authorization' = "Bearer {0}" -f $fabricToken
     }
    }
    
  2. ВызовИТЕ API Connect, чтобы подключить рабочую область к репозиторию и ветви Git. (сначала может потребоваться создать подключение )

    Сведения о том, как получить сведения о подключении (идентификатор, имя), см. в разделе "Получение или создание подключения к учетным данным поставщика Git".

    $global:baseUrl = "https://api.fabric.microsoft.com/v1"
    $workspaceName = "<WORKSPACE NAME>"
    $getWorkspacesUrl = "{0}/workspaces" -f $global:baseUrl
    $workspaces = (Invoke-RestMethod -Headers $global:fabricHeaders -Uri $getWorkspacesUrl -Method GET).value
    
    # Find the workspace by display name
    $workspace = $workspaces | Where-Object {$_.DisplayName -eq $workspaceName}
    
    # Connect to Git
    Write-Host "Connecting the workspace '$workspaceName' to Git."
    $connectUrl = "{0}/workspaces/{1}/git/connect" -f $global:baseUrl, $workspace.Id
    
    # AzureDevOps details
    $azureDevOpsDetails = @{
        gitProviderType = "AzureDevOps"
        organizationName = "<ORGANIZATION NAME>"
        projectName = "<PROJECT NAME>"
        repositoryName = "<REPOSITORY NAME>"
        branchName = "<BRANCH NAME>"
        directoryName = "<DIRECTORY NAME>"
    }
    
    $connectToGitBody = @{}
    #Leave only one of the following two (delete the other one):
    #-----------------------------------------------------------------------------------------------
    # 1. Automatic (SSO)
    $connectToGitBody = @{
        gitProviderDetails = $gitProviderDetails
    } | ConvertTo-Json
    #-----------------------------------------------------------------------------------------------
    # 2. ConfiguredConnection (User or service principal)
    # Get workspaces
    $connectionName = "<CONNECTION Name>"
    $getConnectionsUrl = "{0}/connections" -f $global:baseUrl
    $connections = (Invoke-RestMethod -Headers $global:fabricHeaders -Uri $getConnectionsUrl -Method GET).value
    
    # Find the connection by display name
    $connection = $connections | Where-Object {$_.DisplayName -eq $connectionName}
    $connectToGitBody = @{
        gitProviderDetails = $azureDevOpsDetails
        myGitCredentials = @{
            source = "ConfiguredConnection"
            connectionId = $connection.id
            }
        } | ConvertTo-Json
    #-----------------------------------------------------------------------------------------------
    
    Invoke-RestMethod -Headers $global:fabricHeaders -Uri $connectUrl -Method POST -Body $connectToGitBody
    
  3. Вызовите API инициализации подключения, чтобы инициализировать подключение между рабочей областью и репозиторием или ветвью Git.

    # Initialize Connection
    
    Write-Host "Initializing Git connection for workspace '$workspaceName'."
    
    $initializeConnectionUrl = "{0}/workspaces/{1}/git/initializeConnection" -f $global:baseUrl, $workspace.Id
    $initializeConnectionResponse = Invoke-RestMethod -Headers $global:fabricHeaders -Uri $initializeConnectionUrl -Method POST -Body "{}"
    
  4. В зависимости от ответа API инициализации подключения вызовите API Update From Git для завершения обновления или не выполняйте никаких действий, если никаких действий не требуется.

    Следующий скрипт обновляет и отслеживает ход выполнения.

    if ($initializeConnectionResponse.RequiredAction -eq "UpdateFromGit") {
    
        # Update from Git
        Write-Host "Updating the workspace '$workspaceName' from Git."
    
        $updateFromGitUrl = "{0}/workspaces/{1}/git/updateFromGit" -f $global:baseUrl, $workspace.Id
    
        $updateFromGitBody = @{ 
            remoteCommitHash = $initializeConnectionResponse.RemoteCommitHash
      workspaceHead = $initializeConnectionResponse.WorkspaceHead
        } | ConvertTo-Json
    
        $updateFromGitResponse = Invoke-WebRequest -Headers $global:fabricHeaders -Uri $updateFromGitUrl -Method POST -Body $updateFromGitBody
    
        $operationId = $updateFromGitResponse.Headers['x-ms-operation-id']
        $retryAfter = $updateFromGitResponse.Headers['Retry-After']
        Write-Host "Long Running Operation ID: '$operationId' has been scheduled for updating the workspace '$workspaceName' from Git with a retry-after time of '$retryAfter' seconds." -ForegroundColor Green
    
        # Poll Long Running Operation
        $getOperationState = "{0}/operations/{1}" -f $global:baseUrl, $operationId
        do
        {
            $operationState = Invoke-RestMethod -Headers $global:fabricHeaders -Uri $getOperationState -Method GET
    
            Write-Host "Update from Git operation status: $($operationState.Status)"
    
            if ($operationState.Status -in @("NotStarted", "Running")) {
                Start-Sleep -Seconds $retryAfter
            }
        } while($operationState.Status -in @("NotStarted", "Running"))
    }
    

Обновление из Git

В этом разделе описаны шаги, связанные с обновлением рабочей области с изменениями из Git. В этом скрипте мы обновляем элементы рабочей области с изменениями из Git, но не изменяем репозиторий Git.

Полный сценарий см. в разделе "Обновление рабочей области" из Git.

  1. Войдите в Git и получите проверку подлинности.
  2. Вызовите API получения состояния, чтобы создать обновление из текста запроса Git.
  3. Вызовите API Update From Git, чтобы обновить рабочую область коммитами, отправленными в подключенную ветвь.

Зафиксировать все

В этом разделе приведено пошаговое описание того, как программно зафиксировать все изменения из рабочей области в Git.

Полный скрипт см. в разделе "Фиксация всех изменений в Git".

  1. Войдите в Git и получите проверку подлинности.
  2. Подключитесь к рабочей области.
  3. Вызовите REST API Commit to Git.
  4. Получите идентификатор длительной выполняемой операции для опроса о состоянии данной операции.

Выборочный коммит

В этом разделе описаны шаги, связанные с фиксацией только определенных изменений из рабочей области в Git.

Полный сценарий см. в разделе Коммит выбранных изменений в Git.

  1. Войдите в Git и получите проверку подлинности.
  2. Подключитесь к рабочей области.
  3. Вызовите API Получить статус, чтобы узнать, какие элементы в рабочем пространстве были изменены.
  4. Выберите определенные элементы для подтверждения.
  5. Вызовите API Commit to Git, чтобы зафиксировать выбранные изменения из рабочей области в подключённую удалённую ветвь.

Отслеживайте ход выполнения длительных операций

Для получения полного сценария см. раздел "Опрос состояния длительно выполняющейся операции".

  1. Получите идентификатор операции из скрипта Update From Git или Commit to Git.
  2. Вызовите API Get LRO Status через указанные интервалы (в секундах) и выведите статус на экран.

Получение или создание подключения к учетным данным поставщика Git

Чтобы подключиться к репозиторию Git или обновить учетные данные Git , необходимо предоставить идентификатор подключения. Идентификатор подключения может поступать из нового создаваемого подключения или существующего подключения.

Создайте новое подключение, в котором хранятся ваши учетные данные Git.

В следующем фрагменте кода показан пример текста запроса для создания подключения, в котором хранятся учетные данные Azure DevOps. Полный пример можно найти в репозитории примеров Fabric.

# Connection with ServicePrincipal details for AzureDevOpsSourceControl
$adoSPConnection = @{
    connectivityType = "ShareableCloud"
    displayName = "<CONNECTION NAME>"
    connectionDetails = @{
        type = "AzureDevOpsSourceControl"
        creationMethod = "AzureDevOpsSourceControl.Contents"
        parameters = @(
            @{
                dataType = "Text"
                name = "url"
                value = "<Repo url in Azure DevOps>"
            }
        )
    }
    credentialDetails = @{
        credentials = @{
            credentialType = "ServicePrincipal"
            tenantId = "<SP tenant (directory) id (Guid)>"
            servicePrincipalClientId = "<SP APP (client) id (Guid)>"
            servicePrincipalSecret = "<SP Secret>"
        }
    }
}

#Note: AzureDevOps for UserPrincipal is not supported (since it requires interactive OAuth2)

Образец запроса

POST https://api.fabric.microsoft.com/v1/connections

{
  "displayName": "<CONNECTION NAME>",
  "connectivityType": "ShareableCloud",
  "connectionDetails": {
    "creationMethod": "AzureDevOpsSourceControl.Contents",
    "type": "AzureDevOpsSourceControl",
    "parameters": [
     {
      "dataType": "Text",
      "name": "url",
      "value": "<Repo url in Azure DevOps>”
     }
    ]
  },
  "credentialDetails": {
    "credentials": {
      "credentialType": "ServicePrincipal",
      "tenantId": “<SP tenant (directory) id (Guid)>”,
      "servicePrincipalClientId": “<SP APP (client) id (Guid)>”,
      "servicePrincipalSecret": “<SP Secret>”
    }
  }
}
 

Пример ответа:

{
  "allowConnectionUsageInGateway": false,
  "id": "********-****-****-****-c13b543982ac",
  "displayName": "<CONNECTION NAME>",
  "connectivityType": "ShareableCloud",
  "connectionDetails": {
    "path": "<Repo url in Azure DevOps>",
    "type": "AzureDevOpsSourceControl"
  },
  "privacyLevel": "Organizational",
  "credentialDetails": {
    "credentialType": "ServicePrincipal",
    "singleSignOnType": "None",
    "connectionEncryption": "NotEncrypted",
    "skipTestConnection": false
  }
}

Получение списка существующих подключений

Используйте API "Список подключений" , чтобы получить список существующих подключений, для которых есть разрешения, и их свойства.

Пример запроса

GET https://api.fabric.microsoft.com/v1/connections

Пример ответа

{
 "value": [
  {
   "id": "e3607d15-6b41-4d11-b8f4-57cdcb19ffc8",
   "displayName": "MyGitHubPAT1",
   "gatewayId": null,
   "connectivityType": "ShareableCloud",
   "connectionDetails": {
    "path": "https://github.com",
    "type": "GitHubSourceControl"
   },
   "privacyLevel": "Organizational",
   "credentialDetails": {
    "credentialType": "Key",
    "singleSignOnType": "None",
    "connectionEncryption": "NotEncrypted",
    "skipTestConnection": false
   }
  },
  {
   "id": "3aba8f7f-d1ba-42b1-bb41-980029d5a1c1",
   "displayName": "MyGitHubPAT2",
   "gatewayId": null,
   "connectivityType": "ShareableCloud",
   "connectionDetails": {
    "path": "https://github.com/OrganizationName/RepositoryName",
    "type": "GitHubSourceControl"
   },
   "privacyLevel": "Organizational",
   "credentialDetails": {
    "credentialType": "Key",
    "singleSignOnType": "None",
    "connectionEncryption": "NotEncrypted",
    "skipTestConnection": false
   }
  }
 ]
}

Скопируйте идентификатор нужного подключения и используйте его в Git — Подключение или Git — обновление API учетных данных Git .

Рекомендации и ограничения

  • Интеграция с Git с помощью API имеет те же ограничения , что и пользовательский интерфейс интеграции Git.
  • Обновление семантической модели с помощью API расширенного обновления вызывает разницу в Git после каждого обновления.