0

I have a CI/CD pipeline for a solution with several projects. I check the changes and only build the projects which have been changed, as opposed of building all of them. I accomplish this using a condition at the build stage of each project. This is the relevant part:

  - stage: S_BuildChannelUpdate
    dependsOn: 'PreSteps'
    jobs:
    - job: 'BuildChannelUpdate'
      variables:
        BuildCondition: $[ stageDependencies.PreSteps.Check_changes.outputs['pwsh_script.BuildChannelUpdate'] ]
      condition: eq(variables['BuildCondition'], True)

This works as I expect, the build steps are only executed if the conditions are met. So far so good. For the deployment part, I want to do it only if there is something new to be deployed. I.e. project was changed and the build was successful. Again, here is the relevant part:

  - stage: 'S_ReleaseChannelUpdate'
    dependsOn:
      - PreSteps
      - S_BuildChannelUpdate
    jobs:
    - deployment: 'ReleaseChannelUpdate'
      variables:
        ReleaseCondition: $[ stageDependencies.PreSteps.Check_changes.outputs['pwsh_script.BuildChannelUpdate'] ]
      condition: eq(variables['ReleaseCondition'], True)
      environment: 'dev'
      strategy:
        runOnce:
          deploy:
            steps:

The problem here is that I want to set an approval for the releases and the pipeline asks me to approve it before evaluating the condition. I would like to get the approval request only if the ReleaseCondition is True. I was also expecting that since the stage S_BuildChannelUpdate was skipped (condition not met), the stage S_ReleaseChannelUpdate will consider its dependencies not met.

Any suggestions?

goosseno
  • 145
  • 2
  • 12
  • resource approvals are evaluated at stage level. Since your condition is set on job level, the approval is executed before the condition is evaluated. Have you tried setting the condition on the entire stage instead of the job? That might work. If that works, you could create a stage per part you want to release. – PaulVrugt Dec 19 '20 at 12:51

1 Answers1

1

The problem here is that I want to set an approval for the releases and the pipeline asks me to approve it before evaluating the condition. I would like to get the approval request only if the ReleaseCondition is True

For this issue, here agree with PaulVrugt. Approval is executed at the stage level. Azure Pipelines pauses the execution of a pipeline prior to each stage, and waits for all pending checks to be completed. If the condition is set at the job level, the condition will not be executed before the approval, so as a solution, we need to set the condition at the stage level.

For example:

- stage: 'S_ReleaseChannelUpdate'
    dependsOn:
      - PreSteps
      - S_BuildChannelUpdate
    condition: eq(variables['ReleaseCondition'], True)
    jobs:
    - deployment: 'ReleaseChannelUpdate'
      environment: 'dev'
      strategy:
        runOnce:
          deploy:
            steps:

With this definition, before executing approval, pipeline will first determine whether ReleaseCondition is True, if ReleaseCondition is False, then the stage will be skipped and do not check approval.

- stage: 'S_ReleaseChannelUpdate'
    dependsOn:
      - S_BuildChannelUpdate

For this, if stage S_BuildChannelUpdate was skipped (condition not met), the stage S_ReleaseChannelUpdate will also be skipped

Hugh Lin
  • 17,829
  • 2
  • 21
  • 25