<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jacob Smith</title>
    <description>The latest articles on DEV Community by Jacob Smith (@jsmithdenverdev).</description>
    <link>https://dev.to/jsmithdenverdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F103073%2Fdd11ddfc-2dd0-4bbe-aabd-eb813113458e.jpeg</url>
      <title>DEV Community: Jacob Smith</title>
      <link>https://dev.to/jsmithdenverdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsmithdenverdev"/>
    <language>en</language>
    <item>
      <title>Composing packages into applications?</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Thu, 06 Aug 2020 20:49:37 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/composing-packages-into-applications-mff</link>
      <guid>https://dev.to/jsmithdenverdev/composing-packages-into-applications-mff</guid>
      <description>&lt;p&gt;Hi there! This is a question I recently posted to Reddit. I wanted to post it here as well in order to get even more insight :) .&lt;/p&gt;

&lt;p&gt;I am a new Gopher coming from a more object oriented background (uh-oh! over complexity alert!). I have been really enjoying my time in Go so far, and I adore the simplicity. Something that I've been trying to understand is how to go about composing packages into an application (and if I'm overthinking it).&lt;/p&gt;

&lt;p&gt;From what I've gathered so far, packages in Go should be organized by feature over function, and should be narrow in focus. That all makes sense to me, and its actually been a really natural process creating packages. What I can't quite figure out is the best way to compose those small individual packages, into a more complex application with business logic and cross cutting concerns. I also want to be clear, by cross cutting concerns I am &lt;em&gt;not&lt;/em&gt; talking about things like logging. That seems to always be the default question on peoples minds when trying to understand relationships across domains.&lt;/p&gt;

&lt;p&gt;Here's a (contrived) example of what I'm asking about.&lt;/p&gt;

&lt;p&gt;I am creating a Go version of the &lt;a href="https://www.reddit.com/r/funny/comments/owx3v/so_my_little_cousin_posted_on_fb_that_he_was/"&gt;cat-facts joke that circulated on Reddit years ago&lt;/a&gt;. Basically I want the ability to create and delete subscribers, and the ability to send a fact to all the subscribers.&lt;/p&gt;

&lt;p&gt;I plan on having two binaries to accomplish this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An API that exposes 2 endpoints. One for creating subscribers, and one for deleting subscribers.&lt;/li&gt;
&lt;li&gt;A standalone binary that can be run via a cron job. It will get a list of subscribers from my data store, load a fact from an &lt;a href="https://catfact.ninja/"&gt;external api&lt;/a&gt;, and then loop through those subscribers sending the fact to each one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In my mind this has broken into 3 packages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;subscribers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distribution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;facts&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've included some sample code from each package below. The packages are all very narrow in focus and don't have much "business logic".&lt;/p&gt;

&lt;h3&gt;
  
  
  subscribers
&lt;/h3&gt;

&lt;p&gt;Subscribers contains my subscriber model, as well as interfaces for reading, writing, listing and deleting subscribers. I also store implementations of those interfaces here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Contact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Subscriber&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Contact&lt;/span&gt; &lt;span class="n"&gt;Contact&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;SubscriberReader&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt; &lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;SubscriberWriter&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="n"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;SubscriberLister&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="n"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;SubscriberDeleter&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contact&lt;/span&gt; &lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// implementations of interfaces...&lt;/span&gt;
&lt;span class="c"&gt;// for instance, sqlite reader, writer, lister and deleter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  distribution
&lt;/h3&gt;

&lt;p&gt;Distribution contains the interface and implementation for sending things.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;TextSender&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;SendText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// implementations of interfaces...&lt;/span&gt;
&lt;span class="c"&gt;// for instance, twilio sender&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  facts
&lt;/h3&gt;

&lt;p&gt;Facts contains my fact model and the interface and implementation for retrieving one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;facts&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Fact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;FactRetriever&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Retrieve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// implementations of interfaces...&lt;/span&gt;
&lt;span class="c"&gt;// for instance, a retriever for the catfacts api&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like stated above, each of those packages are small and are good for actions in 1 domain. My confusion arises when I think about stitching those pieces together into an application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 1 - Creating a Subscriber
&lt;/h2&gt;

