在Azure管道之间传递变量

时间:2020-11-08 18:33:32

标签: azure-devops azure-pipelines

我有一种情况,我需要在两个管道之间传递一个变量,并在编译时在目标管道上对该变量进行评估。

我有一个可以构建的管道

  1. 构建所有服务
  2. 仅构建其中一项服务

由于Azure Pipelines的限制,构建管道需要保持独立于部署管道。触发器批处理功能当前不支持运行新版本,除非第一个版本已100%完成管道。我们有人工批准,所以这是不行的。

我有一个部署管道,理想情况下应该支持使用参数传递“ AllServices”或用户要部署的单个服务的名称手动触发,并支持在自动构建过程中由资源管道触发。

我正在努力解决的问题是,部署管道如何在触发器期间获取发送给它的信息,或者可以将其设置为在编译时读取的地方?这些变量仅在运行时可用

resources.pipeline.<Alias>.projectName
resources.pipeline.<Alias>.projectID
resources.pipeline.<Alias>.pipelineName
resources.pipeline.<Alias>.pipelineID
resources.pipeline.<Alias>.runName
resources.pipeline.<Alias>.runID
resources.pipeline.<Alias>.runURI
resources.pipeline.<Alias>.sourceBranch
resources.pipeline.<Alias>.sourceCommit
resources.pipeline.<Alias>.sourceProvider
resources.pipeline.<Alias>.requestedFor
resources.pipeline.<Alias>.requestedForID

这里的编译时间与运行时间很重要,因为我使用的是$ {{}}:语法来控制将哪些参数注入到部署模板中。

resources:
  pipelines:
  - pipeline: services_build
    source: Services.Build
    trigger: true

name: Services-$(Date:yyyyMMdd).$(Rev:r)
trigger: none
pr: none

stages:
- template: ../templates/deploy_the_services.yaml
  parameters:
    ${{ if startsWith(resources.pipeline.services_build.pipelineName, 'AllServices') }}:
      services:
        - Service1
        - Service2
        - Service3
    ${{ if startsWith(resources.pipeline.services_build.pipelineName, 'Service1') }}:
      services:
        - Service1

deploy_the_services.yaml

parameters:
  - name: services
    type: object

stages:
  - stage: EnvironmentA
    displayName: 'Push to EnvironmentA'
    jobs:
    - template: ../templates/deploy.appservice.yaml
      parameters:
        environment: 'EnvironmentA'
        services: ${{ parameters.services }}
  
  ... # Many more stages after this

deploy.appservice.yaml

parameters:
- name: services
  type: object
- name: environment
  type: string

jobs:
# This is the important part.  This is an array of services to iterate over
- ${{ each service in parameters.services }}:
    - deployment:
      displayName: 'Deploy ${{ service.name }}'
      environment: '${{ parameters.environment }}'
      variables:
        - group: '${{ service.name }}'
        - group: '${{ parameters.environment }}-secrets'
      pool:
        vmImage: 'windows-2019'
      strategy:
        runOnce:
          deploy:
            steps:
            - powershell: |
                # Do the stuff and things

1 个答案:

答案 0 :(得分:0)

我进一步检查了您的问题,如果您希望部署管道在触发器期间获取发送给它的信息,则这些变量仅在运行时可用。您可以尝试使用pipeline run rest api传递变量。

您可以检查以下步骤:

1。在管道中定义Runtime parameters,以保存传递的变量。见下文:

parameters:
-name: contentKey
   displayName: Pool Image
   default: contentDefaultValue
  1. 然后,您可以使用powershell任务在管道中运行rest api,并在请求正文中提供templateParameters来覆盖管道中定义的运行时参数。

见下文:

 {
      "templateParameters":{
         "contentKey": "contentValue"
      }
    }

下面是我测试过的一个演示,您也可以参考此:

在yaml管道文件中。您可以如下定义参数:

parameters:
- name: contentKey
  displayName: pass variables
  default: variable1

yaml中的powershell任务如下:

- powershell: |
     $token = "PAT"
     $url="https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs?api-version=6.1-preview.1"
     $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
     $body = "{
        `"templateParameters`":{
        `"contentKey`": `"contentValue`"
        }
        }"
     $response3 = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $body -ContentType application/json

然后您可以在bash任务中访问参数,如下所示:

echo ${{ parameters.contentKey }}