Azure Pipeline YAML 取决于已定义

标签 azure azure-pipelines azure-pipelines-yaml

我有一个管道,可以清理、将虚拟机转换为镜像,并删除所有资源。我想使用相同的管道来删除虚拟机而不捕获镜像。我可以让所有阶段都有条件,但是当我最终没有任何阶段没有条件时。我一直看到这个问题的公认解决方案是使 dependentOn 有条件,如下所示。 deleteVM 参数是一个 bool 值。

Parameters:
- name: deleteVM
  displayName: "just delete it"
  type: boolean
  default: false
    
- stages:
  - stage: firstStage
    dependsOn: []
    condition: eq('${{ parameters.deleteVM }}', 'false')
    jobs:
    - job: deallocateVM

  - stage: secondStage
    ${{ if eq(parameters.deleteVM, 'false') }}:
      dependsOn: firstStage
    ${{ if eq(parameters.deleteVM, 'true') }}:
      dependsOn: []

问题是,当我执行此操作并尝试在第二个条件为 true 的情况下运行管道时,解析管道时会出错:“YAML:'dependsOn' 已定义。”

附注我查看了以下内容,它们暗示我这样做的方式是“正确”的方式:

根据下面的评论和答案,我尝试过:

Parameters:
- name: deleteVM
  displayName: "just delete it"
  type: boolean
  default: false
    
- stages:
  - stage: firstStage
    dependsOn: []
    condition: eq('${{ parameters.deleteVM }}', 'false')
    jobs:
    - job: deallocateVM

  - stage: secondStage
    ${{ if eq(parameters.deleteVM, 'false') }}:
      dependsOn: firstStage
    ${{ else }}:
      dependsOn: []

结果是“无法识别的值:'else'。表达式中位置 1 的位置:else。”

我尝试使用“不等于”:

Parameters:
- name: deleteVM
  displayName: "just delete it"
  type: boolean
  default: false
    
- stages:
  - stage: firstStage
    dependsOn: []
    condition: eq('${{ parameters.deleteVM }}', 'false')
    jobs:
    - job: deallocateVM

  - stage: secondStage
    ${{ if eq(parameters.deleteVM, 'false') }}:
      dependsOn: firstStage
    ${{ if ne(parameters.deleteVM, 'false') }}:
      dependsOn: []

结果是,无论我输入 true 或 false,或者在第一个位置的 dependentOn 中输入什么,当 deleteVM 为 true 时,它​​都会跳过此阶段(我认为它忽略此阶段)。

我还尝试创建一个变量,我很幸运:

Parameters:
- name: deleteVM
  displayName: "just delete it"
  type: boolean
  default: false

variables:
- ${{ if eq(parameters.deleteVM, 'false') }}:
  - name: dependency
    value: anActualStage
- ${{ if eq(parameters.deleteVM, 'false') }}:
  - name: dependency
    value: '[]'

- stages:
  - stage: firstStage
    dependsOn: []
    condition: eq('${{ parameters.deleteVM }}', 'false')
    jobs:
    - job: deallocateVM

  - stage:
    - stage: secondStage
      dependsOn: ${{ variables.dependency }}

结果是,这总是与我想要的相反。无论我将默认值设置为true还是false,当我设置deleteVM:true时,它都会显示“firstStage”作为依赖项,如果我设置deleteVM:false,它会显示NO DEPENDENCY。

我知道这是在编译时解释的,这在某种程度上是我正在寻找的行为,因为切换deleteVM复选框会在是否有依赖关系之间切换,但是,它总是错误的选择。如果我继续做我想要的相反的事情,我可以看到第二阶段运行没有任何依赖项(但我必须做出我想要的相反选择)。我宁愿不更新措辞,只是说与背景中实际发生的情况相反的内容,而且我对这在不同运行中保持一致没有什么信心,所以我不相信这一点足以合并我所拥有的供人们使用的内容.

正如有人在评论中提到的,我正在使用 Azure Stack Hub,它有非常过时的软件和硬件限制......

最佳答案

使用 if/else,而不是 2 个 if 语句。或者干脆完全省略 else,因为您将依赖项设置为空列表。

- stages:
  - stage: aStage
    ${{ if eq(parameters.deleteVM, 'false') }}:
      dependsOn: anActualStage
    ${{ else }}:
      dependsOn: []

  - stage: aStage
    ${{ if eq(parameters.deleteVM, 'false') }}:
      dependsOn: anActualStage

关于Azure Pipeline YAML 取决于已定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75406309/

相关文章:

ios - ASP.NET MVC Azure 应用程序 iOS 推送通知

azure-devops - 如何使 Azure DevOps 管道引用其所在的不同存储库?

azure-devops - lower() 函数在 Azure DevOps YAML 管道中似乎不起作用

javascript - 在 Azure 函数中检索设备孪生信息?

c# - 文档 DbChangeFeed 中的 MaxItemCount

azure-devops - 在 Azure DevOps 构建管道期间创建 json 文件

azure-pipelines - Id : . ...的任务定义的任务执行部分丢失或无效

amazon-web-services - 从 Azure Devops Pipeline 上传到 AWS s3 存储桶

Azure DevOps 条件字符串变量

azure - AzureAD 中使用 REST API 进行扩展和缩减的权限