Dela via


Automatisera Git-integrering med hjälp av API:er

Med Microsoft Fabric Git-integreringsverktyget kan team arbeta tillsammans med källkontroll för att skapa en effektiv och återanvändbar lanseringsprocess för sitt Fabric-innehåll.

Med Rest-API:er för Microsoft Fabric kan du automatisera Fabric-procedurer och -processer för att utföra uppgifter snabbare och med färre fel. Den här effektiviteten leder till kostnadsbesparingar och förbättrad produktivitet.

I den här artikeln beskrivs hur du använder REST-API:er för Git-integrering för att automatisera Git-integrering i Microsoft Fabric.

Prerequisites

För att arbeta med Fabric Git-API:er behöver du:

Du kan använda REST-API:er utan PowerShell, men skripten i den här artikeln använder PowerShell. Utför följande steg för att köra skripten:

Api-funktioner för Git-integrering

Rest-API:er för Git-integrering kan hjälpa dig att uppnå kontinuerlig integrering och kontinuerlig leverans (CI/CD) av ditt innehåll. Här följer några exempel på vad som kan göras med hjälp av API:erna:

Examples

Använd följande PowerShell-skript för att förstå hur du utför flera vanliga automatiseringsprocesser. Om du vill visa eller kopiera texten i ett PowerShell-exempel använder du länkarna i det här avsnittet. Du kan också se alla exempel i Git-integreringsexemplen för Fabric GitHub-lagringsplatsen.

Ansluta och uppdatera

I det här avsnittet beskrivs stegen för att ansluta och uppdatera en arbetsyta med Git.

Det fullständiga skriptet finns i Ansluta och uppdatera från Git. (Skriptkompatibiliteten är PowerShell 5.1)

  1. Anslut till Azure-konto och hämta åtkomsttoken – Logga in på Fabric som en användare eller tjänstens huvudkonto. Använd kommandot Connect-AzAccount för att ansluta. Om du vill hämta en åtkomsttoken använder du kommandot Get-AzAccessToken och konverterar den säkra strängtoken till oformaterad text

    Koden bör se ut ungefär så här:

     $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. Anropa Connect-API:et för att ansluta arbetsytan till en Git-lagringsplats och -gren. (du kan behöva skapa en anslutning först)

    Information om hur du hämtar anslutningsinformation (ID, namn) finns i Hämta eller skapa anslutning för autentiseringsuppgifter för Git-provider.

    $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. Anropa API:et Initiera anslutning för att initiera anslutningen mellan arbetsytan och Git-lagringsplatsen/grenen.

    # 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. Baserat på svaret från API:et Initiera anslutning anropar du antingen Uppdatering från Git-API :et för att slutföra uppdateringen eller gör ingenting om ingen åtgärd krävs.

    Följande skript uppdaterar och övervakar förloppet:

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

Uppdatera från Git

I det här avsnittet beskriver vi stegen för att uppdatera en arbetsyta med ändringarna från Git. I det här skriptet uppdaterar vi arbetsyteobjekten med ändringar från Git, men vi lämnar Git-lagringsplatsen oförändrad.

Det fullständiga skriptet finns i Uppdatera arbetsyta från Git.

  1. Logga in på Git och hämta autentisering.
  2. Anropa API:et Hämta status för att skapa uppdateringen från Git-begärandetexten.
  3. Anropa Update From Git-API:et för att uppdatera arbetsområdet med commits som skickas till den anslutna grenen.

Förplikta alla

Det här avsnittet innehåller en stegvis beskrivning av hur du programmatiskt genomför alla ändringar från arbetsytan till Git.

Det fullständiga skriptet finns i Checka in alla ändringar i Git.

  1. Logga in på Git och hämta autentisering.
  2. Anslut till arbetsytan.
  3. Anropa Commit to Git REST API.
  4. Hämta Long Running OperationId för att förfråga status för operationen.

Selektiv commit

I det här avsnittet beskrivs de steg som ingår i att endast utföra specifika ändringar från arbetsytan till Git.

För det fullständiga skriptet, se Sammanfoga valda ändringar i Git.

  1. Logga in på Git och hämta autentisering.
  2. Anslut till arbetsytan.
  3. Anropa API:et Hämta status för att se vilka objekt som ändrats i arbetsytan.
  4. Välj de specifika objekt som ska bekräftas.
  5. Kalla API:et Commit to Git för att begå de valda ändringarna från arbetsområdet till den anslutna fjärrgrenen.

Övervaka förloppet för tidskrävande åtgärder

Det fullständiga skriptet finns i Kontrollera status för en långvarig operation.

  1. Hämta operationId från Uppdatera från Git eller Commit till Git skriptet.
  2. Anropa API:et Hämta LRO-status med angivna intervall (i sekunder) och skriv ut statusen.

Hämta eller skapa anslutning för autentiseringsuppgifter för Git-provider

För att kunna ansluta till en Git-lagringsplats eller uppdatera dina Git-autentiseringsuppgifter måste du ange ett connectionId. ConnectionId kan komma från antingen en ny anslutning som du skapar eller en befintlig anslutning.

Skapa en ny anslutning som lagrar dina Git-autentiseringsuppgifter

Följande kodfragment visar en exempelbegärandetext för att skapa en anslutning som lagrar dina Azure DevOps-autentiseringsuppgifter. Det fullständiga exemplet finns i Fabric samples-repo.

# 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)

Exempelbegäran

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

Exempelsvar:

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

Hämta en lista över befintliga anslutningar

Använd API:et Listanslutningar för att hämta en lista över befintliga anslutningar som du har behörighet för och deras egenskaper.

Exempelbegäran

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

Exempelsvar

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

Kopiera ID:t för den anslutning som du vill använda och använd det i API:et Git – Anslut eller Git – Uppdatera mina Git-autentiseringsuppgifter .

Beaktanden och begränsningar

  • Git-integrering med API:er omfattas av samma begränsningar som användargränssnittet för Git-integrering.
  • Om du uppdaterar en semantisk modell med hjälp av API:et för förbättrad uppdatering orsakas en Git-diff efter varje uppdatering.