有条件地设置环境Azure DevOps

问题描述 投票:0回答:3

我正在使用 Azure Pipeline,需要有条件地设置

environment
属性。我通过在正文中传递
Parameters
来从 REST API 调用中调用管道 (此处记录)。当我尝试在编译时访问该 parameter
 以有条件地设置环境时,尽管该变量为空(假设它在编译时不可访问?)

有人知道通过管道或 API 调用解决这个问题的好方法吗?

azure azure-devops continuous-integration yaml
3个回答
1
投票
这是 YAML 管道的一个常见混淆领域。需要使用不同的语法来访问运行时变量。

$[ variable ]


YAML 管道经历几个阶段。

  1. 编译 - 这是构成最终管道的所有 YAML 文档(模板等)被编译成单个文档的地方。使用 ${{}}
     语法的参数和变量的最终值将插入到文档中。
  2. Runtime - 使用 $[]
     语法插入运行时变量。
  3. 执行 - 最终管道由代理运行。
这是一个简化,微软的另一个解释更好一点:

    首先,展开模板并计算模板表达式。
  1. 接下来,评估阶段级别的依赖关系以选择要运行的第一个阶段。
  2. 对于选择运行的每个阶段,会发生两件事:
    • 收集并验证所有作业中使用的所有资源以授权运行。
    • 评估作业级别的依赖关系以选择第一个要运行的作业。
  3. 对于选择运行的每个作业,将多配置(策略:矩阵或策略:YAML 中的并行)扩展为多个运行时作业。
  4. 对于每个运行时作业,评估条件以确定该作业是否有资格运行。
  5. 为每个符合条件的运行时作业请求代理。
...

此顺序有助于回答一个常见问题:为什么我不能在模板参数中使用某些变量?第 1 步,模板扩展,仅对 YAML 文档的文本进行操作。该步骤中不存在运行时变量。在第 1 步之后,模板参数已被解析并且不再存在。

[参考:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/runs?view=azure-devops]


1
投票
经过一番挖掘,我找到了问题的答案,我希望这对将来的其他人有所帮助。

事实证明

Build

 REST API 确实支持可在编译时使用的模板参数,文档只是没有明确告诉您。 
Runs
 端点也支持这一点。

我的请求的有效负载最终看起来像:

{ "Parameters": "{\"Env\":\"QA\"}", "templateParameters": {"SkipApproval" : "Y"}, "Definition": { "Id": 123 }, "SourceBranch": "main" }
我的管道在编译时通过以下管道(缩写版本)消耗了这些更改

parameters: - name: SkipApproval default: '' type: string ... ${{if eq(parameters.SkipApproval, 'Y')}}: environment: NoApproval-All ${{if ne(parameters.SkipApproval, 'Y')}}: environment: digitalCloud-qa
    

0
投票
我将创建一个新阶段,用于保存具有需要批准的环境的部署,并通过 API 请求使用在上一阶段或您的案例中创建的变量为其设置条件。

在阶段开始之前、环境批准之前评估条件。

${{}} 表达式在编译时计算,不可能获取运行时创建/修改的变量的值。

trigger: none stages: - stage: setVariableStage dependsOn: [] jobs: - job: setVariableJob steps: - task: PowerShell@2 name: setVariableTask inputs: pwsh: true targetType: 'inline' script: | $enabledaux = [boolean]::Parse('True'); Write-Host "variable $enabledaux"; Write-Host "##vso[task.setvariable variable=shouldrun;isOutput=true]${enabledaux}" - stage: deploySomethingWithApproval dependsOn: setVariableStage variables: shouldrun: $[ stageDependencies.setVariableStage.setVariableJob.outputs['setVariableTask.shouldrun'] ] condition: eq(variables.shouldrun, 'True') jobs: - deployment: environment: environmentApproval # Contains the approval needed strategy: runOnce: deploy: steps: - task: PowerShell@2 inputs: pwsh: true targetType: 'inline' script: 'Do something' - stage: afterStage dependsOn: - deploySomethingWithApproval condition: in(dependencies.deploy.result, 'Succeeded', 'Skipped') jobs: - job: steps: - task: PowerShell@2 inputs: pwsh: true targetType: 'inline' script: "Do something"
    
© www.soinside.com 2019 - 2024. All rights reserved.