DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Please enter at least three characters to search
Refcards Trend Reports
Events Video Library
Refcards
Trend Reports

Events

View Events Video Library

Zones

Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks

Last call! Secure your stack and shape the future! Help dev teams across the globe navigate their software supply chain security challenges.

Modernize your data layer. Learn how to design cloud-native database architectures to meet the evolving demands of AI and GenAI workloads.

Releasing software shouldn't be stressful or risky. Learn how to leverage progressive delivery techniques to ensure safer deployments.

Avoid machine learning mistakes and boost model performance! Discover key ML patterns, anti-patterns, data strategies, and more.

Related

  • Mulesoft Cloudhub Deployment using Azure DevOps
  • Passing JSON Variables in Azure Pipelines
  • Essential Guidelines for Building Optimized ETL Data Pipelines in the Cloud With Azure Data Factory
  • DevOps Nirvana: Mastering the Azure Pipeline To Unleash Agility

Trending

  • How to Submit a Post to DZone
  • A Complete Guide to Modern AI Developer Tools
  • Medallion Architecture: Why You Need It and How To Implement It With ClickHouse
  • Top Book Picks for Site Reliability Engineers
  1. DZone
  2. Testing, Deployment, and Maintenance
  3. Deployment
  4. How to Create Custom Azure Pipelines Build Agent Fully Automated

How to Create Custom Azure Pipelines Build Agent Fully Automated

You can improve the value stream maps by speeding up the build process. If your code is taking too long to build using Azure DevOps build agents, no worries. You can create your own build agent to speed it up!

By 
Alireza C user avatar
Alireza C
DZone Core CORE ·
May. 02, 21 · Tutorial
Likes (3)
Comment
Save
Tweet
Share
16.7K Views

Join the DZone community and get the full member experience.

Join For Free

Currently, most software teams that are using Azure DevOps to build their software choose to use Azure-hosted agents as their build server. This comes with a lot of benefits. Many libraries are already installed on these agents so it's quite compatible with most projects' specifications. For every build, you get a new agent that is provisioned and after the build will be destroyed. However, this has its own limitations. Azure Hosted Agents are using a specific type of VM so it is not possible to increase hardware specifications. If your projects also have libraries that are not supported by Azure Hosted agents, you need to install them on the agents. This might not be an issue for projects that have started in recent years, but if you have a legacy code that takes an hour to build then you might start to think about how you can speed up the build process. For such a situation, there are a lot of solutions like reconsidering the architecture of software and so on which is not the scope of this article. In this article, I am going to focus on how you can create a custom self-hosted agent.


Custom Self Hosted Agent

With Azure DevOps, it is possible to create an agent pool and add our own agents. These agents can be your personal laptop, on-premise server, or virtual machine. What we want to do in this tutorial is to see how we can create a fully automated process in which we create a custom Windows image. This gives us the benefit of having an image containing all the applications and settings we need. Additionally, we can provision a virtual machine using this image with desired hardware specifications.


Automated Solution Design Process


Design Problem

With this solution, I want to create custom build agents in Azure DevOps. This means I want to change the base windows server and add extra applications, settings, etc. Then create a virtual machine using a new image. I would like to make this solution scalable and at the same time keep the maintainability. 


Solution in detail 

I divided this process into two parts which are creating an image and deploying a virtual scale set. let's takes look into these parts in detail.

Image creation

One way to create a custom image is to use Packer. Packer is a tool that takes a template and compiles it to create a new image. You configure the environment in which Packer will compile your image and also the scripts you want to run on your base image to create your custom image. When we see that we can run a script, it makes our lives so much easier. You might already be familiar with Chocolatey. If not, I highly recommend you to try it. It's a package manager which you can use to install applications and libraries very fast. I used Chocolatey as my solution to add extra applications to my Windows Image. Image compilation takes time and this process

Virtual Machine Scale set Creation

Once the image is ready, you can use it to create a virtual machine but I would like to create several build agents. Additionally, I want to be able to scale up or scale down servers without so much effort. This is why I used the virtual machine scale set in which I defined my desired configurations for virtual machines and then the scale set will take care of the orchestration of virtual machines. You can easily scale up or down virtual machines by defining your desired capacity in the Virtual Machine Scale set policy. 

Orchestration Pipeline

In this solution, we have one pipeline in which we trigger the entire process. This contains three steps to build an agent image, deploy virtual machine scale sets and deploy azure DevOps agents on VM's. This could also be done in two steps, but to make it more clear and understandable for everyone,  I decided to separate the agent deployment to avoid complexity and confusion. 


