{"id":87646,"date":"2020-07-22T18:56:57","date_gmt":"2020-07-22T18:56:57","guid":{"rendered":"https:\/\/www.red-gate.com\/simple-talk\/?p=87646"},"modified":"2022-04-24T20:52:07","modified_gmt":"2022-04-24T20:52:07","slug":"getting-started-with-azure-devops","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/devops\/tools\/getting-started-with-azure-devops\/","title":{"rendered":"Azure DevOps: Getting started"},"content":{"rendered":"<p>If you\u2019re working with software development now, regardless of what specific type of developer you are, chances are that you (or your team or company) make use of automated releasing pipelines. One option is Azure DevOps.<\/p>\n<p>There are tons of different tools (most of them agnostic, by the way) that help with the essential task of automating build processes. In the cloud era, you\u2019ve got plenty of options to set everything up without any need for further downloads or tools installation.<\/p>\n<p>In the world of .NET, <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/devops\/\">Azure DevOps<\/a> has been the leader of this race, bringing to the table flexibility, simplicity and full-integration (especially among Microsoft\u2019s solutions) to your application deployments. If you\u2019re part of the open-source world, aka GitHub user, or maybe work for a company that hosts their projects within the giant Octopus platform, you are halfway there, since Microsoft\u2019s GitHub ownership led the organization to facilitate things a little bit. Figure 1 shows a glimpse of the Azure DevOps features, some of which you will learn about in this article.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87647\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-49.png\" alt=\"Azure DevOps landing page\" width=\"2500\" height=\"1104\" \/><\/p>\n<p><strong>Figure 1. Azure DevOps features.<\/strong><\/p>\n<p>In this article, we\u2019re going to explore a bit about the basics of Azure DevOps. What is it actually? How to get started, set up, create important artifacts like repos and pipelines, and deploy\/release your code.<\/p>\n<p>For the purposes of this article, you must have installed <a href=\"https:\/\/visualstudio.microsoft.com\/pt-br\/vs\/community\/\">Visual Studio Community IDE<\/a> and created an account in <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/devops\/\">Azure DevOps<\/a>. Don\u2019t worry; it\u2019s all free!<\/p>\n<h2><a id=\"post-87646-_tc862jlzpj8m\"><\/a>Creating Your First Repo<\/h2>\n<p>Navigate to <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/devops\/\">Azure DevOps<\/a>. After you sign in and get redirected to the Azure DevOps home page, you may immediately see a form with some inputs to create a new project (Figure 2): <img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87648\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-50.png\" alt=\"Azure DevOps create a project\" width=\"673\" height=\"545\" \/><\/p>\n<p><strong>Figure 2. Form to create a new project.<\/strong><\/p>\n<p>Fill them in with your own project name and description. You can choose between <em>Public<\/em> and <em>Private<\/em> visibility because it works similarly to the GitHub repos. You\u2019re allowed as many private projects as you want.<\/p>\n<p>Within the <em>Advanced<\/em> toggle, you get to see two options: <em>Version control<\/em>, to define which versioning system your project makes use of, and <em>Work item process<\/em>, to identify in which type of agile working process your team works on. They\u2019re, by default, respectively set to <em>Git<\/em> and <em>Agile<\/em>.<\/p>\n<p>Click the <em>Create project<\/em> button. It can take a while until it gets finished.<\/p>\n<p>Once it\u2019s done, you\u2019ll be redirected to the <em>Summary<\/em> overview of the project which, until now, is empty.<\/p>\n<p>Next, you need to initialize the repository by getting the Git credentials. For this, click the <em>Repos<\/em> menu option in the left-side panel and may you see something like Figure 3.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87649\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-51.png\" alt=\"Azure DevOps  new repo\" width=\"2500\" height=\"1747\" \/><\/p>\n<p><strong>Figure 3. Adding some code to the project.<\/strong><\/p>\n<p>As you can see, there\u2019s more than one way to add some code to your project. You can clone it to an empty folder in your computer, push some existing repo to this project via command line or even import a repo that already exists.<\/p>\n<p>For now, simply initialize the project with a single <em>.gitignore<\/em> file. At the bottom of the page, change <em>Add a .gitignore<\/em> to <em>Add a gitignore: VisualStudio<\/em> by searching for Visual Studio in the dropdown. Then click the <em>Initialize<\/em> button.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"545\" height=\"105\" class=\"wp-image-87650\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-52.png\" \/><\/p>\n<p>Once complete, you\u2019ll be redirected to the <em>Files<\/em> view shown in Figure 4, in which you can see the project\u2019s contents just in GitHub web.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87651\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-53.png\" alt=\"Azure DevOps files in the repo\" width=\"1000\" height=\"588\" \/><\/p>\n<p><strong>Figure 4. The files in the repo<\/strong><\/p>\n<h2><a id=\"post-87646-_batqckancnax\"><\/a>The Local Version<\/h2>\n<p>Now that your Azure DevOps project is set, you can move on to its importing into the Visual Studio local environment.<\/p>\n<p>For this, open Visual Studio and click the <em>Clone a repository<\/em> option, right below the <em>Get started<\/em> column. The next screen asks for the Git\u2019s repo location, which could be in any Git address or even locally. However, you should use the <em>Azure DevOps <\/em>option placed at the bottom of the screen (Figure 5).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87652\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-54.png\" alt=\"Azure DevOps checking out code\" width=\"624\" height=\"300\" \/><\/p>\n<p><strong>Figure 5. Checking out code.<\/strong><\/p>\n<p>For this option to work, you must be logged in to your Microsoft account at Visual Studio, the same account you used to create the Azure DevOps project.<\/p>\n<p>Once the second window opens, you\u2019ll be able to see the list of available projects, including the one you just created as shown (Figure 6).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87653\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-55.png\" alt=\"Azure DevOps Connecting to the project\" width=\"563\" height=\"813\" \/><\/p>\n<p><strong>Figure 6. Connecting to the remote project.<\/strong><\/p>\n<p>Select a folder path of your preference and click <em>Clone<\/em>. Once the command is finished, the project opens up in the IDE. Now you can see the files of your projects under the <em>Solution Explorer<\/em> window. Remember, however, that it is not yet a recognizable .NET project, and neither is it inside of a solution.<\/p>\n<p>The second tab, <em>Team Explorer<\/em>, shows almost all the options needed to locally manage a project and coordinate with a team. You\u2019ll see options for pulling requests, synching branches, and seeing the changes.<\/p>\n<p>Now transform the project into a real .NET project. Run the following commands via command line:<\/p>\n<pre class=\"lang:c# theme:vs2012\">dotnet new sln -n SimpleTalk-DevOps\r\ndotnet new webapp -o src\/SimpleTalk-DevOps<\/pre>\n<p>This code creates both the solution and a web app for testing purposes. Then, run the following to add the web project to the solution:<\/p>\n<pre class=\"lang:c# theme:vs2012\">dotnet sln add src\/SimpleTalk-DevOps\/SimpleTalk-DevOps.csproj<\/pre>\n<p>To refresh the new structure into Visual Studio, double-click the <em>.sln<\/em> file and wait for the IDE to reopen the project. When you check the Solution Explorer, you\u2019ll see the solution and project as shown in Figure 7:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87654\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-56.png\" alt=\"Azure DevOps the solution explorer in Visual Studio\" width=\"347\" height=\"378\" \/><\/p>\n<p><strong>Figure 7. The solution<\/strong><\/p>\n<h2>Pushing to Azure DevOps<\/h2>\n<p>Now\u2019s time to push things up to the cloud. For this, you simply go to the <em>Team Explorer<\/em> view again and click <em>Changes<\/em>.<\/p>\n<p>All the project changes are listed, which in this case are all the project files. Enter a message into the commit field and hit the <em>Commit All and Sync<\/em> button, as shown in Figure 8.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87655\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-57.png\" alt=\"Committing change in Azure DevOps \" width=\"550\" height=\"394\" \/><\/p>\n<p><strong>Figure 8. Committing changes to Azure DevOps repo.<\/strong><\/p>\n<p>This command combines the <em>commit<\/em> and <em>push<\/em> to the remote repository in one step. When you go to the Azure DevOps web portal and refresh it, you\u2019ll see the changes there as shown in Figure 9.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87656\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-58.png\" alt=\"Azure DevOps the changes\" width=\"527\" height=\"356\" \/><\/p>\n<p><strong>Figure 9. The changes<\/strong><\/p>\n<h2>Creating Your First Pipeline<\/h2>\n<p>A pipeline, as the name suggests, is the tube in which your software delivery process is automated. In other words, it is a sequence of automated steps to build code, run your test suites, create tagged versions of your code repository, and, most importantly, deliver everything to production.<\/p>\n<p>Now that you have a repo with code synched to the local project, move on to your first pipeline creation.<\/p>\n<p>Go back to the SimpleTalk-DevOps project in Azure DevOps. Click the <em>Pipelines<\/em> menu option in the sidebar menu and then click <em>Create Pipeline<\/em> as shown in Figure 10.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87657\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-59.png\" alt=\"Azure DevOps pipeline\" width=\"826\" height=\"605\" \/><\/p>\n<p><strong>Figure 10. The pipeline<\/strong><\/p>\n<p>There are four steps to finish a pipeline creation, and the first one is creating the repository connection. The next screen asks about the location of your code. Take a look at Figure 11. Azure DevOps allows several repository vendors such as GitHub and Bitbucket.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87658\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-60.png\" alt=\"Select the repository system\" width=\"834\" height=\"698\" \/><\/p>\n<p><strong>Figure 11. Selecting the repository system.<\/strong><\/p>\n<p>As you may have guessed, you should select the first option, <em>Azure Repos Git<\/em>. The following screen shown in Figure 12 retrieves the Azure DevOps repo that you created before.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87659\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-61.png\" alt=\"The repo\" width=\"755\" height=\"221\" \/><\/p>\n<p><strong>Figure 12. The repo<\/strong><\/p>\n<p>Select it, and the wizard setup automatically moves to the next step, which is the pipeline configuration (Figure 13).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87660\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-62.png\" alt=\"List of available pipeline configs\" width=\"1035\" height=\"865\" \/><\/p>\n<p><strong>Figure 13. List of available pipeline configs.<\/strong><\/p>\n<p>Azure DevOps allows creating pipelines for many different technologies, some of them out of the Microsoft world (like Android, Gradle, Node.js, Python, and many more). That\u2019s one of the main benefits of using Azure DevOps. With a few steps, you can quickly get anything you want up and running.<\/p>\n<p>Click the <em>Show more<\/em> button and search for the <em>ASP.NET Core<\/em> option shown in Figure 14, which is the right type for the project we\u2019ve created.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87661\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-63.png\" alt=\"Choose ASP.NET Core\" width=\"641\" height=\"239\" \/><\/p>\n<p><strong>Figure 14. Choose ASP.NET Core<\/strong><\/p>\n<p>Click on it, and you\u2019ll be redirected to the final step: the reviewing of your pipeline YAML. Yes, that\u2019s the default configuration format Azure DevOps uses shown in Figure 15.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87662\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-64.png\" alt=\"The pipeline YAML\" width=\"713\" height=\"555\" \/><\/p>\n<p><strong>Figure 15. The pipeline YAML<\/strong><\/p>\n<p>It\u2019s important to note also that this YAML file must be within the same project folder, which means that it needs to be committed there as well. But don\u2019t worry, Azure DevOps does that for you.<\/p>\n<p>Click the <em>Save and run<\/em> button, fill in with an optional description for this action and click <em>Save and run<\/em> again.<\/p>\n<p>After that, Azure DevOps is going to commit the changes, push them, create the pipeline and execute it right away. In the screen that follows, you may wait a while until the execution completes and should see something like Figure 16.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87663\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-65.png\" alt=\"Pipeline execution results.\" width=\"989\" height=\"971\" \/><\/p>\n<p><strong>Figure 16. Pipeline execution results.<\/strong><\/p>\n<p>If you click in the job that successfully finished, you\u2019ll be led to the details execution page (Figure 17).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87664\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-66.png\" alt=\"Job execution details\" width=\"1581\" height=\"812\" \/><\/p>\n<p><strong>Figure 17. Job execution details.<\/strong><\/p>\n<p>You can review the detailed logs of each step as well as the status and any errors.<\/p>\n<p>In case your project uses any NuGet dependencies, they need to be addressed in the Azure DevOps project as well. To change this, you can go the <em>Pipelines<\/em> menu option again and mouse over the created pipeline. You may see a menu option hovering at the end of the row item, so click it and select the <em>Edit <\/em>option.<\/p>\n<p>In the right-side panel, under <em>Tasks<\/em>, search for <em>NuGet<\/em> and click the \u201c<em>NuGet<\/em>\u201d option. Figure 18 shows how the screen looks.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87665\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-67.png\" alt=\"Setting up NuGet.\" width=\"448\" height=\"792\" \/><\/p>\n<p><strong>Figure 18. Setting up NuGet.<\/strong><\/p>\n<p>You can select from the NuGet command to execute within this task, the path to the solution (leave it as it is), and what feed to use (the one you\u2019d explicitly insert there or a feed stated in your repo\u2019s <em>NuGet.config<\/em> file).<\/p>\n<p>Let\u2019s test it out, click the <em>Add<\/em> button and see how your yml file gets updated. Now, every time this pipeline executes, one extra step will be added to the end of it, the NuGet restore command.<\/p>\n<p>For instance, this command restores all the NuGet packages and install the ones that are missing, but in fact it\u2019s not necessary in a real-world scenario, since we\u2019re already running the dotnet build, which takes care of this alone. But we\u2019ll keep it for testing purposes.<\/p>\n<p>Click, now, the <em>Save<\/em> button in the right top of the screen, and then <em>Save<\/em> again in the screen that follows it, like in Figure 19 below.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87666\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-68.png\" alt=\"The save screen\" width=\"587\" height=\"900\" \/><\/p>\n<p><strong>Figure 19. The save screen<\/strong><\/p>\n<p>After that, you can click the <em>Run<\/em> button in the right top side of the screen. That will trigger another pipeline execution. Wait for it to complete, and you\u2019ll have the following execution outputs shown in Figure 20:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87667\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-69.png\" alt=\"The NuGetCommand\" width=\"1583\" height=\"840\" \/><\/p>\n<p><strong>Figure 20. The NuGetCommand<\/strong><\/p>\n<p>Look, a new step <em>NuGetCommand<\/em> was added with a successful execution. This is how you must face Azure pipelines, as a bunch of sequenced steps to achieve an overall execution.<\/p>\n<h2><a id=\"post-87646-_9j27ethh002k\"><\/a>Creating Your First Release<\/h2>\n<p>Another essential step of a building process is releasing. After you have a project repo set and a pipeline created and successfully executing, now you must release it.<\/p>\n<p>For this, click the left-side panel\u2019s menu option <em>Pipelines &gt; Releases<\/em>. Click the <em>New pipeline<\/em> button.<\/p>\n<p>The next screen automatically displays a list of template options for your release pipeline. When you get ready to send your code for production, with an ASP.NET project in hand, you should select the option <em>Azure App Service deployment<\/em>. However, since this configuration requires a paid Azure subscription plan, you\u2019ll use an <em>Empty job<\/em> template to demonstrate the steps. Make sure to select the Empty Job option as shown in Figure 21.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87668\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-70.png\" alt=\" Selecting an empty job template.\" width=\"766\" height=\"840\" \/><\/p>\n<p><strong>Figure 21. Selecting an empty job template.<\/strong><\/p>\n<p>Next, you can leave the stage name as it is and close the <em>Stage<\/em> window.<\/p>\n<p>Now, you need to add an artifact to handle the triggering of the stage job execution right after any pipeline build happens. It is going to be an automatic process.<\/p>\n<p>Click the <em>+ Add an artifact<\/em> button and, then, keep <em>Build<\/em> selected. Right below, you should fill in the project and source (build pipeline) for this artifact. Make sure to select everything, as shown in Figure 22.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87669\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-71.png\" alt=\"Adding an artifact.\" width=\"748\" height=\"849\" \/><\/p>\n<p><strong>Figure 22. Adding an artifact.<\/strong><\/p>\n<p>Click the <em>Add<\/em> button. There\u2019s only one more step. Click the lightning icon above the created artifact and enable the first toggle button that appears, the one related to the <em>Continuous deployment trigger<\/em>. That\u2019s the config which allows the deployment to occur right after every build in the project.<\/p>\n<p>Finally, click the <em>Save<\/em> button, at the top of the page, to guarantee all these changes are persisted.<\/p>\n<p>To test, go back to the build pipeline and click <em>Run pipeline<\/em>. Once the build is successfully finished, go to the <em>Releases<\/em> view again and check for stage completion (Figure 23).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-87670\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2020\/07\/word-image-72.png\" alt=\"Release pipeline successfully triggered and finished.\" width=\"1572\" height=\"328\" \/><\/p>\n<p><strong>Figure 23. Release pipeline successfully triggered and finished.<\/strong><\/p>\n<h2><a id=\"post-87646-_11abnlqguyi5\"><\/a>Summary<\/h2>\n<p>Congrats! You\u2019ve covered the basics of Azure DevOps. My job here was simple since the platform is so clean and straightforward. Once you understand the core concepts behind the repositories, pipelines, deployments, and releases, automating the whole thing gets pretty easy.<\/p>\n<p>For additional reading, I\u2019d highly recommend the <a href=\"https:\/\/docs.microsoft.com\/en-us\/learn\/modules\/get-started-with-devops\/1-introduction\">official docs<\/a>, which are rich in details over each of the steps covered so far.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft provides Azure DevOps for hosting your repos, setting up pipelines and more. Diogo Souza shows you how to get started using Azure DevOps in this article.&hellip;<\/p>\n","protected":false},"author":320401,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[137091,143521],"tags":[95506],"coauthors":[60461],"class_list":["post-87646","post","type-post","status-publish","format-standard","hentry","category-azure","category-tools","tag-automate"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/87646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/320401"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=87646"}],"version-history":[{"count":4,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/87646\/revisions"}],"predecessor-version":[{"id":89478,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/87646\/revisions\/89478"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=87646"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=87646"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=87646"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=87646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}