&lt;p&gt;When I create a subscriber I want to do 3 things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure a subscriber doesn't already exist with a particular &lt;code&gt;Contact&lt;/code&gt; - I can utilize a &lt;code&gt;subscribers.SubscriberReader&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Write the subscriber to the data store - I can utilize a &lt;code&gt;subscribers.SubscriberWriter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Send a welcome message to the subscriber - I can utilize a &lt;code&gt;distribution.TextSender&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;CreateSubscriber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubscriberReader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubscriberWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextSender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Meow! Welcome to catfacts"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example I want to execute logic that would cross boundaries. Because I want to perform actions from the &lt;code&gt;subscribers&lt;/code&gt; package and the &lt;code&gt;distribution&lt;/code&gt; package. I'm not sure where this code would live. It seems to me that this should not live in the &lt;code&gt;subscribers&lt;/code&gt; package, because it is no longer just dealing with &lt;code&gt;subscribers&lt;/code&gt;. Is there a common approach to this in Golang? A place where I would compose my business logic so to speak. Part of me feels like creating an additional &lt;code&gt;application&lt;/code&gt; package that becomes the place where I compose all my functionality, but I'm not sure if that would be considered an anti-pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2 - Sending Facts
&lt;/h3&gt;

&lt;p&gt;When I send facts I want to do 3 things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Load the list of all subscribers&lt;/li&gt;
&lt;li&gt;Load a random fact from a data source&lt;/li&gt;
&lt;li&gt;Loop through the subscribers and send each one the fact
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;SendFactToSubscribers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;lister&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubscriberLister&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retriever&lt;/span&gt; &lt;span class="n"&gt;facts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FactRetriever&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextSender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="n"&gt;subs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;lister&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;retriever&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RetrieveFact&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// error handling excluded for brevity...&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subscriber&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;subscribers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subscriber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again with this example I am executing logic that crosses domain boundaries. With this example I am also curious if I am "overloading" the function. Would someone with more Go experience than I write this function the same way? Or would it make more sense to break it down a bit. For instance pass in a &lt;code&gt;[]Subscriber&lt;/code&gt; as a parameter instead of an interface for listing them. If that's the case, then I would be back to trying to understand where to compose all the functionality together.&lt;/p&gt;

&lt;p&gt;I am sure I am over complicating this. But part of the fun of learning a new language is learning all the best practices for that language. I love these types of design related challenges.&lt;/p&gt;

&lt;p&gt;Any insight would be greatly appreciated!&lt;/p&gt;

</description>
      <category>go</category>
      <category>question</category>
      <category>help</category>
    </item>
    <item>
      <title>Introduction to Azure Functions Pt. 5 - Automate the function deployment with a CI/CD pipeline</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:17:36 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-5-automate-the-function-deployment-with-a-ci-cd-pipeline-2mi2</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-5-automate-the-function-deployment-with-a-ci-cd-pipeline-2mi2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this post we will automate the deployment process of our Azure Function. We will setup a CI/CD process in Azure Devops that is run when we check into master. Next we will create a build pipeline that will build our entire solution and output an artifact for the function project. Finally we will create a release pipeline that will run automatically after the build succeeds and will take the build artifact and deploy it to our Function App. &lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;An Azure Devops account. Sign up for an account &lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;here&lt;/a&gt;. I am using the free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an Azure Devops project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to the Azure Devops portal if you have not yet already.&lt;/li&gt;
&lt;li&gt;Create a new Azure Devops project.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Project Name&lt;/em&gt; name your project &lt;strong&gt;Hello Azure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Create project&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create a build pipeline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to the Azure Devops portal if you have not yet already.&lt;/li&gt;
&lt;li&gt;Navigate to your &lt;strong&gt;Hello Azure&lt;/strong&gt; project.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Pipelines&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Builds&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;New pipeline&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Connect&lt;/em&gt; select the source control provider your code is hosted under. In my case GitHub.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D_Bjjvfm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ZmHOmAh.png" alt=""&gt;

&lt;ol&gt;
&lt;li&gt;If you have not granted Azure Devops access to your GitHub account you will be redirected to a screen to grant access.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Select&lt;/em&gt; select your repository. In my case &lt;code&gt;HelloAzure&lt;/code&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_u26C2Y9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/OKakVt2.png" alt=""&gt;

&lt;ol&gt;
&lt;li&gt;You will be redirected to a screen to grant Azure Devops access to your repository.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Configure&lt;/em&gt; select &lt;strong&gt;Starter Pipeline&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Cvbi05n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/yc8SR1k.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Under &lt;em&gt;Review&lt;/em&gt; modify the contents of &lt;code&gt;azure-pipelines.yml&lt;/code&gt; to be the following.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

&lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;vmImage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ubuntu-latest'&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;dotnet restore&lt;/span&gt;
    &lt;span class="s"&gt;dotnet build --configuration Release&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DotNetCoreCLI@2&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publish&lt;/span&gt;
    &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--configuration&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Release&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--output&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;publish_output'&lt;/span&gt;
    &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;HelloAzure.Functions/HelloAzure_Functions.csproj'&lt;/span&gt;
    &lt;span class="na"&gt;publishWebProjects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;modifyOutputPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;zipAfterPublish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ArchiveFiles@2&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files'&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;rootFolderOrFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(System.DefaultWorkingDirectory)/publish_output"&lt;/span&gt;
    &lt;span class="na"&gt;includeRootFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;archiveFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PublishBuildArtifacts@1&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;PathtoPublish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"&lt;/span&gt;
    &lt;span class="na"&gt;ArtifactName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;drop"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;trigger&lt;/code&gt; lets the pipeline know what can trigger it. In this case a checkin to &lt;code&gt;master&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pool&lt;/code&gt; is the environment we will run our build in.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;steps&lt;/code&gt; are the build steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The first step runs two command line commands&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet restore
&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet build &lt;span class="nt"&gt;--configuration&lt;/span&gt; Release
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;The first command restores any nuget packages our solution depends on.&lt;/li&gt;
&lt;li&gt;The second command will build the entire solution in release configuration.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;The second step uses the dotnet core CLI to run a publish command on the project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We specify the configuration to be &lt;code&gt;Release&lt;/code&gt; and the output of the publish to go into a directory named &lt;code&gt;publish_output&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We specify the &lt;code&gt;HelloAzure.Functions&lt;/code&gt; project as the one to publish.&lt;/li&gt;
&lt;li&gt;We set &lt;code&gt;publishWebProjects&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; to prevent the dotnet cli from throwing an exception while it looks for web projects.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We set &lt;code&gt;modifyOutputPath&lt;/code&gt; to false in order to keep the output directory flat. This will be an important piece to publishing. &lt;br&gt;
If &lt;code&gt;modifyOutputPath&lt;/code&gt; is set to true we will get get a &lt;code&gt;publish_output&lt;/code&gt; that looks like the following.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
+-- publish_output/
|   +-- HelloAzure.Functions/
|       +-- ... published files

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;We want an output that looks like the following.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
+-- publish_output/
|   +-- ... published files
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will be running a separate step to archive the &lt;code&gt;publish_output&lt;/code&gt; directory so we set &lt;code&gt;zipAfterPublishing&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The third step uses the &lt;code&gt;ArchiveFiles&lt;/code&gt; task to turn &lt;code&gt;publish_output&lt;/code&gt; into an archive that has the name of the build.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The last step uses the &lt;code&gt;PublishBuildArtifacts&lt;/code&gt; task to publish the build artifacts archive in a spot that our release pipeline can look for it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you are happy with the &lt;code&gt;azure-pipeline.yml&lt;/code&gt; file click on &lt;em&gt;Save and run&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--itsT82Sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/9vVjka5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--itsT82Sg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/9vVjka5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;In the &lt;em&gt;Save and run&lt;/em&gt; pane enter a commit message and choose a branch to commit the file to. In my case I just went with &lt;code&gt;master&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This will add the &lt;code&gt;azure-pipelines.yml&lt;/code&gt; file to the root of your repo and commit the change.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;The build will now attempt to run.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If you get build failures verify that the branch you commited the &lt;code&gt;azure-pipelines-yml&lt;/code&gt; file to is a branch that has your solution in it.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create a release pipeline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Login to the Azure Devops portal if you have not yet already.&lt;/li&gt;
&lt;li&gt;Navigate to your &lt;strong&gt;Hello Azure&lt;/strong&gt; project.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Pipelines&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Releases&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;New pipeline&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Select a template&lt;/em&gt; pane select &lt;em&gt;Or start with an Empty job&lt;/em&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XLnVefPB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/gAOGtne.png" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adding a Stage
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;em&gt;Stage&lt;/em&gt; pane will open after selecting &lt;em&gt;Or start with an Empty job&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Stage&lt;/em&gt; pane under &lt;em&gt;Stage name&lt;/em&gt; enter &lt;code&gt;Dev&lt;/code&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YgkAOG-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/gct6sde.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Close the &lt;em&gt;Stage&lt;/em&gt; pane.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adding an Artifact
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;em&gt;Add an artifact&lt;/em&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hNZ74_N6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/EQQKmfQ.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Add an artifact&lt;/em&gt; pane ensure &lt;em&gt;Source type&lt;/em&gt; is set to &lt;strong&gt;Build&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ensure &lt;em&gt;Project&lt;/em&gt; is set to &lt;strong&gt;Hello Azure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Source (build pipeline)&lt;/em&gt; select &lt;strong&gt;HelloAzure&lt;/strong&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cdRTCpF5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/cRjhRCH.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Click on Add
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--db2X-I41--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/meEiM5D.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Continuous deployment trigger&lt;/em&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qiby1CM1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/8gLMVCH.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Continuous deployment trigger&lt;/em&gt; pane toggle the switch for &lt;em&gt;Continuous deployment trigger&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Build branch filters&lt;/em&gt; select the branch you'd like to run on.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ztbfLIJD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/T3cV93k.png" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adding tasks to the Stage
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;em&gt;1 job, 0 task&lt;/em&gt; under the &lt;em&gt;Dev&lt;/em&gt; Stage.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xbNuQnmf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/t1Mnn22.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Tasks&lt;/em&gt; list click the &lt;em&gt;+&lt;/em&gt; icon on the &lt;em&gt;Agent job&lt;/em&gt; list item.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---dYzIbw_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/AjboFcj.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;em&gt;Add tasks&lt;/em&gt; pane search for &lt;strong&gt;Azure Functions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Add&lt;/em&gt; on the &lt;strong&gt;Azure Functions&lt;/strong&gt; task.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9C_hPpen--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/JxxLFHk.png" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configure the &lt;em&gt;Azure Function App Deploy&lt;/em&gt; task
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the configuration pane under &lt;em&gt;Azure subscription&lt;/em&gt; select your &lt;strong&gt;Free Trial&lt;/strong&gt; subscription.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PN8HXQIG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/wxTTEBs.png" alt=""&gt;

