'YAML stage dependsOn other stage but skipped

Stage is getting skipped eventhough all dependencies seems conditions are present.

Here are rquirements for a pipeline:

  • stage 'NextTest' should be run after stage 'FakeTests' completed
  • stage 'NextTest' should not depend on 'FakeTests' stage result (even if 'FakeTests' failed 'NextTest' should be run)
  • stage 'NextTest' should not run if 'ToSkip' stage failed
  • stage 'NextTest' should run if 'ToSkip' stage skipped.

Here is yaml:

stages:
- stage: ToSkip
  jobs:
  - job: Skip
    steps:
    - powershell: |
        Write-Host "Something"
- stage: FakeTests
  jobs:
  - job: PassTest
    steps:
    - powershell: |
        Write-Host "Test Passed"
  - job: FailTest
    steps:
    - powershell: |
        Write-Host "Test Failed"
        exit 1
- stage: NextTests
  dependsOn: 
  - FakeTests
  - ToSkip
  condition: | 
    and(
    in(stageDependencies.FakeTests.result, 'Succeeded', 'SucceededWithIssues', 'Skipped', 'Failed'),
    in(stageDependencies.ToSkip.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    )
  jobs:
  - job: NextPassTest
    steps:
    - powershell: |
        Write-Host "Test Passed"

This YAML is used as AzureDevOps pipeline. However if 'ToSkip' skipped and 'FakeTests' failed 'NextTest' are skipped as well. Why is that? And how to correct it? pipeline



Solution 1:[1]

By looking at the stageDependencies JSON structure, there's no key called 'result' under <STAGE_NAME>. you should refer results through

stageDependencies.<STAGE_NAME>.<JOB_NAME>.result

"stageDependencies": {
    "<STAGE_NAME>": {
        "<JOB_NAME>": {
            "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
            "outputs": {
                "stepName.variableName": "value"
            }
        },
        "...": {
            //another job
        }
    },
    "...": {
        //anotherstage
    }
}

Try this with your code

condition: | 
and(
in(stageDependencies.FakeTests.PassTest.result, 'Succeeded', 'SucceededWithIssues', 'Skipped', 'Failed'),
in(stageDependencies.FakeTests.FailTest.result, 'Succeeded', 'SucceededWithIssues', 'Skipped', 'Failed'),
in(stageDependencies.ToSkip.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)

For more information, you might want to checkout this page

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Shawn Chen