Azure DevOps best practices – jobs and stages

Azure DevOps stages and jobs on build pipelines could save you a lot of minutes when you deal with more complex setups and heavy projects. In this article I will analyze how you can use jobs and stages to maximize performance and parallelism.

Lets take the starter pipeline example on Azure DevOps (code below). Although this is perfect for a single task scenario, it will execute tasks on a row without parallelism. The output of this pipeline will be two printed messages on your debug window.

- main

  vmImage: ubuntu-latest

- script: echo Hello, world!
  displayName: 'Run a one-line script'

- script: |
    echo Add other tasks to build, test, and deploy your project.
    echo See
  displayName: 'Run a multi-line script'

The two tasks that are included (script task) are located under steps. Those steps are part of a job that is not present as it is the only one.

The hierarchy of a pipeline can include the below: Stages -> Jobs -> Steps -> Tasks

On the starter pipeline two tasks are included under steps that belong on a single job. Jobs big advantage is that they can run in parallel. Take for example a big pipeline that includes a lot of jobs 30 and more. It would be time killing to wait all these jobs execute one by one. Keep in mind that one job can also fail and you will have to start the process again.

If you have a single job and all tasks are included on it, you have to use continueOnError if you do not want to stop the pipeline on a task failure.

The below example shows two jobs that can be executed on parallel based on your Azure DevOps configuration (this may include more costs on your subscription). As you can see the failure of the first job will not affect the second job that will be executed. If you are also eligible for parallel jobs, these can run simultaneously if you do not have constraints between them.

  vmImage: ubuntu-latest

trigger: none
pr: none  

  - job:
    displayName: Install npm and yarn tools 
      - task: Npm@1
        displayName: Install npm
          command: 'install'
          workingDir: '$(Pipeline.Workspace)/s'

      - task: PowerShell@2
        displayName: Install yarn
          targetType: 'inline'
          script: |
            npm install -g yarn

  - job:
    displayName: build code and publish artifact

      - task: PowerShell@2
        displayName: build code
          targetType: 'inline'
          script: |
            Write-Host "this task will be executed"
      - task: PowerShell@2
        displayName: this task will fail
          targetType: 'inline'
          script: |

Lets now examine the power of stages. The stage includes multiple jobs as you can see from the example below. A typical production environment will include stages for QA -> DEV -> Production deployments.

This approach big advantage is that you can rerun failed jobs separately and also rerun the whole stage in separation from each other. As a typical build pipeline may take a lot of minutes to complete by using stages you do not have to rerun the whole pipeline on a task failure.

- none

  vmImage: ubuntu-latest

- stage: BuildApp
  displayName: Build Apps
  - job: BuildFrontendApp
    displayName: Build Frontend App
    - script: echo building frontend app
      displayName: build frontend app
    - script: echo running unit tests for frontend app
      displayName: unit tests frontend

  - job: BuildBackendApp
    displayName: Build Backend App
    - script: echo building backend app
      displayName: build backend app
    - script: echo running unit tests for backend app
      displayName: unit tests backend

- stage: DeployDev
  displayName: Deploy to DEV environment 
  - job: DeployFrontendDev
    displayName: Deploy frontend to DEV
    - checkout: none
    - script: echo deploying frontend app to DEV
      displayName: deploy frontend app to DEV

  - job: DeployBackendDev
    displayName: Deploy backend to DEV
    - checkout: none
    - script: echo deploying backend app to DEV
      displayName: deploy backend app to DEV

- stage: DeployProd
  displayName: Deploy to PROD environment
  - job: Failjob
    displayName: Running this job will fail
    - checkout: none
    - script: kati
      displayName: deploy frontend app to PROD

  - job: DeployBackendProd
    displayName: Deploy backend to PROD
    - checkout: none
    - script: echo deploying backend app to PROD
      displayName: deploy backend app to PROD

Video tutorial on YouTube:

Cannot change boot order VMware – items cannot be modified in user mode

Recently I had a problem changing the boot order on a Windows VM hosted on vSphere 6.7 with BIOS configured as boot software.

When I tried to change the boot order I could locate the message:

All items on this menu cannot be modified in user mode. If any items require changes, please consult your system Supervisor.

As a result I could not boot from the CD device. This happens because the boot order is defined on the .vmx file of the virtual machine. In more detail the bios.bootOrder attribute should be changed accordingly.

Download and edit .vmx. You should add cdrom as the first option.

Rename the existing .vmx for backup purposes

Force a BIOS boot on setup screen

Upload the .vmx file on VM datastore folder.

Then the boot will be performed from CD as expected.

How to install Windows 10 Technical Preview on Microsoft Hyper V (Windows 8.1 pro)

Here are the steps that you need to follow in order to install Windows 10 tech preview on Microsoft Hyper-V.

First of all go and download the .iso from

  1. Run hyper-v and click New -> Virtual Machine start-step
  2. Press next step1
  3. Give a name for the new virtual machine 
  4. Click Generation 1step3
  5. Provide ram size (suggest: 2 GB and more)step4
  6. Choose Not Connected for now.We will change that laterstep5
  7. Give your hard disk a size. You can store your virtual hard disc anywhere you want.You can also select one that already exists.step6
  8. Choose the bootable iso that you have downloaded from the windows insider pagestep7
  9. Press finishstep8
  10. Go to virtual switch managerstart-step
  11. New virtual network switch -> External
  12. Choose your network adapter and give virtual switch a namestep11
  13. Then select Settings -> Network Adapter -> and choose that you created on the previous stepstep12
  14. You are ready to rock!windows10-screenshot