&lt;ol&gt;
&lt;li&gt;Click on Authorize&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;App type&lt;/em&gt; select &lt;strong&gt;Function App on Windows&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;App name&lt;/em&gt; select your Function App name.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wRFI_jpi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/8ZNnR4D.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Package or folder&lt;/em&gt; ensure the value is set to &lt;code&gt;$(System.DefaultWorkingDirectory)/*&lt;em&gt;/&lt;/em&gt;.zip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Save&lt;/em&gt; in the menu-bar.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tw-2D7jf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/dCiyYJU.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Click on &lt;em&gt;Create release&lt;/em&gt; in the menu-bar.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uxGJGCgi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/vvRrUE2.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Follow the steps in the &lt;em&gt;Create release&lt;/em&gt; pane.&lt;/li&gt;
&lt;li&gt;Navigate back to the pipeline details page and click on &lt;em&gt;Deploy&lt;/em&gt; under dev.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--neBbfm-J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/6LEXG7B.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Follow the steps in the &lt;em&gt;Deploy&lt;/em&gt; pane.&lt;/li&gt;
&lt;li&gt;Your deployment will now be queued.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;In this post we setup a CI/CD process in Azure devops. We created a build pipeline that will automatically build our project. We then created a release pipeline that will take those build artifacts and automatically deploy them to our Function App.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introduction to Azure Functions Pt. 4 - Deploying the Azure Function</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:16:36 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-4-deploying-the-azure-function-2l67</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-4-deploying-the-azure-function-2l67</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this post we will deploy the Azure Function we created to the resources in Azure that we created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To deploy the Azure Function we will be using the azure-functions-core-tools cli. Instructions for installing the CLI can be found &lt;a href="https://github.com/Azure/azure-functions-core-tools#installing"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The azure-functions-core-tools cli will need the Azure CLI in order to authenticate you. Installation instructions for the Azure CLI can be found &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will be using the command line in this section. Some basic knowledge of the command line will be useful. &lt;/p&gt;

&lt;p&gt;Shell commands will be prefixed with &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Login with the Azure CLI
&lt;/h2&gt;

&lt;p&gt;To publish your function project to a Function App you must login with the Azure CLI.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In any directory login to the Azure CLI&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az login
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This will launch a login process in your default browser. Login to Azure to continue.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploying the Azure Function
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Change directories into the &lt;code&gt;Functions&lt;/code&gt; project of your locally cloned repository.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/HelloAzure/HelloAzure.Functions/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy to your Function App&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;func azure functionapp publish &amp;lt;FunctionAppName&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;Substitute &lt;code&gt;&amp;lt;FunctionAppName&amp;gt;&lt;/code&gt; with the name of the Function App you created in Azure.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This will build and publish your function project to the specified Function App.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;You should see console output similar to the following&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;Getting site publishing info...
Creating archive &lt;span class="k"&gt;for &lt;/span&gt;current directory...
Uploading 3.45 MB &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="c"&gt;#########################################]&lt;/span&gt;
Upload completed successfully.
Deployment completed successfully.
Syncing triggers...
Functions &lt;span class="k"&gt;in&lt;/span&gt; &amp;lt;FucntionAppName&amp;gt;:
    SayHello - &lt;span class="o"&gt;[&lt;/span&gt;httpTrigger]
        Invoke url: &amp;lt;FunctionAppInvokeURL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You may test your deployed function by visiting the Invoke url and adding a query parameter for &lt;code&gt;name&lt;/code&gt;. If you see a response with the message &lt;code&gt;Hello, &amp;lt;name&amp;gt;&lt;/code&gt; congrats! Your function has been deployed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;In this post we authenticated with the Azure CLI. We then deployed our function project to our Function App. Finally we verified that the function app was succesfully deployed by visiting the Invoke url.&lt;/p&gt;

&lt;p&gt;The next step is to automate the function deployment with a CI/CD pipeline.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introduction to Azure Functions Pt. 3 - Creating the Azure Function resources</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:15:22 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-3-creating-the-azure-function-resources-pfc</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-3-creating-the-azure-function-resources-pfc</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this post we will be creating resources in Azure that will be used to run the &lt;code&gt;SayHello&lt;/code&gt; Azure Function we created in our &lt;code&gt;HelloAzure.Functions&lt;/code&gt; project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;A Microsoft Azure account. Sign up for an account &lt;a href="https://azure.microsoft.com/en-us/free/"&gt;here&lt;/a&gt;. I am using the free tier of azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Azure Function resources
&lt;/h2&gt;

&lt;p&gt;We will be creating a few resource in Azure to facilitate execution of the &lt;code&gt;SayHello&lt;/code&gt; Azure Function.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Resource Group

&lt;ul&gt;
&lt;li&gt;A resource group is a collection of resources in Azure. All the resources we manually create (and any resource dependencies that are automatically created) will be added to this group.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Function App

&lt;ul&gt;
&lt;li&gt;A Function App allows us to group related functions together into one unit and manage deployments, resource sharing, and more.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating an Azure Resource Group
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login to the Azure portal if you are not yet logged in.&lt;/li&gt;
&lt;li&gt;Navigate to the Resource Groups list and click on &lt;em&gt;Create resource group&lt;/em&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r0o0l0uv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ycT8jMA.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the Create a resource group wizard ensure you have selected &lt;strong&gt;Free Trial&lt;/strong&gt; under &lt;em&gt;Subscription&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Resource group&lt;/em&gt; name your group &lt;code&gt;HelloAzureGroup&lt;/code&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SxKLjHSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/LoRnlTX.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Skip tags and move on to &lt;em&gt;Review + create&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Ensure the resource group details are correct and Click on &lt;em&gt;Create&lt;/em&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ca57g_4u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/8GwLZYa.png" alt=""&gt; &lt;/li&gt;
&lt;li&gt;Back on the Resource groups list you should now have a new Resource group named &lt;code&gt;HelloAzureGroup&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mnjI5Zlo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/qpxFbIq.png" alt=""&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Creating a Function App
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login to the Azure portal if you are not yet logged in.&lt;/li&gt;
&lt;li&gt;Navigate to the Function Apps list and click on &lt;em&gt;Create undefined&lt;/em&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kwC2M27P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/aWMB9vj.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;In the Function App wizard ensure you have selected &lt;strong&gt;Free Trial&lt;/strong&gt; under &lt;em&gt;Subscription&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Resource Group&lt;/em&gt; select &lt;strong&gt;HelloAzureGroup&lt;/strong&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KWQPD9ml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/CuI0Btv.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Function App name&lt;/em&gt; name your function app &lt;code&gt;HelloAzureFunctionApp-&amp;lt;GUID&amp;gt;&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5GfHvNG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/0ureBJW.png" alt=""&gt;

&lt;ol&gt;
&lt;li&gt;A function app in Azure must have a unique name, which is why we postfix the name with a GUID.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Publish&lt;/em&gt; ensure &lt;strong&gt;Code&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;Under &lt;em&gt;Runtime stack&lt;/em&gt; select &lt;strong&gt;.NET Core&lt;/strong&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--heGj_COm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/bK6iy45.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Select whatever region is appropriate for you (I selected &lt;strong&gt;Central US&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;You may skip Hosting, Monitoring, and Tags.&lt;/li&gt;
&lt;li&gt;Ensure your function app details are correct and click on &lt;em&gt;Create&lt;/em&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yHpHYNfB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/opb9vDz.png" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;Back on the Function App list you should now have a new Function app named &lt;code&gt;HelloAzureFunctionApp-&amp;lt;GUID&amp;gt;&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g1gxxcu---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/hwNTjWt.png" alt=""&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;In this post we created resources in Azure that will be used to run the &lt;code&gt;SayHello&lt;/code&gt; Azure Function. We created an Azure Resource Group to contain the resources we create, and resource dependencies that are automatically created. We also created a Function App to deploy our function project to.&lt;/p&gt;

&lt;p&gt;The next step is deploying the Azure Function.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introduction to Azure Functions Pt. 2 - Creating the Azure Function</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:11:07 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-2-creating-the-azure-function-1ab7</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-2-creating-the-azure-function-1ab7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this post we will be creating an Azure Function in our &lt;code&gt;HelloAzure.Functions&lt;/code&gt; project. We will add an assembly reference to &lt;code&gt;HelloAzure.BusinessLogic&lt;/code&gt; in order to add some contrived business logic. Finally we will run the function project locally in order to verify the function works as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To create the Azure Function we will be using the azure-functions-core-tools cli. Instructions for installing the CLI can be found &lt;a href="https://github.com/Azure/azure-functions-core-tools#installing"&gt;here&lt;/a&gt;. To add an assembly reference from our BusinessLogic assembly we'll use the dotnet cli which is included in the .NET Core SDK. We will be using version 2.1 of the SDK. The SDK installer can be found &lt;a href="https://dotnet.microsoft.com/download"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;We will be using the command line in this section. Some basic knowledge of the command line will be useful. &lt;/p&gt;

&lt;p&gt;Shell commands will be prefixed with &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This wiki assumes that you have created a repository in a source control provider such as GitHub and that you have cloned that repository locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Azure Function
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Change directories into the &lt;code&gt;Functions&lt;/code&gt; project of your locally cloned repository.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/HelloAzure/HelloAzure.Functions/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new Azure Function in the project.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;func new
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;This will start the function creation wizard.&lt;/li&gt;
&lt;li&gt;When prompted for a trigger select &lt;code&gt;Http Trigger&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Name the function &lt;code&gt;SayHello&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should see the following output&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="s2"&gt;"SayHello"&lt;/span&gt; was created successfully from the &lt;span class="s2"&gt;"HttpTrigger"&lt;/span&gt; template.
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Your &lt;code&gt;HelloAzure.Functions/&lt;/code&gt; directory should now have a &lt;code&gt;SayHello.cs&lt;/code&gt; file in it.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
+-- HelloAzure.Functions/
|   +-- SayHello.cs
|   +-- ...
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Adding a reference to our BusinessLogic assembly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your &lt;code&gt;HelloAzure.Functions/&lt;/code&gt; directory add a reference to the BusinessLogic assembly.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet add reference ../HelloAzure.BusinessLogic/HelloAzure.BusinessLogic.csproj
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;This command will add a project reference to your &lt;code&gt;HelloAzure_Functions.csproj&lt;/code&gt; file that points to the &lt;code&gt;HelloAzure.BusinessLogic&lt;/code&gt; project.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Add "business logic" to the function
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In a text editor modify the contents of &lt;code&gt;SayHello.cs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.IO&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Threading.Tasks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Mvc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Azure.WebJobs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Azure.WebJobs.Extensions.Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Logging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Newtonsoft.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;HelloAzure.BusinessLogic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;HelloAzure.Functions&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SayHello&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SayHello"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;GreetingService&lt;/span&gt; &lt;span class="n"&gt;greetingService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;GreetingService&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C# HTTP trigger function processed a request."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;requestBody&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StreamReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ReadToEndAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DeserializeObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;greetingService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ActionResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BadRequestObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Please pass a name on the query string or in the request body"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;In our changes we added a using statement for &lt;code&gt;HelloAzure.BusinessLogic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Next we instantiated an instance of the &lt;code&gt;GreetingService&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Finally we modified the return logic to generate a greeting using our &lt;code&gt;GreetingService&lt;/code&gt; instead of using a hard-coded string.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Running the function locally
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your &lt;code&gt;HelloAzure.Functions/&lt;/code&gt; directory start the function project.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;func start &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;This will build the functions project and start it.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--build&lt;/code&gt; flag is needed since this is a .NET Core functions project and it must be built.&lt;/li&gt;
&lt;li&gt;This will start an HTTP Server and point your functions to it.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should see output containing the following.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Http Functions:

SayHello: &lt;span class="o"&gt;[&lt;/span&gt;GET,POST] http://localhost:7071/api/SayHello
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you visit the URL above in a browser and add a query string parameter for &lt;code&gt;name&lt;/code&gt; you should see a response with the message &lt;code&gt;Hello, &amp;lt;name&amp;gt;&lt;/code&gt;. If you do then congrats! Your function is working.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;In this post we added an Azure Function to our &lt;code&gt;HelloAzure.Functions&lt;/code&gt; project. We added a reference to our &lt;code&gt;HelloAzure.BusinessLogic&lt;/code&gt; class library in order to add some contrived business logic to illustrate how you might add logic to a function. Finally we ran our function project locally in order to verify the function works.&lt;/p&gt;

&lt;p&gt;This would be a good time to commit the changes you've made to source.&lt;/p&gt;

&lt;p&gt;The next step is creating Azure Function resources.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introduction to Azure Functions Pt. 1 - Creating the .NET Core Solution</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:01:38 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-1-creating-the-net-core-solution-2enh</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-1-creating-the-net-core-solution-2enh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this post we will be creating a .NET Core solution, a class library to hold shared business logic, and an Azure Functions project. We will also link both projects to the solution, and add some basic business logic to our class library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To create the .NET Core solution and the business logic class library we will be using the dotnet cli which is included in the .NET Core SDK. We will be using version 2.1 of the SDK. The SDK installer can be found &lt;a href="https://dotnet.microsoft.com/download"&gt;here&lt;/a&gt;. To create the Azure Function project we will be using the azure-functions-core-tools cli. Instructions for installing the CLI can be found &lt;a href="https://github.com/Azure/azure-functions-core-tools#installing"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will be using the command line to build out the solution and its projects, and to link them together. Some basic knowledge of the command line will be useful. &lt;/p&gt;

&lt;p&gt;Shell commands will be prefixed with &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This wiki assumes that you have created a repository in a source control provider such as GitHub and that you have cloned that repository locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the .NET Core Solution
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Change directories into your locally cloned repository.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/HelloAzure/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new .NET Core solution.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new solution &lt;span class="nt"&gt;-n&lt;/span&gt; HelloAzure &lt;span class="nt"&gt;-o&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;dotnet new solution&lt;/code&gt; command creates a new solution.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-n HelloAzure&lt;/code&gt; flag is the name of the solution.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-o .&lt;/code&gt; flag specifies where to output the results of the create operation, in this case the current directory.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Creating the Azure Function Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your root directory create a new azure function project .&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;func init HelloAzure.Functions
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;When prompted choose the dotnet runtime.&lt;/li&gt;
&lt;li&gt;This will create an empty Azure Functions project and place it in a directory named &lt;code&gt;HelloAzure.Functions&lt;/code&gt;.

&lt;ol&gt;
&lt;li&gt;The azure-core-tools-cli will replace &lt;code&gt;.&lt;/code&gt; chars with &lt;code&gt;_&lt;/code&gt; so the generated csproj file will be &lt;code&gt;HelloAzure_Functions.csproj&lt;/code&gt;. &lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;. The name of the project can be whatever you would like. I went with naming it &lt;code&gt;Functions&lt;/code&gt; and name-spacing it under the &lt;code&gt;HelloAzure&lt;/code&gt; solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linking the Azure Function Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your root directory link the Azure Function Project to the solution.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet sln add HelloAzure.Functions/HelloAzure_Functions.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Creating a business logic class library
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your root directory create a new shared library to contain business logic.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new classlib &lt;span class="nt"&gt;-n&lt;/span&gt; HelloAzure.BusinessLogic
&lt;/code&gt;&lt;/pre&gt;


&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;dotnet new classlib&lt;/code&gt; command creates a new class library.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;-n HelloAzure.BusinessLogic&lt;/code&gt; flag is the name of the class library.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;. The name of the project can be whatever you would like. I went with naming it &lt;code&gt;BusinessLogic&lt;/code&gt; and name-spacing it under the &lt;code&gt;HelloAzure&lt;/code&gt; solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linking the business logic class library
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From your root directory link the business logic class library to the solution.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet sln add HelloAzure.BusinessLogic/HelloAzure.BusinessLogic.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Adding some "business logic" logic to the BusinessLogic library
&lt;/h3&gt;

&lt;p&gt;The BusinessLogic class library is stubbed out with an empty class named &lt;code&gt;Class1.cs&lt;/code&gt;. We need to rename it and give it some actual business logic to handle.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Change directories into the BusinessLogic project&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;HelloAzure.BusinessLogic/
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rename the &lt;code&gt;Class1.cs&lt;/code&gt; file to &lt;code&gt;GreetingService.cs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;Class1.cs GreetingService.cs
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a text editor replace the contents of &lt;code&gt;GreetingService.cs&lt;/code&gt; with the following.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;HelloAzure.BusinessLogic&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GreetingService&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;$"Hello, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;In this post we created the following.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A .NET Core solution.&lt;/li&gt;
&lt;li&gt;An Azure Functions project.&lt;/li&gt;
&lt;li&gt;A BusinessLogic class library.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also added links from each project to the solution.&lt;/p&gt;

&lt;p&gt;Finally we added some actual business logic to the BusinessLogic class library.&lt;/p&gt;

&lt;p&gt;If you followed all the above steps you should have a project structure that looks like the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
+-- .gitignore
+-- HelloAzure.sln
+-- HelloAzure.BusinessLogic/
|   +-- GreetingService.cs
|   +-- HelloAzure.BusinessLogic.csproj
+-- HelloAzure.Functions/
|   +-- .vscode/
|   +-- .gitignore
|   +-- HelloAzure_Functions.csproj
|   +-- host.json
|   +-- local.settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congrats on getting all the setup complete 😊 . We now have a solution that we can add functions to 🎉.&lt;/p&gt;

&lt;p&gt;This would be a good time to commit the changes you've made to source.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
    <item>
      <title>Introduction to Azure Functions</title>
      <dc:creator>Jacob Smith</dc:creator>
      <pubDate>Mon, 11 Nov 2019 17:01:25 +0000</pubDate>
      <link>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-series-2k8j</link>
      <guid>https://dev.to/jsmithdenverdev/introduction-to-azure-functions-series-2k8j</guid>
      <description>&lt;p&gt;Recently for work I have been assigned to a project that uses Azure Functions as its backbone. I have prior experience with the .NET ecosystem, but had not yet had much of a chance to work with Azure or newer versions of .NET Core. I spent a bit of time before the project started getting buffed up on all the tooling and know-how I would need to write and deploy functions to Azure.&lt;/p&gt;

&lt;p&gt;This series is a walk through of everything I did to get a simple Azure Function setup and deploy-able (both manually, and through a CI/CD pipeline). The repository that contains my function is located &lt;a href="https://github.com/jsmithdenverdev/HelloAzure"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The repository above contains a wiki with this entire series already in it. I also wanted to post to Dev in the hopes that the content might be useful to folks here!&lt;/p&gt;

&lt;p&gt;The series is broken out into 5 parts. They can be referenced in any order but I would suggest going through them in order.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-1-creating-the-net-core-solution-2enh"&gt;Creating the .NET Core Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-2-creating-the-azure-function-1ab7"&gt;Creating the Azure Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-3-creating-the-azure-function-resources-pfc"&gt;Creating the Azure Function resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-4-deploying-the-azure-function-2l67"&gt;Deploying the Azure Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jsmithdenverdev/introduction-to-azure-functions-pt-5-automate-the-function-deployment-with-a-ci-cd-pipeline-2mi2"&gt;Automate the function deployment with a CI CD pipeline&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each post follows a similar structure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introduction

&lt;ul&gt;
&lt;li&gt;Outlines what will be covered in the section, and what the output should be.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Prerequisites

&lt;ul&gt;
&lt;li&gt;Calls out any prerequisites needed for the section and covers how to obtain them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Content&lt;/li&gt;
&lt;li&gt;Recap

&lt;ul&gt;
&lt;li&gt;Serves as a quick recap to show you all the work you just accomplished 😊.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this series is informative for anyone reading it! Comments and feedback are more than welcome.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
