部署之间的 Microsoft Dev Ops yaml 变量

时间:2021-06-16 18:21:17

标签: azure yaml devops

因此,我真正想做的核心是: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops&preserve-view=true#support-for-output-variables

这可以归结为这样一个事实,即我有一个生成输出变量的单个部署模板,我想将其映射回主模板中的变量,以便我可以在后续部署模板中使用它。

我在这里创建了一个包含所有 yaml 模板的 github 项目 https://github.com/MCKRUZ/azure-pipelines

但问题的关键在于这几行。首先,我在主“development.yaml”文件中调用模板部署。

  # Deploy
  # ------
- stage: Deploy 
  displayName: Deploy - Development
  jobs:
    - template: jobs/jobs-deploy-spa-arm-template.yaml
      parameters:
        environment:                              '$(environment)'
        serviceConnection:                        '$(serviceConnection)'
        subscriptionId:                           '$(subscriptionId)'
        resourceGroup:                            '$(resourceGroup)'
        storageAccountName:                       '$(storageAccountName)'
        cdnEndpointName:                          '$(cdnEndpointName)'
        cdnProfileName:                           '$(cdnProfileName)'
        deploymentLocation:                       '$(deploymentLocation)'
        armTemplateArtifactName:                  ${{ variables['armTemplateArtifactName'] }}
        storageAccountCSMFilePath:                '$(storageAccountCSMFilePath)'
        storageAccountCSMParametersFile:          '$(storageAccountCSMParametersFile)'
        deployCDN:                                '${{ variables.isProduction }}'
        cdnCSMFilePath:                           '$(cdnCSMFilePath)'
        cdnCSMParametersFile:                     '$(cdnCSMParametersFile)'

该模板如下所示:

# Parameters
# ---------
parameters:
- name: environment
  type: string
- name: serviceConnection
  type: string
- name: subscriptionId
  type: string
- name: resourceGroup
  type: string
- name: storageAccountName
  type: string
- name: cdnEndpointName
  type: string
- name: cdnProfileName
  type: string
- name: deploymentLocation
  type: string
- name: armTemplateArtifactName
  type: string
- name: storageAccountCSMFilePath
  type: string
- name: storageAccountCSMParametersFile
  type: string
- name: deployCDN
  type: boolean
  default: false
- name: cdnCSMFilePath
  type: string
- name: cdnCSMParametersFile
  type: string
- name: overrideParameterFile
  type: boolean
  default: true


# Jobs
# ---------
jobs:

