{"id":74644,"date":"2018-09-24T19:30:39","date_gmt":"2018-09-25T02:30:39","guid":{"rendered":"https:\/\/open.microsoft.com\/?p=73895"},"modified":"2025-03-03T16:54:12","modified_gmt":"2025-03-04T00:54:12","slug":"tutorial-devops-on-azure-using-jenkins-and-ansible","status":"publish","type":"post","link":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/","title":{"rendered":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible"},"content":{"rendered":"\n<p>Both <a href=\"http:\/\/www.ansible.com\/\">Ansible<\/a> and <a href=\"https:\/\/jenkins.io\/\">Jenkins<\/a> are powerful open source automation tools. Using Ansible, you can provision virtual machines, containers, network and complete cloud infrastructures on Azure. In addition, Ansible allows you to automate the deployment and configuration of resources in your environment. Jenkins provides hundreds of plugins to support building, deploying and automating any project, including a plugin for Ansible.<\/p>\n\n\n\n<p>With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure. Below is an example for a web app scenario. Jenkins is used to build and deploy, and Ansible is called to handle provisioning.<\/p>\n\n\n\n<p>In the following sections, we will walk though how to use Jenkins to call Ansible to provision a web app and then continuously build and deploy a Java Spring Boot application to Azure Web Apps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"build-your-jenkins-and-ansible-environment\">Build your Jenkins and Ansible environment<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"set-up-the-jenkins-host\">Set up the Jenkins host<\/h3>\n\n\n\n<p>It is easy to create a Jenkins server on an Azure Linux virtual machine from a&nbsp;solution template. You can learn more about this template from <a href=\"https:\/\/docs.microsoft.com\/azure\/jenkins\/install-jenkins-solution-template\">install-jenkins-solution-template<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"install-ansible-on-the-jenkins-host\">Install Ansible on the Jenkins host<\/h3>\n\n\n\n<p>When your Jenkins host is created, let us SSH to your Jenkins server and set up Ansible on it.<\/p>\n\n\n\n<p>## Install pre-requisite packages<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n$ sudo apt-get update\n$ sudo apt-get install -y libssl-dev libffi-dev python-dev python-pip\n<\/pre><\/div>\n\n\n<p>Install Ansible and Azure SDKs via pip<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n$ sudo pip install ansible[azure]==2.7.0rc2\n<\/pre><\/div>\n\n\n<p>or<\/p>\n\n\n\n<p>## Install Azure preview modules<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n$ sudo ansible-galaxy install Azure.azure_preview_modules\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n$ sudo pip install -r ~\/.ansible\/roles\/Azure.azure_preview_modules\/files\/requirements-azure.txt\n<\/pre><\/div>\n\n\n<p><em>Note: Ansible modules for Azure Web Apps are only available in Ansible 2.7. You could install Ansible 2.7 RC version here or install Azure role named azure_preview_modules which include latest modules.&nbsp;Ansible 2.7 will be released on Oct 4<sup>th<\/sup>. After that, you need not specify the version here because the default version will be 2.7.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"install-maven-for-a-sample-java-application\">Install Maven for a sample Java application<\/h3>\n\n\n\n<p>In this demo, we will directly use this Jenkins server to build our Java application. Here we also install Maven on it.<\/p>\n\n\n\n<p>## Install maven<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nsudo apt-get install -y maven\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"install-jenkins-plugin-for-ansible\">Install Jenkins plugin for Ansible<\/h2>\n\n\n\n<p>The following three plugins will be used for this web app scenario.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/plugins.jenkins.io\/azure-app-service\">azure-app-service<\/a>: A Jenkins plugin to deploy a web app.<\/li>\n\n\n\n<li><a href=\"https:\/\/plugins.jenkins.io\/ansible\">ansible<\/a>: &nbsp;This plugin allows to execute&nbsp;Ansible tasks as a job build step.<\/li>\n\n\n\n<li><a href=\"https:\/\/plugins.jenkins.io\/envinject\">envinject<\/a>: This plugin makes it possible to have an isolated environment for your jobs.<\/li>\n<\/ul>\n\n\n\n<p>Connect to your Jenkins server by following <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/jenkins\/install-jenkins-solution-template#connect-to-jenkins\">connect-to-jenkins<\/a>. After you unblock Jenkins, suggest you choose <b>&#8220;<\/b><strong>Install suggested plugins.&#8221;<\/strong>&nbsp;The Jenkins plugin for App Service will be installed here.<\/p>\n\n\n<figure class=\"wp-block-image alignleft size-medium is-resized\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-300x147.webp\" alt=\"Jenkins plugin screenshot\" class=\"wp-image-74281 webp-format\" style=\"width:200px\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-300x147.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-1024x503.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-768x377.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-330x162.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-800x393.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-400x197.webp 400w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1.webp 1050w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-1-300x147.webp\"><\/figure>\n\n\n\n<p>To install the other two plugins, click <b>&#8220;<\/b><strong>Manage Jenkins<b>&#8220;<\/b><\/strong> on the left bar and select <b>&#8220;<\/b><strong>Manage Plugins.&#8221;<\/strong>&nbsp;Select <b>&#8220;<\/b><strong>Available&#8221;<\/strong>&nbsp;tab, search and install <strong>Ansible<\/strong> plugin and <strong>Environment Injector<\/strong> plugin.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-1024x356.webp\" alt=\"Jenkins user interface\" class=\"wp-image-74278 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-1024x356.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-300x104.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-768x267.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-1536x535.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-330x115.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-800x278.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-400x139.webp 400w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3.webp 1819w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-plugin-3-1024x356.webp\"><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prepare-application-ansible-playbook-and-jenkinsfile\">Prepare Application, Ansible playbook, and Jenkinsfile<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"spring-boot-application-for-azure-web-apps\">Spring Boot application for Azure Web Apps<\/h3>\n\n\n\n<p>Here we forked a Spring Boot project from <a href=\"https:\/\/github.com\/spring-guides\/gs-spring-boot\">https:\/\/github.com\/spring-guides\/gs-spring-boot<\/a> to <a href=\"https:\/\/github.com\/VSChina\/gs-spring-boot\">https:\/\/github.com\/VSChina\/gs-spring-boot<\/a> for the following tutorial. On the branch named&#8221;<strong>war-based-deployment,&#8221;<\/strong>&nbsp;we updated the application.java and pom.xml to package this project as an executable war file, which can be directly deployed to Azure Web Apps with a Tomcat container by default.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ansible-playbook-to-provision-azure-web-apps\">Ansible playbook to provision Azure Web Apps<\/h3>\n\n\n\n<p>The below <a href=\"https:\/\/github.com\/VSChina\/gs-spring-boot\/blob\/war-based-deployment\/complete\/deploy\/ansible\/webapp.yml\">Ansible playbook<\/a> creates a resource group and a web app on App Service Linux with Java 8 with Tomcat container runtime.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n- name: Create Azure VM\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: \"{{ lookup('env', 'RES_GROUP') }}\"\n    webapp_name: \"{{ lookup('env', 'WEB_APP_NAME') }}\"\n    location: eastus\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n    - name: Create a linux web app with java framework\n      azure_rm_webapp:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ webapp_name }}\"\n        plan:\n          resource_group: \"{{ resource_group }}\"\n          name: myappplan\n          is_linux: true\n          sku: S1\n          number_of_workers: 1\n        frameworks:\n          - name: \"java\"\n            version: \"8\"\n            settings:\n              java_container: tomcat\n              java_container_version: 8.5\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"jenkinsfile\">Jenkinsfile<\/h3>\n\n\n\n<p>Below <a href=\"https:\/\/github.com\/VSChina\/gs-spring-boot\/blob\/war-based-deployment\/complete\/deploy\/jenkins\/jenkinsfile-ansible-webapp\">Jenkinsfile <\/a>defines 4 tasks as followings.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Check out source code<\/li>\n\n\n\n<li>Build<\/li>\n\n\n\n<li>Call Ansible to provision web app<\/li>\n\n\n\n<li>Deploy application to created web app<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nnode {\n  stage('Init') {\n    checkout scm\n  }\n\n  stage('Build') {\n    sh '''\n        cd complete\n        mvn clean package\n        mv target\/*.war ROOT.war\n    '''\n  }\n\n  stage('Deploy') {\n    withCredentials([azureServicePrincipal(credentialsId: env.AZURE_CRED_ID,\n                                    subscriptionIdVariable: 'AZURE_SUBSCRIPTION_ID',\n                                    clientIdVariable: 'AZURE_CLIENT_ID',\n                                    clientSecretVariable: 'AZURE_SECRET',\n                                    tenantIdVariable: 'AZURE_TENANT')]) {\n                                      \n      ansiblePlaybook installation: 'ansible',\n      playbook: 'complete\/deploy\/ansible\/webapp.yml'\n    }\n\n    azureWebAppPublish azureCredentialsId: env.AZURE_CRED_ID,\n                       resourceGroup: env.RES_GROUP, \n                       appName: env.WEB_APP_NAME, \n                       filePath: \"ROOT.war\"\n  }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"define-your-jenkins-pipeline\">Define your Jenkins pipeline<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"add-azure-service-principal-in-credentials\">Add Azure Service Principal in credentials<\/h3>\n\n\n\n<p>Authentication is required using Ansible modules to provision Azure resources. If you don\u2019t have Service Principal, <a href=\"https:\/\/docs.microsoft.com\/cli\/azure\/create-an-azure-service-principal-azure-cli?view=azure-cli-latest#create-the-service-principal\">create an Azure service principal<\/a>. Take note of the values for the <strong>subscription ID<\/strong>, <strong>Client ID<\/strong>, <strong>Secret<\/strong>, and <strong>Tenant ID<\/strong>.<\/p>\n\n\n\n<p>On Jenkins dashboard, click <strong>Credentials<\/strong>&nbsp;on the left bar and then <strong>System<\/strong>&nbsp;item. Then you will see <strong>Global Credentials<\/strong>&nbsp;on the page. Select it and click <strong>Add Credentials<\/strong>. As for kind, select <strong>Microsoft Azure Service Principal<\/strong>&nbsp;here and fill in <strong>subscription ID<\/strong>, <strong>Client ID<\/strong>, <strong>Secret<\/strong>, and <strong>Tenant ID<\/strong>.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-1024x560.webp\" alt=\"Jenkins user interface\" class=\"wp-image-74275 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-1024x560.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-300x164.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-768x420.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-1536x840.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2048x1120.webp 2048w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-330x180.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-800x437.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-400x219.webp 400w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-1024x560.webp\"><\/figure>\n\n\n\n<p><span style=\"float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; text-align: left; text-decoration: none; text-indent: 0px;\">After you click ok, you will see a new item is added. Copy the name (here it is <\/span>542d982a-7614-4a3d-ae6b-ce321bfef5b0<span style=\"float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; text-align: left; text-decoration: none; text-indent: 0px;\">) which is your <\/span><strong>&lt;azure-credentials-id&gt;<\/strong><span style=\"float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; text-align: left; text-decoration: none; text-indent: 0px;\">.<\/span><\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-1024x28.webp\" alt=\"Jenkins credential screenshot\" class=\"wp-image-74638 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-1024x28.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-300x8.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-768x21.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-1536x42.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-2048x56.webp 2048w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-330x9.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-800x22.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-400x11.webp 400w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-credential-2-1024x28.webp\"><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"create-a-jenkins-job\">Create a Jenkins job<\/h3>\n\n\n\n<p>Select <strong>New Item<\/strong>&nbsp;from the Jenkins console, then fill in your project and select <strong>Pipeline project<\/strong>,&nbsp;then select <strong>OK<\/strong>.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-1024x346.webp\" alt=\"Jenkins job user interface\" class=\"wp-image-74272 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-1024x346.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-300x101.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-768x260.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-1536x519.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-2048x692.webp 2048w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-330x112.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-800x270.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-400x135.webp 400w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-1-1024x346.webp\"><\/figure>\n\n\n\n<p>In General section, select <strong>Prepare an environment for the run<\/strong>.&nbsp;In the <strong>Properties Content<\/strong>, fill in following content.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nAZURE_CRED_ID=azure-credentials-id\nWEB_APP_NAME=web-app-name\nRES_GROUP=web-app-resource-group\nJENKINS_ADMIN=Jenkins-server-username\n<\/pre><\/div>\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-1024x407.webp\" alt=\"Jenkins job user interface general menu\" class=\"wp-image-74269 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-1024x407.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-300x119.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-768x305.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-1536x611.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-330x131.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-800x318.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-400x159.webp 400w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2.webp 1707w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-2-1024x407.webp\"><\/figure>\n\n\n\n<p>In Pipeline section, select <strong>Git<\/strong>&nbsp;for Source Control Management, fill in <span style=\"float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; text-align: left; text-decoration: none; text-indent: 0px;\">`<\/span><a href=\"https:\/\/github.com\/VSChina\/gs-spring-boot.git\">https:\/\/github.com\/VSChina\/gs-spring-boot.git<\/a><b>`<\/b> in <strong>Repository URL<\/strong>&nbsp;and change <strong>Branch Specifier<\/strong>&nbsp;to &#8220;<strong>*\/war-based-deployment<\/strong>&#8220;.&nbsp;As for <strong>Script Path<\/strong>, fill in &#8220;<strong>complete\/deploy\/jenkins\/jenkinsfile-ansible-webapp.&#8221;<\/strong><\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-1024x548.webp\" alt=\"Jenkins job user interface zoomed in\" class=\"wp-image-74266 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-1024x548.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-300x160.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-768x411.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-1536x822.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-2048x1096.webp 2048w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-330x177.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-800x428.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-400x214.webp 400w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/jenkins-job-3-1024x548.webp\"><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"launch-the-jenkins-job\">Launch the Jenkins Job<\/h3>\n\n\n\n<p>Now it is time to click <strong>Build Now<\/strong>. After the&nbsp;<span style=\"float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-height: 24px; text-align: left; text-decoration: none; text-indent: 0px;\">deployment is complete<\/span>, you can find your web app on the portal and you will see it at https:\/\/<strong>&lt;web-app-name&gt;<\/strong>.azurewebsites.net.<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-1024x336.webp\" alt=\"Output portal\" class=\"wp-image-74641 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-1024x336.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-300x99.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-768x252.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-1536x505.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-2048x673.webp 2048w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-330x108.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-800x263.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-400x131.webp 400w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-portal-1024x336.webp\"><\/figure>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-1024x168.webp\" alt=\"screenshot\" class=\"wp-image-74293 webp-format\" srcset=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-1024x168.webp 1024w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-300x49.webp 300w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-768x126.webp 768w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-1536x253.webp 1536w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-330x54.webp 330w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-800x132.webp 800w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-400x66.webp 400w, https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot.webp 1539w\" data-orig-src=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2018\/09\/output-springboot-1024x168.webp\"><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>In this tutorial we demonstrated a simple flow that automates web app provisioning and application deployment to Azure Web Apps. If you want to try more with the combination of Jenkins and Ansible, check out <a href=\"https:\/\/docs.microsoft.com\/azure\/ansible\/\">Ansible on Azure&nbsp;<\/a>and <a href=\"https:\/\/docs.microsoft.com\/azure\/jenkins\/\">Jenkins on Azure<\/a>.<\/p>\n\n\n\n<p>Questions? Let us know in the comments.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Both Ansible and Jenkins are powerful open source automation tools. Using Ansible, you can provision virtual machines, containers, network and complete cloud infrastructures on Azure. In addition, Ansible allows you to automate the deployment and configuration of resources in your environment.<\/p>\n","protected":false},"author":5562,"featured_media":95475,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"msxcm_post_with_no_image":false,"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","footnotes":""},"post_tag":[87,166,206],"content-type":[],"topic":[2240,2241,2244,2252],"programming-languages":[2259],"coauthors":[2338],"class_list":["post-74644","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-ansible","tag-azure","tag-red-hat","topic-application-development","topic-cloud","topic-devops","topic-tools","programming-languages-java","review-flag-1593580428-734","review-flag-1593580771-946","review-flag-1-1593580432-963","review-flag-2-1593580437-411","review-flag-4-1593580448-609","review-flag-5-1593580453-725","review-flag-7-1593580463-151","review-flag-8-1593580468-572","review-flag-new-1593580248-669","review-flag-sprin-1593580746-499","review-flag-vm-1593580807-312"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible<\/title>\n<meta name=\"description\" content=\"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible\" \/>\n<meta property=\"og:description\" content=\"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Open Source Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-25T02:30:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-04T00:54:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1170\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kylie Liang\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@OpenAtMicrosoft\" \/>\n<meta name=\"twitter:site\" content=\"@OpenAtMicrosoft\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kylie Liang\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\"},\"author\":[{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/author\/kylie-liang\/\",\"@type\":\"Person\",\"@name\":\"Kylie Liang\"}],\"headline\":\"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible\",\"datePublished\":\"2018-09-25T02:30:39+00:00\",\"dateModified\":\"2025-03-04T00:54:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\"},\"wordCount\":862,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp\",\"keywords\":[\"Ansible\",\"Microsoft Azure\",\"Red Hat\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\",\"name\":\"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible\",\"isPartOf\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp\",\"datePublished\":\"2018-09-25T02:30:39+00:00\",\"dateModified\":\"2025-03-04T00:54:12+00:00\",\"description\":\"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.\",\"breadcrumb\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp\",\"contentUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp\",\"width\":1170,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/opensource.microsoft.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#website\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/\",\"name\":\"Microsoft Open Source Blog\",\"description\":\"Open dialogue about openness at Microsoft \u2013 open source, standards, interoperability\",\"publisher\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/opensource.microsoft.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#organization\",\"name\":\"Microsoft Open Source Blog\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"width\":259,\"height\":194,\"caption\":\"Microsoft Open Source Blog\"},\"image\":{\"@id\":\"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/OpenAtMicrosoft\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible","description":"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible","og_description":"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.","og_url":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/","og_site_name":"Microsoft Open Source Blog","article_published_time":"2018-09-25T02:30:39+00:00","article_modified_time":"2025-03-04T00:54:12+00:00","og_image":[{"width":1170,"height":640,"url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.png","type":"image\/png"}],"author":"Kylie Liang","twitter_card":"summary_large_image","twitter_creator":"@OpenAtMicrosoft","twitter_site":"@OpenAtMicrosoft","twitter_misc":{"Written by":"Kylie Liang","Est. reading time":"4 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#article","isPartOf":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/"},"author":[{"@id":"https:\/\/opensource.microsoft.com\/blog\/author\/kylie-liang\/","@type":"Person","@name":"Kylie Liang"}],"headline":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible","datePublished":"2018-09-25T02:30:39+00:00","dateModified":"2025-03-04T00:54:12+00:00","mainEntityOfPage":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/"},"wordCount":862,"commentCount":1,"publisher":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#organization"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp","keywords":["Ansible","Microsoft Azure","Red Hat"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/","url":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/","name":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible","isPartOf":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage"},"thumbnailUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp","datePublished":"2018-09-25T02:30:39+00:00","dateModified":"2025-03-04T00:54:12+00:00","description":"With the power of Ansible and Jenkins, and their deep integration with Azure, you can have a seamless CI\/CD experience on Azure.","breadcrumb":{"@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#primaryimage","url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp","contentUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2024\/06\/CLO24-Azure-Retail-025.webp","width":1170,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/opensource.microsoft.com\/blog\/2018\/09\/24\/tutorial-devops-on-azure-using-jenkins-and-ansible\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/opensource.microsoft.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Automate infrastructure and deployment on Azure using Jenkins and Ansible"}]},{"@type":"WebSite","@id":"https:\/\/opensource.microsoft.com\/blog\/#website","url":"https:\/\/opensource.microsoft.com\/blog\/","name":"Microsoft Open Source Blog","description":"Open dialogue about openness at Microsoft \u2013 open source, standards, interoperability","publisher":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/opensource.microsoft.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/opensource.microsoft.com\/blog\/#organization","name":"Microsoft Open Source Blog","url":"https:\/\/opensource.microsoft.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/opensource.microsoft.com\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","width":259,"height":194,"caption":"Microsoft Open Source Blog"},"image":{"@id":"https:\/\/opensource.microsoft.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/OpenAtMicrosoft"]}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Open Source Blog","distributor_original_site_url":"https:\/\/opensource.microsoft.com\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/74644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/users\/5562"}],"replies":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/comments?post=74644"}],"version-history":[{"count":3,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/74644\/revisions"}],"predecessor-version":[{"id":97204,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/posts\/74644\/revisions\/97204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/media\/95475"}],"wp:attachment":[{"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/media?parent=74644"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/post_tag?post=74644"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/content-type?post=74644"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/topic?post=74644"},{"taxonomy":"programming-languages","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/programming-languages?post=74644"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/opensource.microsoft.com\/blog\/wp-json\/wp\/v2\/coauthors?post=74644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}