Immutable infrastructure CI/CD using Jenkins and Terraform on Azure

Log Analytics
Managed Disks
Virtual Machine Scale Sets

Solution ideas

This article is a solution idea. If you'd like us to expand the content with more information, such as potential use cases, alternative services, implementation considerations, or pricing guidance, let us know by providing GitHub feedback.

Azure is a world-class cloud for hosting virtual machines running Windows or Linux. Whether you use Java, Node.js, Go, or PHP to develop your applications, you'll need a continuous integration and continuous deployment (CI/CD) pipeline to push changes to these virtual machines automatically.

Potential use cases

Organizations utilize this solution for some of the benefits that include:

  • Changes in the application start with a software push to the Git code repository instead of logging into the server via SSH.
  • Simplified and reliable deployments.
  • Fault tolerance.
  • Resolve issues faster.
  • It takes the most advantage of the cloud, hence its legitimate DevOps functions.


Architectural diagram that shows immutable infrastructure CI/CD using Jenkins and Terraform on Azure.

Download a Visio file of this architecture.


  1. Change application source code.
  2. Commit code to GitHub.
  3. Continuous Integration Trigger to Jenkins.
  4. Jenkins triggers a Packer image build to create a VM and stores it as a VM image using Azure Managed Disks.
  5. Jenkins triggers Terraform to provision a new Virtual Machine Scale Set using the Azure Managed Disks VM image.
  6. Azure Log Analytics collects and analyzes logs.
  7. Monitor application and make improvements.


  • Managed Disks: Persistent, secured disk storage for Azure virtual machines.
  • Virtual Machine Scale Sets: Manage and scale up to thousands of Linux and Windows virtual machines.
  • Log Analytics: Collect, search, and visualize machine data from on-premises and cloud.
  • Visual Studio Code: Build and deploy multi-platform apps to get the most from Azure services.

Deploy this scenario

Next steps