# Job - Deploy SPA ARM Template
# ---------
- #deployment: '${{ parameters.armTemplateArtifactName }}'
  deployment: armTemplates
  variables:
    storageAccountNameCalculated: ''
    cdnEndpointNameCalculated: ''
  displayName: Deploy SPA ARM Template
  environment: ${{ parameters.environment }}
  workspace:
    clean: all
  strategy:
    runOnce:
      deploy:
        steps:  

        # Bash - Show Input Parameter Variables
        # ---------
          - bash: |
              echo ''
              echo '===== Deploy SPA ARM Template Input Variables ====='
              echo ''
              echo '    ===== Parameters ====='
              echo '    environment:                      ${{ parameters.environment }}'
              echo '    serviceConnection:                ${{ parameters.serviceConnection }}'
              echo '    subscriptionId:                   ${{ parameters.subscriptionId }}'
              echo '    resourceGroup:                    ${{ parameters.resourceGroup }}'
              echo '    storageAccountName:               ${{ parameters.storageAccountName }}'
              echo '    cdnEndpointName:                  ${{ parameters.cdnEndpointName }}'
              echo '    cdnProfileName:                   ${{ parameters.cdnProfileName }}'
              echo '    deploymentLocation:               ${{ parameters.deploymentLocation }}'
              echo '    armTemplateArtifactName:          ${{ parameters.armTemplateArtifactName }}'
              echo '    storageAccountCSMFilePath:        ${{ parameters.storageAccountCSMFilePath }}'
              echo '    storageAccountCSMParametersFile:  ${{ parameters.storageAccountCSMParametersFile }}'
              echo '    deployCDN:                        ${{ parameters.deployCDN }}'
              echo '    cdnCSMFilePath:                   ${{ parameters.cdnCSMFilePath }}'
              echo '    cdnCSMParametersFile:             ${{ parameters.cdnCSMParametersFile }}'
              echo ''
            displayName: Debug - Input Parameters

        # Task - Deploy Storage Account ARM Template
        # ---------
          - task: AzureResourceManagerTemplateDeployment@3
            displayName: Deploy Storage Account ARM Template
            inputs:
              deploymentScope: 'Resource Group'
              azureResourceManagerConnection: '${{ parameters.serviceConnection }}'
              subscriptionId: '${{ parameters.subscriptionId }}'
              action: 'Create Or Update Resource Group'
              resourceGroupName: '${{ parameters.resourceGroup }}'
              location: '${{ parameters.deploymentLocation }}'
              templateLocation: 'Linked artifact'
              csmFile: '$(Pipeline.Workspace)\${{ parameters.armTemplateArtifactName }}\${{ parameters.storageAccountCSMFilePath }}'
              csmParametersFile: '$(Pipeline.Workspace)\${{ parameters.armTemplateArtifactName }}\${{ parameters.storageAccountCSMParametersFile }}'
              deploymentMode: 'Incremental'
              deploymentName: 'storageAccountDeployment'
              deploymentOutputs: 'storageAccountDeploymentOutput'
              ${{ if eq(parameters.overrideParameterFile, 'true') }}:
                overrideParameters: '-formatNames true -environment ${{ parameters.environment }} -storageAccountName ${{ parameters.storageAccountName }}'

        # Task - Retrieve Output Variable
        #----------
          - task: AzurePowerShell@5
            displayName: Retrieve Output Variables
            name: retrieveStorageAccountDeploymentOutput
            condition: succeeded()
            inputs:
               azureSubscription: '${{ parameters.serviceConnection }}'
               scriptType: 'inlineScript'
               azurePowerShellVersion: 'LatestVersion'
               inline: |
                 $armOutput = '$(storageAccountDeploymentOutput)' | ConvertFrom-Json
                 Write-Output "##vso[task.setvariable variable=storageAccountNameCalculated;]$($armOutput.storageAccountName.value)"

          - script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
            name: setvarStep

          - script: echo $(setvarStep.myOutputVar)
            name: echovar

        # Task - Add Static Hosting to Storage Account
        # ---------
          - task: AzurePowerShell@5
            displayName: Add Static Hosting to Storage Account
            condition: succeeded()
            inputs:
              azureSubscription: '${{ parameters.serviceConnection }}'
              scriptType: 'inlineScript'
              azurePowerShellVersion: latestVersion
              inline: |           
                $StorageAccount = Get-AzStorageAccount -Name $(storageAccountNameCalculated) -ResourceGroupName '${{ parameters.resourceGroup }}'
                Enable-AzStorageStaticWebsite -Context $StorageAccount.Context -IndexDocument index.html -ErrorDocument404Path index.html

        # Task - Deploy CDN ARM Template
        # ---------
          - task: AzureResourceManagerTemplateDeployment@3
            displayName: Deploy CDN ARM Template
            condition: and(succeeded(), eq(${{ parameters.deployCDN }}, 'true'))
            inputs:
              deploymentScope: 'Resource Group'
              azureResourceManagerConnection: '${{ parameters.serviceConnection }}'
              subscriptionId: '${{ parameters.subscriptionId }}'
              action: 'Create Or Update Resource Group'
              resourceGroupName: '${{ parameters.resourceGroup }}'
              location: '${{ parameters.deploymentLocation }}'
              templateLocation: 'Linked artifact'
              csmFile: '$(Pipeline.Workspace)\${{ parameters.armTemplateArtifactName }}\${{ parameters.cdnCSMFilePath }}'
              csmParametersFile: '$(Pipeline.Workspace)\${{ parameters.armTemplateArtifactName }}\${{ parameters.cdnCSMParametersFile }}'
              deploymentMode: 'Incremental'
              deploymentName: 'cdnDeployment'
              deploymentOutputs: 'CDNDeployOutput'
              ${{ if eq(parameters.overrideParameterFile, 'true') }}:
                overrideParameters: '-formatNames true -environment ${{ parameters.environment }} -cdnEndpointName ${{ parameters.cdnEndpointName }} -cdnProfileName ${{ parameters.cdnProfileName }} -storageAccountPrimaryEndpoint -storageAccountPrimaryEndpoint $storageAccountNameCalculated.z13.web.core.windows.net'

        # Task - Retrieve Output Variable
        #----------
          - task: AzurePowerShell@5
            displayName: Retrieve Output Variables
            condition: and(succeeded(), eq(${{ parameters.deployCDN }}, 'true'))
            inputs:
               azureSubscription: '${{ parameters.serviceConnection }}'
               scriptType: 'inlineScript'
               azurePowerShellVersion: 'LatestVersion'
               inline: |
                 $armOutput = '$(CDNDeployOutput)' | ConvertFrom-Json
                 Write-Output "##vso[task.setvariable variable=cdnEndpointNameCalculated;isOutput=true]$($armOutput.cdnEndpointName)" 

        # Bash - Show Output Parameter Variables
        # ---------
          - bash: |
              echo ''
              echo '===== Deploy SPA ARM Template Output Variables ====='
              echo ''
              echo '    ===== Parameters ====='
              echo '    storageAccountNameCalculated:               $(storageAccountNameCalculated)'
              echo '    cdnEndpointName:                            $(cdnEndpointNameCalculated)'
              echo ''
            displayName: Debug - Output Parameters

我在哪里使用这两行


          - script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
            name: setvarStep

          - script: echo $(setvarStep.myOutputVar)
            name: echovar

尝试隔离一种方法,我可以创建一个可以在我的主 yaml 文件中使用的变量。当我查看日志时,第二个回声成功地回显了变量,所以我知道该部分至少有效。一旦运行,回到我的主 yaml 文件中,我称之为。

    - job: job_deploy_code
      displayName: Deploy Some Code
      dependsOn: armTemplates
      variables: 
        myVarFromDeploymentJob: $[ dependencies.armTemplates.outputs['deploy_Development.setvarStep.myOutputVar'] ]
      steps: 
        - script: "echo $(myVarFromDeploymentJob)"
          name: echovar

这只是应该回显我的变量中的内容。现在它是空白的。我知道这是我没有看到的一些愚蠢的语法,但我一生都无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:0)

我用正确的语法解决了这个问题

    - job: job_deploy_code
      displayName: Deploy Some Code
      dependsOn: armTemplates
      variables: 
        myVarFromDeploymentJob: $[ dependencies.armTemplates.outputs['armTemplates.setvarStep.myOutputVar'] ]