GitHub Actions көмегімен сату үрдістерін кеңейту

Бұл мақалада құбырларды ұзарту үшін GitHub әрекеттері және Power Automate бұлт ағындарын пайдалану көрсетілген Power Platform. Құбырларды орналастыру жіберілгенде, бұлт ағыны GitHub тармағына артефакттың бастапқы кодын жүктеп алу, орамнан шығару және тапсыру үшін GitHub жұмыс процесін іске қосады.

Жұмыс ағыны туралы мәліметтер

Жұмыс процесі a workflow_dispatch оқиға арқылы іске қосылады. Жұмыс процесі ubuntu-latest жұмыс істейді және contents: write GitHub репозиторий тармағына өзгертулер енгізуге рұқсаты бар.

Жұмыс процесі келесі қадамдардан тұрады:

  1. actions/checkout@v3: Репозиторийді тексереді.
  2. create new branch if specified: Егер кірістерде a target_branch көрсетілсе, жаңа тармақ жасайды.
  3. download solution from artifact: Құбырлар арқылы жасалған артефакттен шешімді жүктеп алады.
  4. unpack solution: Шешімді қаптамадан шығарады.
  5. commit changes: Бар немесе жаңа филиалға өзгертулер енгізеді.
  6. push to branch: Орындалған өзгертулерді бастапқы тармаққа итереді.

Жұмыс процесінің кірістері

Келесі жұмыс процесі кірістері міндетті немесе қосымша болып табылады:

  • artifact_url (міндетті): Құбырлар арқылы жасалған артефакт үшін Microsoft Dataverse жол (жазба) идентификаторының URL мекенжайы.
  • solution_name (міндетті): Dataverse ортадағы шешімнің атауы.
  • source_branch (міндетті): Шешім қабылдауға арналған бөлім.
  • target_branch (міндетті емес): шешім қабылдау үшін жасалатын бөлім. Егер көрсетілмесе, source_branch қолданылады.
  • commit_message (міндетті): Міндеттемені қамтамасыз ететін хабарлама.

Жұмыс процесінің құпиялары

Келесі құпиялар Dataverse қосылу үшін Dataverse және Microsoft Entra ID (AD) ішінде конфигурацияланған Қолданба пайдаланушысын пайдалану үшін қажет. Бұл құпияларды GitHub репозиторий параметрлерінде конфигурациялаңыз.

  • CLIENT_ID: Тіркелген Microsoft Entra қолданбаның клиент идентификаторы.
  • TENANT_ID: Microsoft Entra қолданбамен байланысты Microsoft Entra каталогының жалға алушы идентификаторы.
  • CLIENT_SECRET: Тіркелген Microsoft Entra қолданбаның клиенттік құпиясы.

Қосымша ақпарат алу үшін Шифрланған құпияларды жасау және пайдалану және Қолданба пайдаланушысын жасау бөліміне өтіңіз.

Жұмыс процесінің коды

Төменде 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 }}
          }

Ескертпе

Шешім артефактісін жүктеп алу үшін пайдаланылатын Dataverse web API файлының максималды өлшемі 16 МБ шегіне ие.

Мысал Power Automate ағыны

GitHub жұмыс процесін шақыру үшін Power Automate ішінде орналастыру сұрауы жасалған кезде іске қосылатын Dataverseағын жасауға болады. Ағынды GitHub жұмыс үрдісіне қажетті кірістерді беру үшін конфигурациялауға болады. Power Automate ағын жасау жолы туралы қосымша ақпарат алу үшін Ағын жасау бөліміне өтіңіз.

Ағын мәліметтері

Ағын OnDeploymentRequested әрекет Dataverse ішінде іске қосылғанда іске қосылады. Ағын GitHub жұмыс процесін іске қосу үшін HTTP қосқышын шақырады. Ағын қажетті кірістерді GitHub жұмыс процесіне өткізеді. Сұрау мәтініне келесі енгізулерді қосыңыз:

  • artifact_url: құбырлар арқылы жасалған Dataverse шешім артефактісінің URL мекенжайы.
  • solution_name: Dataverse ортадағы шешімнің атауы.
  • user_name: міндеттемеге арналған пайдаланушы аты.
  • source_branch: Шешімді орындауға арналған бастапқы бөлім.
  • target_branch: Шешім қабылдау үшін жасалатын бөлім.
  • commit_message: Міндеттемені қамтамасыз ететін хабарлама.

artifact_url, solution_name және user_name ге берілген мәндер құбырды іске қосқан әрекеттің шығыстарынан алынады. commit_message орналастыру сатысының іске қосу жолынан алынады 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']}

Сондай-ақ, ағын GitHub көмегімен аутентификация үшін жеке қол жеткізу таңбалауышын (PAT) пайдаланады. GitHub жеке қол жеткізу таңбалауышын жасау жолы туралы қосымша ақпарат алу үшін Жеке қол жеткізу таңбалауышын жасау бөліміне өтіңіз. PAT HTTP сұрауының Authorization тақырыбында жіберіледі.

Ағында келесі мәндерді жаңартыңыз:

  • [GitHub Personal Access Token] - GitHub жеке қол жеткізу белгісімен ауыстырыңыз.
  • [GitHub Organization] - GitHub ұйымыңыздың атымен ауыстырыңыз.
  • [GitHub Repository] - GitHub репозиторийінің атауымен ауыстырыңыз.
  • [GitHub Workflow YAML File] - GitHub жұмыс процесі YAML файл атауымен ауыстырыңыз.
  • [Source Branch] - Шешімді орындау үшін Git тармағымен ауыстырыңыз.
  • [Target Branch] - Шешімді орындау үшін жасау үшін Git тармағымен ауыстырыңыз. Target Branch міндетті емес. Егер мақсатты тармақты көрсетпесеңіз, шешіміңіз Source Branch үшін бекітілген.

Power Automate байланысты орналастыру кезеңін шығарып алу және HTTP қосқышын пайдаланып GitHub жұмыс процесін шақыру қадамы бар OnDeploymentRequested триггерін көрсететін ағын

Келесі қадамдар

Құбырларды кіргізіңіз Power Platform

Келесіні де қараңыз:

GitHub әрекеттеріне арналған жылдам бастау
Құбырларды ұзарту Power Platform
Бұлт ағындары дегеніміз не?