我有一种情况,我需要在两个管道之间传递一个变量,并在编译时在目标管道上对该变量进行评估。
我有一个可以构建的管道
由于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
答案 0 :(得分:0)
我进一步检查了您的问题,如果您希望部署管道在触发器期间获取发送给它的信息,则这些变量仅在运行时可用。您可以尝试使用pipeline run rest api传递变量。
您可以检查以下步骤:
1。在管道中定义Runtime parameters,以保存传递的变量。见下文:
parameters:
-name: contentKey
displayName: Pool Image
default: contentDefaultValue
见下文:
{
"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 }}