我有一个管道,可以清理、将虚拟机转换为镜像,并删除所有资源。我想使用相同的管道来删除虚拟机而不捕获镜像。我可以让所有阶段都有条件,但是当我最终没有任何阶段没有条件时。我一直看到这个问题的公认解决方案是使 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' 已定义。”
附注我查看了以下内容,它们暗示我这样做的方式是“正确”的方式:
- Azure pipeline - Stage condition dependson
- Azure Pipeline - Stage with Multiple depends on with if condition
根据下面的评论和答案,我尝试过:
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/