How to test the solution

This project has been tested many times and you can be sure by following the guidelines to get the same results. Except for the source code provided here, you only need to have an Azure subscription and also provide value for variables in the pipeline. 


Step 1: Clone this solution from GitHub 

The full source of the project is available on the Azure DevOps git repository here. You can browse it and clone it from here.

https://github.com/CodingAsCreating/azure-pipelines-agent-builder


Step2: Create variable group and add value

There are variables that should be filled in the variables group. So create a variable group and add these variables. 


You need to create an Azure service principal which you can do by running this Azure command:

PowerShell
 




x


 
1
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/{Your Azure Subscription ID}"


After running this command, you will get something similar to this:

PowerShell
 




xxxxxxxxxx
1


 
1
{
2
  "appId": "d63c34e0-da9c-4dcf-b6f7-1324215d1362",
3
  "displayName": "azure-cli-2021-05-02-22-59-07",
4
  "name": "http://azure-cli-2021-05-02-22-59-07",
5
  "password": "DMwHf_Wij~Saws3YJ-L99hw.ms9rRa~Hpr",
6
  "tenant": "8ed60318-e8cd-444b-924b-fa314c6f4099"
7
}


Now, you can place these values for the variables we have. Just to help you a bit to avoid confusion about the variable names:

appId= ClientId

password=ClientSecret

You also need to create an Azure DevOps personal access token which we call PAT. To do that, you can right-click on

Then click on New Token to start creating a token


Then go to a page where you can configure your personal tokens. For the scope, select Agent Pools (read, manage) and make sure all the other boxes are cleared.  

Now you can fill the values in variables. You can fill the AzureDevOpsToken with your token and AzureDevOpsURL with your Azure DevOps organization URL which should be something similar to http://dev.azure.com/{your Organization name }


Step 3: Add pipeline 

The next step is to create a new YAML pipeline and choose an existing option to add the pipeline from the repository.




Then Save your pipeline. For the next step, you need to assign your variable group to this pipeline.

So when you click on "Link Variable Group", you should be able to see the variable group list and link to the one you defined earlier. 

Step4: Define a new pool

You have to create an agent pool in Azure DevOps. Open the agent pools from the project settings menu and create a new agent pool. You need to choose "self-hosted" for the pool type and tick the checkbox to grant access to pipelines. 

Don't forget to replace the value of the variable for the AgentPoolName in the variable group.

Step4: Run the pipeline

Now everything is ready to run the pipeline. You can run the pipeline and watch the process!

This process should take around 30 min to complete using Azure hosted agents. You might face some issues and probably, it will be the variables. So make sure you define all variables correctly and check the spelling as well. 


Step5: Check results 

If everything goes well, you should be able to see the agents in your agent pool. I configured to have one agent to save cost during my test so if you want more, you can change it in the script.

Step6: Cleanup 

In order to clean up the resources, you can use the pipeline which is provided in the repository. You need to repeat steps 2 and 3 for this pipeline. So you create a new pipeline and then select the existing pipeline to add the cleanup pipeline from the repo. Then you need to link the variable group to this pipeline same as what you did for the previous pipeline. If you run the pipeline, you should get something like this. This solution will remove all the resources that are being created by this solution.

Contribute to this project

If you have any ideas to make this solution better, feel free to bring your ideas. You can make a pull request on the repo. I am excited to hear from you and your experiences with build agents. 

 

Pipeline (software) azure Build (game engine) Virtual Machine

Opinions expressed by DZone contributors are their own.

Related

  • Mulesoft Cloudhub Deployment using Azure DevOps
  • Passing JSON Variables in Azure Pipelines
  • Essential Guidelines for Building Optimized ETL Data Pipelines in the Cloud With Azure Data Factory
  • DevOps Nirvana: Mastering the Azure Pipeline To Unleash Agility

Partner Resources

×

Comments
Oops! Something Went Wrong

The likes didn't load as expected. Please refresh the page and try again.

ABOUT US

  • About DZone
  • Support and feedback
  • Community research
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Core Program
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 3343 Perimeter Hill Drive
  • Suite 100
  • Nashville, TN 37211
  • support@dzone.com

Let's be friends:

Likes
There are no likes...yet! 👀
Be the first to like this post!
It looks like you're not logged in.
Sign in to see who liked this post!