Azure Pipelines provides a quick, easy, and safe way to automate building your projects with consistent and quality code that’s readily available to users.

Use Azure Pipelines to support the following scenarios:

  • Works with any language or platform
  • Deploys to different types of targets at the same time
  • Integrates with Azure deployments
  • Builds on Windows, Linux, or Mac machines
  • Integrates with GitHub
  • Works with open-source projects

If you use public projects, Azure Pipelines is free. For more information, see What is a public project? If you use private projects, you can run up to 1,800 minutes (30 hours) of pipeline jobs for free every month.

Create an Account in Azure DevOps Port
You can start it for fee, and also it is option you can start free with Github, strongly suggested to start free with Github.
Create your organization:

Create your first project:

First Azure Pipeline

When you define a pipeline, you can define it as a collection of jobs. When a pipeline runs, you can run multiple jobs as part of that pipeline. Each running job consumes a parallel job that runs on an agent. When there aren’t enough parallel jobs available for your organization, the jobs are queued up and run one after the other.

In Azure Pipelines, you can run parallel jobs on Microsoft-hosted infrastructure or your own (self-hosted) infrastructure. Each parallel job allows you to run a single job at a time in your organization. You don’t need to pay for parallel jobs if you’re using an on-premises server. The concept of parallel jobs only applies to Azure DevOps Services.

For Microsoft hosted parallel jobs,
Number of parallel jobs Time limit
Public project Up to 10 free Microsoft-hosted parallel jobs that can run for up to 360 minutes (6 hours) each time No overall time limit per month
Private project One free job that can run for up to 60 minutes each time 1,800 minutes (30 hours) per month

Create your first Azure Pipeline

1 Fork to your Github account

2 Create new pipeline from your DevOps project (

For example, in my case, I have created a new organization 51sec, and a new project Test.

3 Select GitHub (YAML) to the next step

Choose the forked repository (JohnnyNetsec/pipelines-java) to get YAML file

4 Review and Run your pipeline

Note: regarding Build & deploy to Java web app, check this url:

For Yaml Editor, check YAML pipeline editor
For example, we can change trigger to none as following format, which will make run compeletely manual:
  • trigger: none

4 You will get a failed errors for the Run:

Error message:

##[error]No hosted parallelism has been purchased or granted. To request a free parallelism grant, please fill out the following form

5 Request free Azure DevOps Parallelism from

If your project is public, you will need to provide a valid reason and a bit more information to support your request.

6 Once you got an approval, you can run your pipeline again. This time it will be successful. 

7 Check the result

In this example, there is 1 artifact produced which we can find out from job details

You will be also able to see the test runs with test resultes from Runs page. 

Once you downloaded this artifact and unzip it to a folder. You can open index.html file to view the content of “Hello world sample web app”:

Examples of YAML file


# Maven
# Build your Java project and run tests with Apache Maven.
# Add steps that analyze code, save build artifacts, deploy, and more:
– main
      imageName: “ubuntu-latest”
      jdkVersion: “1.10”
      imageName: “windows-latest”
      jdkVersion: “1.11”
  maxParallel: 2
  vmImage: $(imageName)

– task: Maven@3
    mavenPomFile: ‘pom.xml’
    mavenOptions: ‘-Xmx3072m’
    javaHomeOption: ‘JDKVersion’
    jdkVersionOption: ‘1.8’
    jdkArchitectureOption: ‘x64’
    publishJUnitResults: true
    testResultsFiles: ‘**/surefire-reports/TEST-*.xml’
    goals: ‘package’
– task: PublishCodeCoverageResults@1
    codeCoverageTool: “JaCoCo”
    summaryFileLocation: “$(System.DefaultWorkingDirectory)/**/site/jacoco/jacoco.xml”
    reportDirectory: “$(System.DefaultWorkingDirectory)/**/site/jacoco”
    failIfCoverageEmpty: true

Code from “Customize your pipeline” page:

YAML pipelines don’t have a Create work item on failure setting like classic build pipelines. Classic build pipelines are single stage, and Create work item on failure applies to the whole pipeline. YAML pipelines can be multi-stage, and a pipeline level setting may not be appropriate. To implement Create work item on failure in a YAML pipeline, you can use methods such as the Work Items – Create REST API call or the Azure DevOps CLI az boards work-item create command at the desired point in your pipeline.

The following example has two jobs. The first job represents the work of the pipeline, but if it fails, the second job runs, and creates a bug in the same project as the pipeline.

# When manually running the pipeline, you can select whether it
# succeeds or fails.
– name: succeed
  displayName: Succeed or fail
  type: boolean
  default: false
– main
  vmImage: ubuntu-latest
– job: Work
  – script: echo Hello, world!
    displayName: ‘Run a one-line script’
  # This malformed command causes the job to fail
  # Only run this command if the succeed variable is set to false
  – script: git clone malformed input
    condition: eq(${{ parameters.succeed }}, false)
# This job creates a work item, and only runs if the previous job failed
– job: ErrorHandler
  dependsOn: Work
  condition: failed()
  – bash: |
      az boards work-item create \
        –title “Build $(build.buildNumber) failed” \
        –type bug \
        –org $(System.TeamFoundationCollectionUri) \
        –project $(System.TeamProject)
      AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
    displayName: ‘Create work item on failure’

By netsec

Leave a Reply