title: Azure DevOps YAML If condition
body: <p>I am attempting to use the if condition to execute a block of operations but it doesn't seem to be working for me. I'm not entirely sure if I understand the if condition correctly, but this is how I have been using it - or at least a simplified version of it.</p>
  <pre class="lang-yaml prettyprint-override"><code># Starter pipeline
  # Start with a minimal pipeline that you can customize to build and deploy your code.
  # Add steps that build, run tests, deploy, and more:
  # https://aka.ms/yaml
  
  name: MyTest-$(date:yyyyMMdd)$(rev:.r)
  
  trigger: none
  
  resources:
    - repo: self
      clean: false
      fetchDepth: 2
  
  variables:
    - group: TestVG
    - name: EnableSigning
      value: true
    - name: SignDebugBuilds
      value: false
  
  stages:
    - stage: Stage_Build
      displayName: Build Stage
      dependsOn: []
  
      jobs:
        - job: Job_Build
          displayName: Build Job
          condition: succeeded()
          dependsOn: []
          pool:
            vmImage: 'windows-latest'
          variables:
            BuildPlatform: AnyCPU
          strategy:
            matrix:
              Debug:
                BuildConfiguration: Debug
              Retail:
                BuildConfiguration: Retail
          steps:
            - template: param-test.yml
              parameters:
                Value: 'Build Solution 1'
            #- script: echo 'Build Solution 1'
            - ${{ if and(eq(variables['EnableSigning'], True), or(ne(variables['BuildConfiguration'], 'Debug'), eq(variables['SignDebugBuilds'], True))) }}:
              #- script: echo 'Build Solution 2 IF check'
              - template: param-test.yml
                parameters:
                  Value: 'Build Solution 2 IF check'
            - script: echo 'Build Solution 2 COND check'
              condition: and(eq(variables['EnableSigning'], True), or(ne(variables['BuildConfiguration'], 'Debug'), eq(variables['SignDebugBuilds'], True)))
  </code></pre>
  <p>The param-test.yml file is a simple file to echo a line for logging/debugging purposes.</p>
  <pre class="lang-yaml prettyprint-override"><code>parameters:
    Value: string
  
  steps:
    - script: echo '${{ parameters.Value }}'
  </code></pre>
  <p>My expectation was that for the debug build I would see the first log and the other 2 logs would get skipped, while all 3 logs would be printed for retail build.</p>
  <p>However, what I see is that for the debug build, the first and second logs are printed, while only the 3rd log is skipped (<em>the one with the explicit condition in the script step</em>), while all 3 logs are printed for retail build.</p>
  <p>To clarify a few items, I used the 3rd log as a control to check if the condition was correct or not. And this is a highly simplified version of the actual pipeline that I have in our repo. We have a primary pipeline YAML file where all the variables are declared including the EnableSigning and SignDebugBuilds. This calls a template file passing in the EnableSigning and SignDebugBuilds flags to the same. This happens a few times around with subtemplates, till one of the sub-templates, the one responsible for the build, uses these from the parameters in the if check. In the actual pipeline, I have the condition use parameters instead of variables, but the result is still the same.</p>
  <p>I have looked at a few documentation but it wasn't very clear as to what we could expect from the if statement. And since template tags don't support an explicit condition that we can pass in, this seems to be the only option aside from maintaining 2 separate versions of the template files corresponding to the flags</p>