{"id":3134,"date":"2022-04-22T12:34:40","date_gmt":"2022-04-22T12:34:40","guid":{"rendered":"https:\/\/exceedthecloud.com\/?p=3134"},"modified":"2022-04-22T12:43:37","modified_gmt":"2022-04-22T12:43:37","slug":"integrating-external-source-control-with-azure-pipelines","status":"publish","type":"post","link":"https:\/\/exceedthecloud.com\/?p=3134","title":{"rendered":"Integrating External Source Control with Azure Pipelines"},"content":{"rendered":"\n<p>With the introduction of Azure DevOps, Microsoft is offering developers a new continuous integration\/continuous delivery (CI\/CD) service called Azure Pipelines that enables you to continuously build, test, and deploy to any platform or cloud. It has cloud-hosted agents for Linux, macOS, and Windows; powerful workflows with native container support; and flexible deployments to Kubernetes, VMs, and serverless environments.<\/p>\n\n\n\n<p>Azure Pipelines provides unlimited CI\/CD minutes and 10 parallel jobs to every GitHub open source project for free. All open source projects run on the same infrastructure that our paying customers use. That means you\u2019ll have the same fast performance and high quality of service. Many of the top open source projects are already using Azure Pipelines for CI\/CD, such as Atom, Python, Pipenv, Tox, Visual Studio Code, and TypeScript-and the list is growing every day.<\/p>\n\n\n\n<p>In this lab, you\u2019ll see how easy it is to set up Azure Pipelines with your GitHub projects and how you can start seeing benefits immediately.<\/p>\n\n\n\n<p>After you complete this lab, you will be able to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Install Azure Pipelines from the GitHub Marketplace.<\/li><li>Integrate a GitHub project with an Azure DevOps pipeline.<\/li><li>Track pull requests through the pipeline.<\/li><\/ul>\n\n\n\n<p><strong>Review applications required for this lab<\/strong><\/p>\n\n\n\n<p>Identify the applications that you\u2019ll use in this lab:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Microsoft Edge<\/li><\/ul>\n\n\n\n<p><strong>Set up an Azure DevOps organization<\/strong><\/p>\n\n\n\n<p>If you don\u2019t already have an Azure DevOps organization that you can use for this lab, create one by following the instructions available at&nbsp;<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/organizations\/accounts\/create-organization?view=azure-devops\" target=\"_blank\" rel=\"noreferrer noopener\">Create an organization or project collection<\/a>.<\/p>\n\n\n\n<p>Set up a GitHub account<\/p>\n\n\n\n<p>If you don\u2019t already have a GitHub account that you can use for this lab, follow instructions available at&nbsp;<a href=\"https:\/\/docs.github.com\/en\/free-pro-team@latest\/github\/getting-started-with-github\/signing-up-for-a-new-github-account\" target=\"_blank\" rel=\"noreferrer noopener\">Signing up for a new GitHub account<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Lab 1: Getting started with Azure Pipelines<\/strong><\/p>\n\n\n\n<p>In this Lab, you will integrate a GitHub project with Azure DevOps by using the new Azure Pipelines integration from the Marketplace.<\/p>\n\n\n\n<p><strong>Task 1: Forking a GitHub repo and installing Azure Pipelines<\/strong><\/p>\n\n\n\n<p>In this task, you will fork a GitHub repo and install Azure Pipelines in your GitHub account.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On your lab computer, start a web browser, navigate to the&nbsp;<a href=\"https:\/\/github.com\/actionsdemos\/calculator\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub actionsdemos\/calculator site<\/a>&nbsp;and, if you\u2019re not already signed in to GitHub, sign in now.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: This is the baseline project we will fork and use for this lab.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>On the&nbsp;<strong>actionsdemos\/calculator site<\/strong>&nbsp;page, click&nbsp;<strong>Fork<\/strong>, to fork the repository to your own GitHub account. If prompted, select the account to fork the repository into.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"428\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture1-7.png\" alt=\"\" class=\"wp-image-3135\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture1-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture1-7-300x206.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the page displaying the forked repo, at the top menu, click&nbsp;<strong>Marketplace<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"438\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture2-7.png\" alt=\"\" class=\"wp-image-3136\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture2-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture2-7-300x211.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: The&nbsp;<strong>GitHub Marketplace<\/strong>&nbsp;provides a variety of tools from Microsoft and 3rd parties that help you extend your project workflows.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>In the&nbsp;<strong>Search for apps and actions<\/strong>, type&nbsp;<strong>Azure Pipelines<\/strong>, press the&nbsp;<strong>Enter<\/strong>&nbsp;key, and, in the list of results, click&nbsp;<strong>Azure Pipelines<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"433\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture3-7.png\" alt=\"\" class=\"wp-image-3137\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture3-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture3-7-300x208.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Azure Pipelines<\/strong>&nbsp;page, click&nbsp;<strong>Read more<\/strong>&nbsp;and read through the benefits of Azure Pipelines.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"443\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture4-7.png\" alt=\"\" class=\"wp-image-3138\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture4-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture4-7-300x213.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: The Azure Pipelines offering is free for anyone to use for public repositories, and free for a single build queue if you\u2019re using a private repository.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Azure Pipelines<\/strong>&nbsp;page, click&nbsp;<strong>Install it for free<\/strong>. If you have multiple&nbsp;<strong>GitHub<\/strong>&nbsp;accounts, select the one you forked the calculator to from the&nbsp;<strong>Switch billing account<\/strong>&nbsp;dropdown.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"394\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture5-7.png\" alt=\"\" class=\"wp-image-3139\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture5-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture5-7-300x189.png 300w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture5-7-80x50.png 80w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Review your order<\/strong>&nbsp;page, click&nbsp;<strong>Complete order and begin installation<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"396\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture6-7.png\" alt=\"\" class=\"wp-image-3140\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture6-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture6-7-300x190.png 300w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture6-7-80x50.png 80w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Install Azure Pipelines<\/strong>&nbsp;page, use the default option&nbsp;<strong>All repositories<\/strong>&nbsp;and click&nbsp;<strong>Install<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"522\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture7-7.png\" alt=\"\" class=\"wp-image-3141\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture7-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture7-7-300x251.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: You have the option to specify repositories to include, but for the purposes of this lab, just include all of them. Note that Azure DevOps requires the listed set of permissions to fulfill its services.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>If prompted, authenticate with your GitHub password to continue.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"511\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture8-7.png\" alt=\"\" class=\"wp-image-3142\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture8-7.png 568w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture8-7-300x270.png 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/figure>\n\n\n\n<p>When prompted, on the&nbsp;<strong>Setup your Azure Pipelines project<\/strong>&nbsp;page, in the&nbsp;<strong>Select your Azure DevOps organization<\/strong>&nbsp;dropdown list, select your Azure DevOps account and click&nbsp;<strong>Create a new project<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"533\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture9-7.png\" alt=\"\" class=\"wp-image-3143\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture9-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture9-7-300x256.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>When prompted, on the&nbsp;<strong>Setup your Azure Pipelines project<\/strong>&nbsp;page, in the&nbsp;<strong>Project name<\/strong>&nbsp;textbox, type&nbsp;<strong>Integrating External Source Control with Azure Pipelines<\/strong>, leave the&nbsp;<strong>Project visibility<\/strong>&nbsp;set to&nbsp;<strong>Private<\/strong>, and click&nbsp;<strong>Continue<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"536\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture10-7.png\" alt=\"\" class=\"wp-image-3144\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture10-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture10-7-300x258.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Azure Pipelines by Microsoft would like permission to<\/strong>&nbsp;page, click&nbsp;<strong>Authorize Azure Pipelines<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"580\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture11-7.png\" alt=\"\" class=\"wp-image-3145\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture11-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture11-7-300x279.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Task 2: Configuring your Azure Pipelines project<\/strong><\/p>\n\n\n\n<p>In this task, you will configure the Azure Pipelines project based on the fork of the GitHub repo you created in the previous task.<\/p>\n\n\n\n<p><strong>Note<\/strong>: You are now on the Azure DevOps site and need to set up your Azure Pipelines project.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>In the Azure DevOps portal, click on&nbsp;<strong>Pipelines<\/strong>&nbsp;in the navigation panel on the left.<\/li><li>Click on the&nbsp;<strong>Create pipeline<\/strong>&nbsp;button at top right.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"317\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture12-7.png\" alt=\"\" class=\"wp-image-3146\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture12-7.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture12-7-300x152.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"667\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture13-6.png\" alt=\"\" class=\"wp-image-3147\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture13-6.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture13-6-281x300.png 281w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"305\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture14-5.png\" alt=\"\" class=\"wp-image-3148\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture14-5.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture14-5-300x147.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Select a repository<\/strong>&nbsp;pane of the&nbsp;<strong>Pipelines<\/strong>&nbsp;view in the Azure DevOps portal, select the fork of the GitHub calculator repository you created in the previous task.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"714\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture15-6.png\" alt=\"\" class=\"wp-image-3149\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture15-6.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture15-6-262x300.png 262w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><strong>Note<\/strong>: Azure Pipelines will analyze your project in an attempt to determine if any existing templates would be a good fit. In this case, the recommended template is for&nbsp;<strong>Node.js<\/strong>, which is perfect for our needs. Some alternative templates are also suggested, although the recommended one is the best for this lab.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Configure your pipeline<\/strong>, select&nbsp;<strong>Node.js<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"603\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture16-5.png\" alt=\"\" class=\"wp-image-3150\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture16-5.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture16-5-300x290.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: The build pipeline is defined as&nbsp;<strong>YAML<\/strong>, a markup syntax well-suited to defining processes like this because it allows you to manage the configuration of the pipeline like any other file in the repo. It\u2019s a pretty simple template that identifies the pool to pull a VM from for building, the process to install Node.js for building, and the actual build itself.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Review your pipeline YAML<\/strong>, click&nbsp;<strong>Save and run<\/strong>&nbsp;to save the pipeline and queue a new build.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"424\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture17-5.png\" alt=\"\" class=\"wp-image-3151\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture17-5.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture17-5-300x204.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Save and run<\/strong>&nbsp;pane, accept the default settings and click&nbsp;<strong>Save and run<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"465\" height=\"831\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture18-5.png\" alt=\"\" class=\"wp-image-3152\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture18-5.png 465w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture18-5-168x300.png 168w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: For the purposes of this lab, you can commit this new file directly to the master branch.<\/p>\n\n\n\n<p><strong>Note<\/strong>: It will take a moment for the pipeline to complete. During this time it will configure the build agent, pull in the source from GitHub, and build it according to the pipeline definition.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Summary<\/strong>&nbsp;tab of the build job\u2019s pane, verify that the build completed successfully.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"364\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture19-4.png\" alt=\"\" class=\"wp-image-3153\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture19-4.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture19-4-300x175.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Task 3: Modifying a YAML build pipeline definition<\/strong><\/p>\n\n\n\n<p>In this task, you will modify the YAML build definition in the forked GitHub repository and track the build process triggered by your modification.<\/p>\n\n\n\n<p><strong>Note<\/strong>: While the default pipeline is a great start, it doesn\u2019t do everything we would like to have automated. For example, it would be great if it also ran our tests to confirm that the changes don\u2019t create bugs. Let\u2019s return to GitHub where we can edit the YAML by hand.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Summary<\/strong>&nbsp;tab of the build job\u2019s pane, next to the&nbsp;<strong>Repository and version<\/strong>&nbsp;label, right-click the entry representing the GitHub project repo hosting the fork you created earlier in this lab and select&nbsp;<strong>Open link in new tab<\/strong>. This will open a new browser tab, displaying the GitHub page with the content of the fork.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: Since this lab will involve stepping back and forth between GitHub and Azure DevOps, it\u2019ll be easier to keep a browser tab open to each.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>On the GitHub page displaying the content of the fork, locate and click the entry representing the file&nbsp;<strong>azure-pipelines.yml<\/strong>. This will automatically open the file and display its content.<\/li><li>On the&nbsp;<strong>master\/calculator\/azure-pipelines.yml<\/strong>&nbsp;page, in the upper right corner of the pane displaying the file content, click the&nbsp;<strong>Edit this file<\/strong>&nbsp;icon in the shape of a pencil.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: Our project already contains tests written using Mocha so we just need to execute them in our pipeline.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"4\"><li>To add the test run, add the&nbsp;npm test&nbsp;command directly below the&nbsp;npm run build&nbsp;command, with the same indentation. In addition, update the&nbsp;displayName&nbsp;entry to&nbsp;&#8216;npm install, build, and test&#8217;&nbsp;to clearly indicate what each task of the build is doing:<\/li><\/ul>\n\n\n\n<p>CodeCopy<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  npm test\ndisplayName: 'npm install, build, and test'\n<\/code><\/pre>\n\n\n\n<p>Scroll to the bottom of the page, replace the default commit message with&nbsp;<strong>Adding npm test<\/strong>, and click&nbsp;<strong>Commit changes<\/strong>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"408\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture21-3.png\" alt=\"\" class=\"wp-image-3154\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture21-3.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture21-3-300x196.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><strong>Note<\/strong>: Again, it\u2019s acceptable to commit this change directly to the master branch considering that this is a lab environment.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Switch back to the browser tab displaying the&nbsp;<strong>Azure DevOps<\/strong>&nbsp;portal and use the breadcrumb navigation to navigate to the&nbsp;<strong>Pipelines<\/strong>&nbsp;pane of the&nbsp;<strong>Pipelines<\/strong>&nbsp;view.<\/li><li>Verify that the new build triggered by the update already appears on the&nbsp;<strong>Recent<\/strong>&nbsp;tab in the&nbsp;<strong>Recently run pipelines<\/strong>&nbsp;list. Click the entry corresponding to the pipeline, on the&nbsp;<strong>Runs<\/strong>&nbsp;tab, select the most recent run, and, in the&nbsp;<strong>Jobs<\/strong>&nbsp;section, click the&nbsp;<strong>Job<\/strong>&nbsp;entry.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"288\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture22-3.png\" alt=\"\" class=\"wp-image-3155\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture22-3.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture22-3-300x138.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the pane displaying job details, click on individual tasks of the job and follow it through to completion.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Task 4: Proposing a change via GitHub pull request<\/strong><\/p>\n\n\n\n<p>In this task, you will propose an invalid change and review the results of a build triggered by a pull request.<\/p>\n\n\n\n<p><strong>Note<\/strong>: One of the great benefits of this pipeline setup is that we now have a quality gate that\u2019s automatically run every time someone commits a change. This makes it much easier to manage a project that could have any number of contributions coming in at various levels of quality.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Switch back to the browser tab displaying the GitHub page displaying the content of the&nbsp;<strong>azure-pipelines.yml<\/strong>&nbsp;file, navigate back to the page listing content of the forked repo and click&nbsp;<strong>Go to file<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"276\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture23-2.png\" alt=\"\" class=\"wp-image-3156\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture23-2.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture23-2-300x133.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>At the&nbsp;<strong>calculator\/<\/strong>&nbsp;prompt, type&nbsp;<strong>arithmeticController.js<\/strong>&nbsp;and, in the list of results click&nbsp;<strong>api\/controllers\/arithmeticController.js<\/strong>. This will automatically redirect the browser session to the&nbsp;<strong>master\/calculator\/api\/controllers\/arithmeticController.js<\/strong>&nbsp;page, displaying the content of that file.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: This controller contains the core functionality of the app. However, the code for the&nbsp;<strong>add<\/strong>&nbsp;operation isn\u2019t completely clear. Put yourself in the position of someone with good intentions, but a lack of experience with JavaScript. They might identify this as an opportunity to help out by cleaning up the code to make it better.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>On the&nbsp;<strong>master\/calculator\/api\/controllers\/arithmeticController.js<\/strong>&nbsp;page, in the upper right corner of the pane displaying the file content, click the&nbsp;<strong>Edit this file<\/strong>&nbsp;icon in the shape of a pencil.<\/li><li>Change the line ` \u2018add\u2019: function(a,b) { return +a + +b },to&nbsp;\u2018add\u2019: function(a,b) { return a + b },`.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: This is an incorrect change that would result in invalid outcome.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"4\"><li>Scroll to the bottom of the page, replace the default commit message with&nbsp;<strong>Modifying the add function<\/strong>, select&nbsp;<strong>Create a new branch<\/strong>, set its name to&nbsp;<strong>addition-cleanup<\/strong>, and click&nbsp;<strong>Propose file change<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"436\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture24-2.png\" alt=\"\" class=\"wp-image-3157\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture24-2.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture24-2-300x210.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the&nbsp;<strong>Open a pull request<\/strong>&nbsp;page, click&nbsp;<strong>Create pull request<\/strong>&nbsp;to initiate the process of getting your untested changes into production code.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"327\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture25-2.png\" alt=\"\" class=\"wp-image-3158\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture25-2.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture25-2-300x157.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><strong>Note<\/strong>: Azure DevOps will detect the change and start the build pipeline. This will result in failed checks, triggering an update the GitHub UI.<\/p>\n\n\n\n<p><strong>Note<\/strong>: Return to your original mindset of \u201cproject owner\u201d.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Modifying the add function #1<\/strong>&nbsp;pull request page, in the&nbsp;<strong>All checks have failed<\/strong>&nbsp;section, click&nbsp;<strong>Details<\/strong>&nbsp;to learn more.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"416\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture26-2.png\" alt=\"\" class=\"wp-image-3159\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture26-2.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture26-2-300x200.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Review the&nbsp;<strong>ANNOTATIONS<\/strong>&nbsp;section and click the link&nbsp;<strong>View more details on Azure Pipelines<\/strong>&nbsp;directly below it. This will open a new browser tab displaying the failed run of the job in the Azure DevOps portal.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"405\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture27-1.png\" alt=\"\" class=\"wp-image-3160\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture27-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture27-1-300x195.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the failed job pane in the Azure portal, click the&nbsp;<strong>Job<\/strong>&nbsp;entry to display its details.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"486\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture28-1.png\" alt=\"\" class=\"wp-image-3161\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture28-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture28-1-300x234.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>In the list of job tasks, click the&nbsp;<strong>npm install, build, and test<\/strong>&nbsp;task to view its output.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"514\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture29-1.png\" alt=\"\" class=\"wp-image-3162\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture29-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture29-1-300x247.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Locate the section that lists out failing tests.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: It might not be immediately clear why the tests failed, but all of the history we\u2019ve accrued in the pipeline makes it easy to identify that something from this new pull request is the cause. The next step will be to figure out why \u201c21 + 21\u201d produced \u201c2121\u201d instead of the expected \u201c42\u201d.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>Close the tab displaying the failed run of the job in the Azure DevOps portal.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Task 5: Using the broken pull request to improve the project<\/strong><\/p>\n\n\n\n<p>In this task, you will correct the invalid changes introduced in the pull request created in the previous task.<\/p>\n\n\n\n<p><strong>Note<\/strong>: Return to your original mindset of \u201cproject owner\u201d.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Return to the browser tab displaying the&nbsp;<strong>Modifying the add function #1<\/strong>&nbsp;GitHub page and return to the main page listing the content of the forked repo.<\/li><li>At the top of the pane containing the listing of the repo files,&nbsp;<strong>Pull requests<\/strong>&nbsp;and then click the entry representing the most recent pull request.<\/li><li>On the&nbsp;<strong>Modifying the add function #1<\/strong>&nbsp;GitHub page, click the&nbsp;<strong>File changed<\/strong>&nbsp;tab and review its content.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: It appears that the changes were made by someone who didn\u2019t realize that the plus signs before each variable were necessary to coerce those variables to their number representations. By removing them, JavaScript interpreted the middle plus sign as the string concatenation operator, which explains why 21 + 21 = 2121 in the failed test.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"4\"><li>On the&nbsp;<strong>Modifying the add function #1<\/strong>&nbsp;GitHub page, click the ellipsis symbol directly under the&nbsp;<strong>Review changes<\/strong>&nbsp;button and, in the drop-down menu, click&nbsp;<strong>Edit file<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"257\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture30-1.png\" alt=\"\" class=\"wp-image-3163\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture30-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture30-1-300x124.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Revert the original changes by adding the plus signs in front of the&nbsp;<strong>a<\/strong>&nbsp;and&nbsp;<strong>b<\/strong>&nbsp;variables, resulting in \u2018add\u2019: function(a,b) { return +a + +b },. In addition, include a comment on the preceding line stating\/\/ Using + operator to type cast variables as integers in order to prevent string concatenation`.<\/li><li>Scroll to the bottom of the page, replace the default commit message with&nbsp;<strong>Fixing the add function<\/strong>, ensure that the option to&nbsp;<strong>Commit directly to the addition-cleanup branch<\/strong>&nbsp;is selected, and click&nbsp;<strong>Commit changes<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"405\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture31-1.png\" alt=\"\" class=\"wp-image-3164\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture31-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture31-1-300x195.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Modifying the add function #1<\/strong>&nbsp;GitHub page, select the&nbsp;<strong>Conversation<\/strong>&nbsp;tab.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: Azure DevOps will again detect the change and start the build pipeline. Wait for all checks to pass.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>Once all checks have passed, click&nbsp;<strong>Merge pull request<\/strong>&nbsp;and then click&nbsp;<strong>Confirm merge<\/strong>.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"409\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture32-1.png\" alt=\"\" class=\"wp-image-3165\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture32-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture32-1-300x197.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Task 6: Adding a build status badge<\/strong><\/p>\n\n\n\n<p>In this task, you will add a build status badge to your GitHub repo.<\/p>\n\n\n\n<p><strong>Note<\/strong>: An important sign for a quality project is its build status badge. When someone finds a project that has a badge indicating that the project is currently in a successful build state, it\u2019s a sign that the project is maintained effectively.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Switch back to the browser tab displaying the&nbsp;<strong>Azure DevOps<\/strong>&nbsp;portal and use the breadcrumb navigation to navigate to the&nbsp;<strong>Recent<\/strong>&nbsp;tab of the&nbsp;<strong>Pipelines<\/strong>&nbsp;pane of the&nbsp;<strong>Pipelines<\/strong>&nbsp;view.<\/li><li>On the&nbsp;<strong>Recent<\/strong>&nbsp;tab in the&nbsp;<strong>Recently run pipelines<\/strong>&nbsp;list, click the entry corresponding to the pipeline you used in this lab.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"351\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture33-1.png\" alt=\"\" class=\"wp-image-3166\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture33-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture33-1-300x169.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>On the pipeline pane, click the ellipsis symbol in the upper right corner and, in the dropdown list, select&nbsp;<strong>Status badge<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"181\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture34-1.png\" alt=\"\" class=\"wp-image-3167\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture34-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture34-1-300x87.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note<\/strong>: The&nbsp;<strong>Status badge<\/strong>&nbsp;UI provides a quick and easy way to reference the build status. Often, you\u2019ll want to use the provided URLs in your own dashboards, or you can use the Markdown snippet to add the status badge to locations such as Wiki pages.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>On the&nbsp;<strong>Status badge<\/strong>&nbsp;pane, click the&nbsp;<strong>Copy to clipboard<\/strong>&nbsp;button for&nbsp;<strong>Sample Markdown<\/strong>.<\/li><li>Switch back to the browser tab displaying the GitHub page displaying the content of the forked repo and, if needed, click the&nbsp;<strong>&lt;&gt; Code<\/strong>&nbsp;tab.<\/li><li>In the list of repo files, click **README.md** and, on the **master\/calculator\/README.md** page, in the upper right corner of the pane displaying the file content, click the **Edit this file** icon in the shape of a pencil.<\/li><li>Add an extra line above line 6 and paste into it the content of Clipboard.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"283\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture35-1.png\" alt=\"\" class=\"wp-image-3168\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture35-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture35-1-300x136.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Scroll to the bottom of the page, replace the default commit message with&nbsp;<strong>Add an Azure Pipelines status badge<\/strong>, and click&nbsp;<strong>Commit changes<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"185\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture36-1.png\" alt=\"\" class=\"wp-image-3169\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture36-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture36-1-300x89.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><strong>Note<\/strong>: You now have a dynamic build status badge on your project\u2019s front page that allows everyone to know that you\u2019re effectively managing your project.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"308\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture37-1.png\" alt=\"\" class=\"wp-image-3170\" srcset=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture37-1.png 624w, https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/Picture37-1-300x148.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Review<\/strong><\/p>\n\n\n\n<p>In this lab, you integrated a GitHub project with Azure DevOps by using the new Azure Pipelines integration from the Marketplace.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the introduction of Azure DevOps, Microsoft is offering developers a new continuous integration\/continuous delivery (CI\/CD) service called Azure Pipelines that enables you to continuously build, test, and deploy to any platform or cloud. It has cloud-hosted agents for Linux, &hellip; <a href=\"https:\/\/exceedthecloud.com\/?p=3134\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":3174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"kt_blocks_editor_width":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[16,4],"tags":[8,109,105,110,107],"class_list":["post-3134","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","category-practical-labs-series","tag-azure","tag-ci-cd","tag-devops","tag-github","tag-pipelines"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/04\/istockphoto-1146417905-612x612-1.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/3134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3134"}],"version-history":[{"count":2,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/3134\/revisions"}],"predecessor-version":[{"id":3173,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/3134\/revisions\/3173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/media\/3174"}],"wp:attachment":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}