{"id":349,"date":"2020-08-31T11:09:50","date_gmt":"2020-08-31T11:09:50","guid":{"rendered":"https:\/\/blogs.zeiss.com\/tech\/?p=349"},"modified":"2020-09-01T07:47:34","modified_gmt":"2020-09-01T07:47:34","slug":"ms-azure-devops-on-demand-agents-part-2","status":"publish","type":"post","link":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/","title":{"rendered":"MS Azure DevOps: On-Demand Agents \u2014 Part 2"},"content":{"rendered":"\n<p><em>This post is the second in a two-part series<\/em>.<\/p>\n\n\n\n<p>In the <a href=\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents\/\">previous post<\/a>,  I have given you a quick overview of how we are using on-demand agents. Moreover, the first article only addresses the theoretical aspect of on-demand agents. In this article, I will discuss more about the underlying infrastructure, tooling, and most notably, the integration of Azure Pipelines.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisite<\/h2>\n\n\n\n<p>The following prerequisites are required for the successful and proper use of On-Demand Agents.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>A Kubernetes cluster.<\/li><li>You should also have <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\">Kubectl<\/a> installed with access to the Kubernetes cluster.<\/li><li><a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">Helm<\/a><\/li><li>Azure DevOps <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/organizations\/accounts\/use-personal-access-tokens-to-authenticate?view=azure-devops&amp;tabs=preview-page\">Personal Access Token<\/a><\/li><li>Basic understanding of YAML based <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/yaml-schema?view=azure-devops&amp;tabs=schema%2Cparameter-schema\">Azure Pipelines<\/a>.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Create Agent Pool<\/strong>:<br><br>First,&nbsp;we&nbsp;need&nbsp;the&nbsp;Azure&nbsp;DevOps&nbsp;Agent&nbsp;Pool&nbsp;before&nbsp;continuing&nbsp;further&nbsp;with&nbsp;the&nbsp;installation. You can follow the instructions <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/agents\/pools-queues?view=azure-devops&amp;tabs=yaml%2Cbrowser\">here<\/a>. <\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Add Helm Repository<\/strong>:<br><br>Make&nbsp;sure&nbsp;you&nbsp;have&nbsp;Helm&nbsp;<a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">installed<\/a>&nbsp;as&nbsp;specified&nbsp;in&nbsp;the&nbsp;pre-requisite. Add On-demand agent chart repository to Helm:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"183\" class=\"wp-image-391\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd-300x79.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd-1024x268.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd-768x201.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmRepoAdd-640x167.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><\/li><\/ul>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li><strong>Create a Kubernetes Namespace:<\/strong><br><br>It is not necessary to create a new namespace for the on-demand agents but its a good idea to separate&nbsp;on-demand agents from&nbsp;application resources.<br><br>\u2139\ufe0f  <em>For&nbsp;the Kubernetes&nbsp;namespace,&nbsp;I&nbsp;would&nbsp;suggest&nbsp;using&nbsp;the&nbsp;same&nbsp;name&nbsp;as&nbsp;the&nbsp;agent&nbsp;pool&nbsp;to&nbsp;have consistent&nbsp;naming.<\/em><br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"148\" class=\"wp-image-395\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace-300x64.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace-1024x217.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace-768x163.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/k8sNamepsace-640x135.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><\/li><\/ul>\n<\/div><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Deploy Init Agents<\/strong>:<br><br>Make sure, you have already generated the <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/organizations\/accounts\/use-personal-access-tokens-to-authenticate?view=azure-devops&amp;tabs=preview-page\">Personal Access Token<\/a> with (Read and Manage) access to Agent Pool.<br><br>Required values to deploy init agents:<br><br>1. <strong>azdoToken<\/strong>: Base64 encoded Personal Access token.<br>2. <strong>azdoUrl<\/strong>: Azure DevOps URL, usually&nbsp;<code>https:\/\/dev.azure.com\/&lt;Your Organization&gt;<\/code>.<br>3. <strong>azdoPool<\/strong>: Name of Agent Pool.<br>4. <strong>replicas<\/strong>: Number of init agent, Default: 3<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"229\" class=\"wp-image-398\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit-300x98.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit-1024x335.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit-768x251.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/helmInit-640x209.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>After successful helm installation, you should see 3 init agents in newly created Agent Pool:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"243\" class=\"wp-image-409\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents.png 2202w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-300x104.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-1024x355.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-768x266.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-1536x533.png 1536w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-2048x711.png 2048w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-640x222.png 640w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-1200x416.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initAgents-1920x666.png 1920w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>If you check the system capabilities for any of the init agents, you will notice the <code><strong>category=init<\/strong><\/code> and that&#8217;s basically the selector for the init agents. This can be done by specifying the&nbsp;<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/process\/demands?view=azure-devops&amp;tabs=yaml\">demands<\/a>, as shown below:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"317\" class=\"wp-image-431\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline-300x136.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline-1024x464.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline-768x348.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/initPipeline-640x290.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>\u2139\ufe0f  <em>By the way, we are adding this capability from the <a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/agents\/init-agent\/Dockerfile#L5\">init-agent docker image.<\/a><br><\/em><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"359\" class=\"wp-image-416\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap.png 2174w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-300x154.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-1024x525.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-768x394.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-1536x787.png 1536w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-2048x1049.png 2048w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-640x328.png 640w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-1200x615.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/InitAgentCap-1920x984.png 1920w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>You can find more configuration parameters and details about <strong>zeiss\/azdo-init-agent<\/strong> chart <a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/charts\/azdo-init-agent\/README.md\">here<\/a>.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Integration with Azure Pipelines:<\/strong><br><br>So\u00a0now\u00a0we&#8217;ve\u00a0built\u00a0our\u00a0underlying\u00a0Kubernetes\u00a0infrastructure\u00a0and\u00a0the\u00a0tooling\u00a0needed.\u00a0Now\u00a0it&#8217;s\u00a0time\u00a0to\u00a0integrate it with\u00a0Azure\u00a0Pipelines\u00a0(Build\u00a0or\u00a0Release).<br><br>As already discussed in the <a href=\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents\/\">previous post<\/a>, basically we need to\u00a0split our Azure Pipeline(Build or Release jobs) into 3 phases:<br><br>1. <strong>Spin Up Agent:<\/strong> <br><br><code>\u2757 <em>Runs on init-agent<\/em><\/code><br>As\u00a0the\u00a0name\u00a0suggests,\u00a0we\u00a0need\u00a0to\u00a0Spin up\u00a0an\u00a0agent\u00a0(Kubernetes\u00a0Pod) in this stage which\u00a0will\u00a0be\u00a0used\u00a0for\u00a0our\u00a0pipeline.<br><br>We\u00a0will\u00a0create\u00a0an\u00a0agent\u00a0using\u00a0<code>helm\u00a0install<\/code>.\u00a0You\u00a0may\u00a0also\u00a0use\u00a0<code>kubectl<\/code>,\u00a0as\u00a0we\u00a0are\u00a0simply\u00a0creating\u00a0<a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/charts\/azdo-demand-agent\/templates\/azdo-agent.yaml\">Kubernetes\u00a0pod\u00a0<\/a>under\u00a0the\u00a0hood:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"399\" class=\"wp-image-420\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent-300x171.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent-1024x584.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent-768x438.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/spinUpAgent-640x365.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>As you can see here, we use <a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/tree\/master\/charts\/azdo-demand-agent\">zeiss\/azdo-demand-agent<\/a> to spin up an Agent.  Few important parameters to consider while running <code>helm install<\/code>:<br><br>&#8211; It&#8217;s important to create an agent with a unique name, this can be achieved using Azure DevOps Predefined Variable <strong><code>Build.BuildId<\/code><\/strong>. We are using <code><strong>$(agentType)-$(Build.BuildId)<\/strong><\/code> as helm release name, which\u00a0is\u00a0passed\u00a0as\u00a0the\u00a0name\u00a0of\u00a0a\u00a0Kubernetes\u00a0<a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/charts\/azdo-demand-agent\/templates\/azdo-agent.yaml#L4\">Pod<\/a>.<br>&#8211; Make sure, you are using a <strong>wait<\/strong> flag which makes helm to wait until Agent(Pod) created and connected to Azure DevOps. This is done by using a <a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/charts\/azdo-demand-agent\/templates\/azdo-agent.yaml#L35\">readiness probe<\/a>.<br>&#8211; <strong>agent.type<\/strong>: Type of agent, which is nothing but the Docker image tag. Default image repository<code> cizi\/azdo-demand-agent<\/code>. <br><br>For instance, with type <code><strong>nodejs<\/strong><\/code>, container image path would be: <a href=\"https:\/\/hub.docker.com\/layers\/cizi\/demand-agent\/nodejs\/images\/sha256-77044d788576776c21809f492baf12ce4d88ef9dcc2c955e37afa6727bb182e3?context=repo\">cizi\/azdo-demand-agent:nodejs<\/a><br> <br>2. <strong>Build or Release<\/strong>:<br><br><code>\u2757 <em>Runs on demand-agent<\/em><\/code><br>This is our actual build or release <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/process\/stages?view=azure-devops&amp;tabs=yaml\">stage<\/a>. You can configure your own steps or task required for the build and release as you do normally.<br><br>It is very important to pick the agent which was created earlier during the SpinUp Agent phase. To achieve that, we can use the agent name as a demand:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"310\" class=\"wp-image-439\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage.png 1400w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage-300x133.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage-1024x453.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage-768x340.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage-640x283.png 640w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/buildStage-1200x531.png 1200w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>3. <strong>Delete Agent:<\/strong><br><br><code>\u2757 <em>Runs on init-agent<\/em><\/code><br>When\u00a0pipeline\u00a0reaches\u00a0this\u00a0stage or job\u00a0that\u00a0means\u00a0either\u00a0we&#8217;re\u00a0finished\u00a0with\u00a0our\u00a0build\/release\u00a0or\u00a0it wasn&#8217;t\u00a0successful or canceled,\u00a0but\u00a0nevertheless we need\u00a0to\u00a0kick\u00a0out\u00a0the\u00a0agent\u00a0we&#8217;ve\u00a0used.<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"392\" class=\"wp-image-432\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent.png 1200w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent-300x168.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent-1024x573.png 1024w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent-768x430.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/deleteAgent-640x358.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><br>As you can see here, we have just uninstalled the helm release which was created as part of SpinUp Agent.<br>It&#8217;s\u00a0necessary\u00a0to\u00a0have <strong><code>condition: always()<\/code><\/strong>, as\u00a0we\u00a0need\u00a0to\u00a0make\u00a0sure\u00a0we\u00a0delete\u00a0the\u00a0agent:<br><br>If Build\/Release:<br>    1. Completed successfully.<br>    2. Completed with failures.<br>    3. Is canceled.<br><br><br>That\u00a0is\u00a0it,\u00a0then!\u00a0So\u00a0does\u00a0your\u00a0Azure\u00a0Pipeline\u00a0UI\u00a0look\u00a0like\u00a0this:<br><br><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"156\" class=\"wp-image-441\" style=\"width: 700px;\" src=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/onDemandAgentUI.png\" alt=\"\" srcset=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/onDemandAgentUI.png 949w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/onDemandAgentUI-300x67.png 300w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/onDemandAgentUI-768x172.png 768w, https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/onDemandAgentUI-640x143.png 640w\" sizes=\"auto, (max-width: 639px) 98vw, (max-width: 1199px) 64vw, 700px\" \/><br><em>Refer\u00a0to\u00a0the full\u00a0example\u00a0of\u00a0this\u00a0<a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\/blob\/master\/azure-pipeline-examples\/nodejs.yml\">Azure\u00a0Pipeline<\/a>.<\/em><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>In this article, you installed On-Demand Agents in your Kubernetes cluster and integrated it with the Azure Pipelines.<br><br>Now that you understand how On-Demand Agents works, you can add it easily in your existing Azure Pipelines. Check out the <a href=\"https:\/\/github.com\/ZEISS\/on-demand-agents\">Github repository<\/a> to learn more about the Docker images, Helm Chart. To learn more about using Azure Pipelines in general, see the official <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/get-started\/key-pipelines-concepts?view=azure-devops\">Azure Pipeline documentation.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is the second in a two-part series. In the previous post, I have given you a quick overview of how we are using on-demand agents. Moreover, the first article only addresses the theoretical aspect of on-demand agents. In this article, I will discuss more about the underlying infrastructure, tooling, and most notably, the<\/p>\n","protected":false},"author":6,"featured_media":358,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[8,32,33],"tags":[],"topics":[],"class_list":["post-349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd","category-kubernetes","category-helm"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners\" \/>\n<meta property=\"og:description\" content=\"This post is the second in a two-part series. In the previous post, I have given you a quick overview of how we are using on-demand agents. Moreover, the first article only addresses the theoretical aspect of on-demand agents. In this article, I will discuss more about the underlying infrastructure, tooling, and most notably, the\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital Innovation Partners\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-31T11:09:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-09-01T07:47:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1113\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Cizer Pereira\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Cizer Pereira\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/\",\"name\":\"MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg\",\"datePublished\":\"2020-08-31T11:09:50+00:00\",\"dateModified\":\"2020-09-01T07:47:34+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/e09d8fad6dc3c9ac00e03fb20c38c185\"},\"breadcrumb\":{\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg\",\"width\":1920,\"height\":1113},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.zeiss.com\/tech\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MS Azure DevOps: On-Demand Agents \u2014 Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#website\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/\",\"name\":\"Digital Innovation Partners\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.zeiss.com\/tech\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/e09d8fad6dc3c9ac00e03fb20c38c185\",\"name\":\"Cizer Pereira\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/02\/Picture_CizerPereira-150x150.jpg\",\"contentUrl\":\"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/02\/Picture_CizerPereira-150x150.jpg\",\"caption\":\"Cizer Pereira\"},\"description\":\"Cizer is working as a software engineer with focus on infrastructure. He joined ZEISS Digital Innovation Partners in October 2017. His current focus is on CI\/CD, infrastructure and related automation topics.\",\"url\":\"https:\/\/blogs.zeiss.com\/tech\/author\/cizer-pereirazeiss-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners","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:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/","og_locale":"en_US","og_type":"article","og_title":"MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners","og_description":"This post is the second in a two-part series. In the previous post, I have given you a quick overview of how we are using on-demand agents. Moreover, the first article only addresses the theoretical aspect of on-demand agents. In this article, I will discuss more about the underlying infrastructure, tooling, and most notably, the","og_url":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/","og_site_name":"Digital Innovation Partners","article_published_time":"2020-08-31T11:09:50+00:00","article_modified_time":"2020-09-01T07:47:34+00:00","og_image":[{"width":1920,"height":1113,"url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg","type":"image\/jpeg"}],"author":"Cizer Pereira","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Cizer Pereira","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/","url":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/","name":"MS Azure DevOps: On-Demand Agents \u2014 Part 2 - Digital Innovation Partners","isPartOf":{"@id":"https:\/\/blogs.zeiss.com\/tech\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage"},"image":{"@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg","datePublished":"2020-08-31T11:09:50+00:00","dateModified":"2020-09-01T07:47:34+00:00","author":{"@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/e09d8fad6dc3c9ac00e03fb20c38c185"},"breadcrumb":{"@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#primaryimage","url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133.jpg","width":1920,"height":1113},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.zeiss.com\/tech\/ms-azure-devops-on-demand-agents-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.zeiss.com\/tech\/"},{"@type":"ListItem","position":2,"name":"MS Azure DevOps: On-Demand Agents \u2014 Part 2"}]},{"@type":"WebSite","@id":"https:\/\/blogs.zeiss.com\/tech\/#website","url":"https:\/\/blogs.zeiss.com\/tech\/","name":"Digital Innovation Partners","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.zeiss.com\/tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/e09d8fad6dc3c9ac00e03fb20c38c185","name":"Cizer Pereira","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.zeiss.com\/tech\/#\/schema\/person\/image\/","url":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/02\/Picture_CizerPereira-150x150.jpg","contentUrl":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/02\/Picture_CizerPereira-150x150.jpg","caption":"Cizer Pereira"},"description":"Cizer is working as a software engineer with focus on infrastructure. He joined ZEISS Digital Innovation Partners in October 2017. His current focus is on CI\/CD, infrastructure and related automation topics.","url":"https:\/\/blogs.zeiss.com\/tech\/author\/cizer-pereirazeiss-com\/"}]}},"author_meta":{"display_name":"Cizer Pereira","author_link":"https:\/\/blogs.zeiss.com\/tech\/author\/cizer-pereirazeiss-com\/"},"featured_img":"https:\/\/blogs.zeiss.com\/tech\/wp-content\/uploads\/2020\/08\/pipelines-1-e1598385803133-300x174.jpg","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/ci-cd\/\" class=\"advgb-post-tax-term\">CI\/CD<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/kubernetes\/\" class=\"advgb-post-tax-term\">Kubernetes<\/a>","<a href=\"https:\/\/blogs.zeiss.com\/tech\/category\/helm\/\" class=\"advgb-post-tax-term\">Helm<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">CI\/CD<\/span>","<span class=\"advgb-post-tax-term\">Kubernetes<\/span>","<span class=\"advgb-post-tax-term\">Helm<\/span>"]}},"comment_count":"1","relative_dates":{"created":"Posted 6 years ago","modified":"Updated 6 years ago"},"absolute_dates":{"created":"Posted on August 31, 2020","modified":"Updated on September 1, 2020"},"absolute_dates_time":{"created":"Posted on August 31, 2020 11:09 am","modified":"Updated on September 1, 2020 7:47 am"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/comments?post=349"}],"version-history":[{"count":65,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/349\/revisions"}],"predecessor-version":[{"id":455,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/posts\/349\/revisions\/455"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/media\/358"}],"wp:attachment":[{"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/media?parent=349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/categories?post=349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/tags?post=349"},{"taxonomy":"topics","embeddable":true,"href":"https:\/\/blogs.zeiss.com\/tech\/wp-json\/wp\/v2\/topics?post=349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}