【问题标题】:Azure Devops Yaml using Dynamic "each" conditionAzure Devops Yaml 使用动态“每个”条件
【发布时间】:2023-02-11 00:36:32
【问题描述】:

如何在“Approval_Test”阶段执行以下代码中的条件部分?我必须动态生成条件,由于某些要求不能对其进行硬编码。舞台也将根据参数param动态生成。

“批准测试”阶段只能在所有解决方案 1、2 和 3 完成和/或跳过后运行

#azure-pipeline.yml

trigger: none

#Package Parameter
parameters:
  - name: "params"
    type: object
    default:
      Solution1:
        name: "Solution1"
      Solution2:
        name: "Solution2"
      Solution3:
        name: "Solution3"


stages:
  - ${{ each param in parameters.params }}:
      - stage: Deploy_dev_${{ param.value.name }}
        jobs:
          - template: deploy-dev.yml
              
  - stage: Approval_Test
    dependsOn:
      - ${{ each param2 in parameters.params }}:
        - Deploy_dev_${{ param2.value.name }}
    condition: |
      #The "each" below would not work and throw errors.
      and
      (
        - ${{ each param2 in parameters.params }}:
        in(dependencies.Deploy_dev_${{ param2.value.name }}.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),\
      )
    jobs:
    - deployment: Approval
      environment: 'sandbox'
    

【问题讨论】:

    标签: azure-devops yaml azure-pipelines azure-pipelines-yaml


    【解决方案1】:

    这是一个棘手的难题,我无法使用 each 关键字解决它,但请让我提出一个可行的替代方案。

    替代解决方案:作业状态检查功能

    如果您不要求也跳过阶段,解决方案将添加 condition: succeeded()stage: Approval_Test

    但这不适用于跳过的阶段。

    没有失败?

    不幸的是,job status functions 没有'Skipped'来检查,但是如果我们取 failed(), not(failed())! 的反义词怎么办?

    效果很好:

    #azure-pipeline.yml
    
    trigger: none
    
    #Package Parameter
    parameters:
      - name: "params"
        type: object
        default:
          Solution1:
            name: "Solution1"
          Solution2:
            name: "Solution2"
          Solution3:
            name: "Solution3"
    
    
    stages:
      - ${{ each param in parameters.params }}:
          - stage: Deploy_dev_${{ param.value.name }}
            jobs:
              - template: deploy-dev.yml
      - stage: skipped # test to simulate a skip from the template
        condition: failed()
        jobs:
          - job: concat      
            steps:
            - ${{ each parameter in parameters.params }}:
              - script: echo Deploy_dev_${{ parameter.value.name }}.result
    
      - stage: Approval_Test
        condition: not(failed())
        dependsOn:
          - skipped # test to simulate a skip from the template
          - ${{ each param2 in parameters.params }}:
            - Deploy_dev_${{ param2.value.name }}
    
        jobs:
        - deployment: Approval
          environment: 'sandbox'
    

    (不要)使用等价物

    根据 the docs failed() 等同于 eq(variables['Agent.JobStatus'], 'Failed')eq(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Skipped') 不是解决方案吗? 不!

    为什么我不明白,但在我使用 yaml(下)进行的测试(上)中,我不会飞。

    #azure-pipeline.yml
    
    trigger: none
    
    #Package Parameter
    parameters:
      - name: "params"
        type: object
        default:
          Solution1:
            name: "Solution1"
          Solution2:
            name: "Solution2"
          Solution3:
            name: "Solution3"
    
    stages:
      - ${{ each param in parameters.params }}:
          - stage: Deploy_dev_${{ param.value.name }}
            jobs:
              - template: deploy-dev.yml
      - stage: skipped # test to simulate a skip from the template
        condition: failed()
        jobs:
          - job: concat      
            steps:
            - ${{ each parameter in parameters.params }}:
              - script: echo Deploy_dev_${{ parameter.value.name }}.result
    
      - stage: Approval_Test
        condition: in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Skipped')
        dependsOn:
          - skipped # test to simulate a skip from the template
          - ${{ each param2 in parameters.params }}:
            - Deploy_dev_${{ param2.value.name }}
    
        jobs:
        - deployment: Approval
          environment: 'sandbox'
    

    结论

    如果not(failed()) 适合你,我建议你使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2020-08-26
      • 2022-12-13
      • 1970-01-01
      • 2021-09-04
      • 2021-03-25
      • 2019-11-13
      相关资源
      最近更新 更多