Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra l'utilizzo dei flussi cloud GitHub Actions e Power Automate per l'estensione delle pipeline in Power Platform. Quando viene inviata una distribuzione di pipeline, un flusso cloud attiva il flusso di lavoro GitHub per scaricare, decomprimere ed eseguire il commit del codice sorgente dell'artefatto in un ramo GitHub.
Dettagli flusso di lavoro
Il flusso di lavoro viene attivato tramite un evento workflow_dispatch. Il flusso di lavoro viene eseguito su ubuntu-latest e dispone dell'autorizzazione contents: write per poter eseguire il commit delle modifiche al ramo del repository GitHub.
Il flusso di lavoro è costituito dai seguenti passaggi:
-
actions/checkout@v3: controlla il repository. -
create new branch if specified: crea un nuovo ramo setarget_branchè specificato negli input. -
download solution from artifact: scarica la soluzione dall'artefatto creato dalle pipeline. -
unpack solution: decomprime la soluzione. -
commit changes: conferma le modifiche al ramo esistente o nuovo. -
push to branch: invia le modifiche salvate al ramo di origine.
Input flusso di lavoro
I seguenti input del flusso di lavoro sono obbligatori o facoltativi:
-
artifact_url(obbligatorio): l'URL dell'ID riga Microsoft Dataverse (record) per l'artefatto creato dalle pipeline. -
solution_name(obbligatorio): il nome della soluzione nell'ambiente Dataverse. -
source_branch(obbligatorio): ramo per il commit della soluzione. -
target_branch(facoltativo): ramo per creare per il commit della soluzione. Se non specificato, viene usatosource_branch. -
commit_message(obbligatorio): messaggio da fornire per il commit.
Segreti del flusso di lavoro
I seguenti segreti sono necessari per connettersi a Dataverse utilizzando un utente dell'applicazione configurato in Dataverse e in Microsoft Entra ID (AD). Configura questi segreti nelle impostazioni del repository GitHub.
-
CLIENT_ID: l'ID client dell'applicazione Microsoft Entra registrata. -
TENANT_ID: l'ID tenant della directory di Microsoft Entra associata all'applicazione Microsoft Entra. -
CLIENT_SECRET: il segreto client dell'applicazione Microsoft Entra registrata.
Per altre informazioni, vedi Creazione e utilizzo di segreti crittografati e Creare un utente dell'applicazione.
Codice del flusso di lavoro
Di seguito è elencato il codice del flusso di lavoro GitHub Actions.
name: Download, unpack and commit the solution to git
run-name: Getting ${{ github.event.inputs.solution_name }} from pipelines host environment and committing
on:
workflow_dispatch:
inputs:
artifact_url:
description: "The url of the Dataverse record ID for the artifact created by the pipelines (Example: https://[your-env].crm.dynamics.com/api/data/v9.0/deploymentartifacts([your-artifact-id])/artifactfile/$value)."
required: true
solution_name:
description: "Name of the Solution in Dataverse environment"
required: true
user_name:
description: "User name for the commit"
required: true
source_branch:
description: "Branch for the solution commit"
required: true
target_branch:
description: "Branch to create for the solution commit"
required: false
commit_message:
description: "Message to provide for the commit"
required: true
permissions:
contents: write
jobs:
export-unpack-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.inputs.source_branch }}
# Commit changes to the existing or new branch
- name: create new branch if specified
shell: pwsh
run: |
if('${{ github.event.inputs.target_branch }}' -ne '') {
git checkout -b ${{ github.event.inputs.target_branch }} ${{ github.event.inputs.source_branch }}
}
# Export the solution from the artifact created by pipelines
- name: download solution from artifact
env:
CLIENT_ID: ${{secrets.CLIENT_ID}}
TENANT_ID: ${{secrets.TENANT_ID}}
CLIENT_SECRET: ${{secrets.CLIENT_SECRET}}
shell: pwsh
run: |
$aadHost = "login.microsoftonline.com"
$url = "${{ github.event.inputs.artifact_url }}"
$options = [System.StringSplitOptions]::RemoveEmptyEntries
$dataverseHost = $url.Split("://", $options)[1].Split("/")[0]
$body = @{client_id = $env:CLIENT_ID; client_secret = $env:CLIENT_SECRET; grant_type = "client_credentials"; scope = "https://$dataverseHost/.default"; }
$OAuthReq = Invoke-RestMethod -Method Post -Uri "https://$aadHost/$env:TENANT_ID/oauth2/v2.0/token" -Body $body
$spnToken = $OAuthReq.access_token
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer $spnToken")
$headers.Add("Content-Type", "application/json")
# Download the managed solution
$response = Invoke-RestMethod "${{ github.event.inputs.artifact_url }}" -Method 'GET' -Headers $headers
$bytes = [Convert]::FromBase64String($response.value)
[IO.File]::WriteAllBytes("${{ github.event.inputs.solution_name }}_managed.zip", $bytes)
# Download the unmanaged solution (for now we will need to use string manipulation to get the unmanaged solution URL, until the API provides this value)
$unmanaged_artifact_url = "${{ github.event.inputs.artifact_url }}".Replace("artifactfile", "artifactfileunmanaged")
$response = Invoke-RestMethod "$unmanaged_artifact_url" -Method 'GET' -Headers $headers
$bytes = [Convert]::FromBase64String($response.value)
[IO.File]::WriteAllBytes("${{ github.event.inputs.solution_name }}.zip", $bytes)
# Unpack the solution
- name: unpack solution
uses: microsoft/powerplatform-actions/unpack-solution@v0
with:
solution-file: "${{ github.event.inputs.solution_name }}.zip"
solution-folder: "${{ github.event.repository.name }}"
solution-type: 'Both'
process-canvas-apps: false
overwrite-files: true
# Commit changes to the existing or new branch
- name: commit changes
shell: pwsh
run: |
rm -rf ${{ github.event.inputs.solution_name }}.zip
rm -rf ${{ github.event.inputs.solution_name }}_managed.zip
git config user.name ${{ github.event.inputs.user_name }}
git pull
git add --all
git commit -am "${{ github.event.inputs.commit_message }}" --allow-empty
# Push the committed changes to the source branch
- name: push to branch
shell: pwsh
run: |
if('${{ github.event.inputs.target_branch }}' -ne '') {
git push origin ${{ github.event.inputs.target_branch }}
} else {
git push origin ${{ github.event.inputs.source_branch }}
}
Nota
L'API Web Dataverse usata per scaricare l'artefatto della soluzione ha un limite massimo di dimensioni del file di 16 MB.
Esempio di flusso Power Automate
Per chiamare un flusso di lavoro GitHub, puoi creare un flusso Power Automate che viene attivato quando viene effettuata una richiesta di distribuzione in Dataverse. Il flusso può essere configurato per passare gli input richiesti al flusso di lavoro GitHub. Per altre informazioni su come creare un flusso Power Automate, vedi Creare un flusso.
Dettagli
Il flusso si attiva quando l'azione OnDeploymentRequested viene eseguita in Dataverse. Il flusso chiama il connettore HTTP per attivare il flusso di lavoro GitHub. Il flusso passa gli input richiesti al flusso di lavoro GitHub. Includi i seguenti input nel corpo della richiesta:
-
artifact_url: URL dell'artefatto della soluzione Dataverse creato da pipeline. -
solution_name: il nome della soluzione nell'ambiente Dataverse. -
user_name: nome utente per il commit. -
source_branch: ramo di origine per il commit della soluzione. -
target_branch: ramo per creare per il commit della soluzione. -
commit_message: messaggio da fornire per il commit.
I valori passati a artifact_url, solution_name e user_name vengono estratti dagli output dell'azione che ha attivato la pipeline.
commit_message viene estratto dalla riga di esecuzione della fase di distribuzione in Dataverse.
-
artifact_url:@{triggerOutputs()?['body/OutputParameters/ArtifactFileDownloadLink']} -
solution_name:@{triggerOutputs()?['body/OutputParameters/ArtifactName']} -
user_name:@{triggerOutputs()?['body/OutputParameters/DeployAsUser']} -
commit_message:@{outputs('Retrieve_the_Deployment_Stage_Run')?['body/deploymentnotes']}
Il flusso usa anche un token di accesso personale (PAT) per l'autenticazione con GitHub. Per altre informazioni su come creare un token di accesso personale GitHub, vedi Creazione di un token di accesso personale. Il PAT viene passato all'intestazione Authorization della richiesta HTTP.
Aggiorna i valori seguenti nel flusso:
-
[GitHub Personal Access Token]: sostituisci con il tuo token di accesso personale GitHub. -
[GitHub Organization]: sostituisci con il nome dell'organizzazione GitHub. -
[GitHub Repository]: sostituisci con il nome del repository GitHub. -
[GitHub Workflow YAML File]: sostituisci con il nome del file YAML del flusso di lavoro GitHub. -
[Source Branch]: sostituisci con il ramo Git per eseguire il commit della soluzione. -
[Target Branch]: sostituisci con il ramo Git per creare il commit per la soluzione.Target Branchè facoltativo. Se non specifichi un ramo di destinazione, la tua soluzione è impegnata inSource Branch.
Passaggi successivi
Eseguire pipeline in Power Platform
Vedi anche
Avvio rapido per GitHub Actions
Estendere le pipeline in Power Platform
Che cosa sono i flussi cloud?