<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wesley Camargo</title><link>http://www.wesleycamargo.com/</link><description>Recent content on Wesley Camargo</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 15 Feb 2024 15:41:21 +0000</lastBuildDate><atom:link href="http://www.wesleycamargo.com/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Import an Existing Azure Resource into Your Terraform State with Azure Storage Backend</title><link>http://www.wesleycamargo.com/p/azure-terraform-import/</link><pubDate>Thu, 15 Feb 2024 15:41:21 +0000</pubDate><guid>http://www.wesleycamargo.com/p/azure-terraform-import/</guid><description>&lt;img src="http://www.wesleycamargo.com/p/azure-terraform-import/cover.jpg" alt="Featured image of post How to Import an Existing Azure Resource into Your Terraform State with Azure Storage Backend" />&lt;p>Have you ever for any reason didn&amp;rsquo;t had your Azure resource under Terraform and want to starting managing it by the HashCorp Tool? In this step-by-step guide, we&amp;rsquo;ll walk you through the process of importing an existing Azure resource into your Terraform state file, where your backend is configured to use an Azure Storage Account.&lt;/p>
&lt;h2 id="preparing-the-backend-creating-the-storage-account-for-state-management">Preparing the Backend: Creating the Storage Account for State Management
&lt;/h2>&lt;p>Before we start, we need to set up an Azure Storage Account, which will be the backend for your Terraform state files. This ensures that your state is kept in a secure, centralized location, making it easier to manage, especially when working within a team.&lt;/p>
&lt;p>The Azure CLI script below will create a Resource Group and a Storage Account with the container, where the state files will be created later:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">az group create -l uksouth -n rg-tfstate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az storage account create -n sttfstateimport -g rg-tfstate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">az storage container create -n tfstate --account-name sttfstateimport
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="preparation-of-the-terraform-file">Preparation of the Terraform File
&lt;/h2>&lt;p>Now that our Azure backend ready, lets configure the Terraform files to use it.&lt;/p>
&lt;p>We will first add the &lt;code>azurerm&lt;/code> backend, to do so, we will need to provide the the details from the storage account created previously, it will be required the storage account name, container name, the resource group, and the key of our workload. After that, we will create a simple resource group:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-hcl" data-lang="hcl">&lt;span class="line">&lt;span class="cl">&lt;span class="k">provider&lt;/span> &lt;span class="s2">&amp;#34;azurerm&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">features&lt;/span> {}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">terraform&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">backend&lt;/span> &lt;span class="s2">&amp;#34;azurerm&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> container_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;tfstate&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;myworkload&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> resource_group_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;rg-tfstate&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> storage_account_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sttfstateimport&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}&lt;span class="c1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a resource group
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">resource&lt;/span> &lt;span class="s2">&amp;#34;azurerm_resource_group&amp;#34; &amp;#34;example&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;rg-myresourcegroup&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> location&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;UKSouth&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Initialize the Terraform workspace and apply the changes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">terraform init&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">terraform apply&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="terraform-state-file">Terraform State file
&lt;/h3>&lt;p>After the creation of this resource, lets check the state file hosted on our storage account. Note that we only have the resource group being managed by Terraform.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terraform_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1.6.5&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;serial&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lineage&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;f5c71b49-ac3a-e0ec-2529-b017b3c3965f&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;outputs&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;resources&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;managed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;azurerm_resource_group&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;example&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;provider[\&amp;#34;registry.terraform.io/hashicorp/azurerm\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;instances&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;schema_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/subscriptions/337ba254-3aa0-4551-ba8e-89debefaa373/resourceGroups/rg-myresourcegroup&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;uksouth&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;managed_by&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;rg-myresourcegroup&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;tags&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;timeouts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sensitive_attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;private&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;xxxx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;check_results&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="creation-of-resource-outside-terraform-using-azure-cli">Creation of Resource Outside Terraform Using Azure CLI
&lt;/h2>&lt;p>Sometimes, resources are created outside of Terraform, maybe manually or through scripts, or they might even be there before we start to adopt an Infra as Code strategy. In our case we will simulate it using Azure CLI. Create the Azure resource you want to manage with Terraform. For example, you can create a storage account, VM, or any other resource.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">az storage account create -n sttoimport -g rg-myresourcegroup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>After the resource creation, note the id of the resource. It will be needed later for the import process.&lt;/p>
&lt;h2 id="the-import-process-on-terraform">The Import Process on Terraform
&lt;/h2>&lt;p>Now that we have our resource and the Terraform backend is ready, we can import the existing resource into the Terraform state&lt;/p>
&lt;p>Write a Terraform resource block in your configuration file that corresponds to the resource you created. Make sure the name and type match the Azure resource.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-hcl" data-lang="hcl">&lt;span class="line">&lt;span class="cl">&lt;span class="k">resource&lt;/span> &lt;span class="s2">&amp;#34;azurerm_storage_account&amp;#34; &amp;#34;example&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sttoimport&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> resource_group_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">azurerm_resource_group&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> location&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">azurerm_resource_group&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">location&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> account_tier&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Standard&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> account_replication_type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;LRS&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>If you try to apply, an error message will appear, stating that the resource already existis and must be imported&lt;/p>
&lt;p>The simplest way to achieve this is by adding the &lt;code>import&lt;/code> block of code into your tf file. You will need to specify the id of the resource (that one we noted before) and &lt;code>to&lt;/code> which resource it should be imported.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-hcl" data-lang="hcl">&lt;span class="line">&lt;span class="cl">&lt;span class="k">import&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">azurerm_storage_account&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">example&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;/subscriptions/&amp;lt;subscription id&amp;gt;/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/stportalcreated&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}&lt;span class="c1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # Create a storage account
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">resource&lt;/span> &lt;span class="s2">&amp;#34;azurerm_storage_account&amp;#34; &amp;#34;example&amp;#34;&lt;/span> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;sttoimport&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> resource_group_name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">azurerm_resource_group&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> location&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">azurerm_resource_group&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">example&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="k">location&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> account_tier&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Standard&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n"> account_replication_type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;LRS&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>After adding it, run &lt;code>terraform apply&lt;/code> once again.&lt;/p>
&lt;h3 id="terraform-state-file-1">Terraform State file
&lt;/h3>&lt;p>Now we can check once again our Terraform state file. We can note that it&amp;rsquo;s much more extense, and has not only the resource group as in the first deployment, but the storage account as well.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terraform_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1.6.5&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;serial&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lineage&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;f5c71b49-ac3a-e0ec-2529-b017b3c3965f&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;outputs&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;resources&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;managed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;azurerm_resource_group&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;example&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;provider[\&amp;#34;registry.terraform.io/hashicorp/azurerm\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;instances&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;schema_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/subscriptions/337ba254-3aa0-4551-ba8e-89debefaa373/resourceGroups/rg-myresourcegroup&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;uksouth&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;managed_by&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;rg-myresourcegroup&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;tags&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;timeouts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sensitive_attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;private&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;xxxx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;managed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;azurerm_storage_account&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;example&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;provider&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;provider[\&amp;#34;registry.terraform.io/hashicorp/azurerm\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;instances&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;schema_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;access_tier&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Hot&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;account_kind&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;StorageV2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;account_replication_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;LRS&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;account_tier&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Standard&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allow_nested_items_to_be_public&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allowed_copy_scope&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;azure_files_authentication&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;blob_properties&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;change_feed_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;change_feed_retention_in_days&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;container_delete_retention_policy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;cors_rule&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;default_service_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;delete_retention_policy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;last_access_time_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;restore_policy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;versioning_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;cross_tenant_replication_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;custom_domain&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;customer_managed_key&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;default_to_oauth_authentication&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;edge_zone&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;enable_https_traffic_only&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;/subscriptions/337ba254-3aa0-4551-ba8e-89debefaa373/resourceGroups/rg-myresourcegroup/providers/Microsoft.Storage/storageAccounts/sttoimport&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;identity&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;immutability_policy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;infrastructure_encryption_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;is_hns_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;large_file_share_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;local_user_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;uksouth&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;min_tls_version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;TLS1_2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;sttoimport&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;network_rules&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;bypass&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;AzureServices&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;default_action&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Allow&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ip_rules&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;private_link_access&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;virtual_network_subnet_ids&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;nfsv3_enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... additional attributes truncated for brevity
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nt">&amp;#34;tags&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;timeouts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sensitive_attributes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;private&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;xxxx&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dependencies&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;azurerm_resource_group.example&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;check_results&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="conclusion">Conclusion
&lt;/h2>&lt;p>Integrating existing Azure resources into Terraform doesn&amp;rsquo;t have to be complex. By following the steps described in this guide, you can quickly and efficiently bring your Azure infrastructure under Terraform&amp;rsquo;s infrastructure-as-code management. Happy coding!&lt;/p></description></item><item><title>Don’t run out of credits on Azure!</title><link>http://www.wesleycamargo.com/p/dont-run-out-of-credits-on-azure/</link><pubDate>Wed, 06 Dec 2023 19:01:04 +0100</pubDate><guid>http://www.wesleycamargo.com/p/dont-run-out-of-credits-on-azure/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*yQ4GvCZbwp2mH6sc" alt="Featured image of post Don’t run out of credits on Azure!" />&lt;h3 id="dont-run-out-of-credits-on-azure-how-to-shutdown-azure-virtual-machines-automatically-with-terraform">Don’t run out of credits on Azure! How to shutdown Azure Virtual Machines automatically with Terraform
&lt;/h3>&lt;p>If you are distracted and forgetful like me, you probably already forgot an Azure Virtual Machine running without need and just figured it out when your Azure credits were gone. To avoid this, check a simple tip on how to solve this problem with Terraform.&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*yQ4GvCZbwp2mH6sc"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@tristangassert?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Tristan Gassert&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>In my&lt;a class="link" href="https://medium.com/@camargo-wes/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b" target="_blank" rel="noopener"
> previous post&lt;/a>, I have already shown how to create an Azure Virtual Machine using Terraform, now I’m adding this feature, which, for me, is very important and helps me to not spend all my Azure Credits in a forgotten VM 🙃.&lt;/p>
&lt;h3 id="what-is-azure-vm-auto-shutdown">What is Azure VM Auto-Shutdown?
&lt;/h3>&lt;p>Azure VM Auto-Shutdown is like setting a timer for your Azure VM. Auto-shutdown allows you to set a specific time so your Virtual Machine will turn off. This is a handful when you create VMs for tests, or even in development/QA environments, where you don’t need your VMs running at night when your team is not working.&lt;/p>
&lt;h3 id="terraform-resource-for-auto-shutdown-of-an-azurevm">Terraform resource for auto-shutdown of an Azure VM
&lt;/h3>&lt;p>To make it work, we will use the Terraform resource &lt;code>azurerm_dev_test_global_vm_shutdown_schedule&lt;/code>. This is part of the Azure &lt;a class="link" href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/dev_test_global_vm_shutdown_schedule" target="_blank" rel="noopener"
>Terraform provider&lt;/a>. The usage is quite simple, as we can see below:&lt;/p>
&lt;p>The most important information required are the VM id, daily_recurrence_time, and timezone. Based on this information your VM will be shut down at the time you have defined.&lt;/p>
&lt;h3 id="complete-terraform-to-create-an-azure-vm-with-auto-shutdown">Complete Terraform to create an Azure VM with auto-shutdown
&lt;/h3>&lt;p>To facilitate the understanding of how to integrate it in a real-life scenario, I have implemented the shutdown process in the following complete Terraform file:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Below it is the link to my GitHub repository where I am creating a library to have all references related to Terraform. I hope that this post despite being simple might be helpful!
&lt;a class="link" href="https://github.com/wesleycamargo/terraform" target="_blank" rel="noopener"
>wesleycamargo/terraform (github.com)&lt;/a>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-run-out-of-credits-on-azure/0_0rM_F_9XoS3sP5GW.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform</title><link>http://www.wesleycamargo.com/p/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform/</link><pubDate>Tue, 21 Nov 2023 18:45:11 +0100</pubDate><guid>http://www.wesleycamargo.com/p/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*SbgJGQvFOAmWJQfV" alt="Featured image of post Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform" />&lt;h3 id="getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform">Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform
&lt;/h3>&lt;p>Azure VMs are like your own computer on the cloud. You can choose between different Operational Systems, such as Linux and Windows, and they can be used for different goals, like hosting a website for example.&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*SbgJGQvFOAmWJQfV"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@imgix?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>imgix&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>Virtual Machines are part of a category called Infrastructure as Code, and they are still relevant in many scenarios, even with the advent of Platform as Code, where you are in control of many aspects, such as security, identity and access, high availability, and others.&lt;/p>
&lt;h3 id="what-do-i-need-to-create-a-virtual-machine-onazure">What do I need to create a Virtual Machine on Azure?
&lt;/h3>&lt;p>To create the VM there are a few Azure resources that are necessary to be created before, as we can see in the image below:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform/1_B2QjgH9A_DVlS9HMakuKTA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="resources-that-are-pre-requisites">Resources that are Pre-requisites
&lt;/h4>&lt;p>There are some resources that are not necessarily part of the same life cycle of your VM, and you might have already created them on your Azure environment. On the script that I am providing below, they are being created, but you might decide to use a resource that already exists.&lt;/p>
&lt;p>**Resource Group: **A resource group works similarly to a folder, where you can group the resources that have something in common. It can be resources of the same type, such as VMs, or the most recommended, resources that share the same life cycle.&lt;/p>
&lt;p>**Virtual Network: **In an Azure VNet, you are able to create a private space, where your resources can communicate securely. It works similarly to the network that you are connected to right now to read this post, but it sits on Azure.&lt;/p>
&lt;p>&lt;strong>Subnet:&lt;/strong> They are subdivisions of a Virtual Network, helping to keep organized and segmented by different types of resources, like Databases, Front and Backend applications.&lt;/p>
&lt;h4 id="resources-that-are-part-of-the-virtual-machine-lifecycle">Resources that are part of the Virtual Machine life cycle
&lt;/h4>&lt;p>**Disks: **Disks are used to store operating systems, applications, or data. Each VM created on Azure has at least one OS Disk, but it can have multiple.&lt;/p>
&lt;p>&lt;strong>Network Interface Card:&lt;/strong> Also known as NIC, a Network Interface Card is responsible for connecting the VM with the network that we saw earlier. Similar to disks, each VM must have at least one, but also multiple NICs are supported.&lt;/p>
&lt;p>&lt;strong>Public IP:&lt;/strong> A Public IP is the communication between the VM and the world. This resource is not mandatory, and in most cases inside a business context, it should be created very cautiously, to avoid any security risk. However, as it is a simple test and I don’t want to complicate it, we need the Public IP to be able to connect to our VM. It is connected to the Network Interface.&lt;/p>
&lt;h3 id="terraform-script">Terraform Script
&lt;/h3>&lt;h4 id="pre-requisites">Pre-requisites
&lt;/h4>&lt;p>Below is the section of Terraform that creates the pre-requisites. As I mentioned before, it is possible to use existing resources, however, you need to adapt the script to use them.&lt;/p>
&lt;p>In this script, we are creating the resource group, virtual network, and subnet.&lt;/p>
&lt;h4 id="virtual-machine">Virtual Machine
&lt;/h4>&lt;p>Finally, this is the script to create the VM resources. Here we create first a Public IP, the Network Interface Card, and associate the PIP on it, and a VM. Note that the Terraform VM resource already abstracts the disk internally. It’s also interesting to highlight that the VM associates the NIC created before, creating a dependency, which Terraform will identify and create in the correct order.&lt;/p>
&lt;p>&lt;strong>Complete Script&lt;/strong>&lt;/p>
&lt;p>Below is the complete script, including provider, variables, and outputs:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Below it is the link to my GitHub repository where I am creating a library to have all references related to Terraform. I hope that this post despite being simple might be helpful! 
&lt;a class="link" href="https://github.com/wesleycamargo/terraform" target="_blank" rel="noopener"
>wesleycamargo/terraform (github.com)&lt;/a>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform/0_0rM_F_9XoS3sP5GW.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>This is what you should do to make your CI/CD more secure</title><link>http://www.wesleycamargo.com/p/this-is-what-you-should-do-to-make-your-ci/cd-more-secure/</link><pubDate>Wed, 14 Jun 2023 18:04:59 +0200</pubDate><guid>http://www.wesleycamargo.com/p/this-is-what-you-should-do-to-make-your-ci/cd-more-secure/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*HQSrqlfb4u0sFQe6" alt="Featured image of post This is what you should do to make your CI/CD more secure" />&lt;h3 id="this-is-what-you-should-do-to-make-your-cicd-moresecure">This is what you should do to make your CI/CD more secure
&lt;/h3>&lt;p>Security is now a trending topic in the IT industry, with data leaks and breaches happening left and right, so it’s super important to tackle any risks in our environments. One of these risks is the management of Service Principal secrets to connect to workloads running outside Azure, such as other clouds or external CI/CD tools. In this post, we will learn how to use Workload Identity Federation to tackle this and make our DevOps process more secure and efficient.&lt;/p>
&lt;h3 id="making-your-cicd-more-secure-with-passwordless-authentication-onazure">Making your CI/CD more secure with Passwordless Authentication on Azure
&lt;/h3>&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*HQSrqlfb4u0sFQe6"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@moneyphotos?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>regularguy.eth&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="pre-requisites">Pre-requisites
&lt;/h3>&lt;ul>
&lt;li>Azure Service Principal Name or Azure Managed Identity&lt;/li>
&lt;li>GitLab repository&lt;/li>
&lt;/ul>
&lt;h3 id="what-is-workload-identity-federation">What is Workload Identity Federation?
&lt;/h3>&lt;p>WIF (Windows Identity Foundation) enables passwordless authentication, granting access to Azure AD and Azure Resources without the need to manage secrets or certificates.&lt;/p>
&lt;p>Once configured, you establish trust with an external OpenID Connect (OIDC) identity provider such as GitHub, GitLab, Kubernetes, Google, and AWS, also known as **Issuer. **It is also necessary to provide the &lt;strong>Subject Identifier&lt;/strong>, so Azure AD will be able to identify the resource when attempting to log in and establish a connection with the external application.&lt;/p>
&lt;h3 id="how-to-setup-workload-identity-federation-onazure">How to setup Workload Identity Federation on Azure
&lt;/h3>&lt;p>The process to set up is quite simple but requires permissions to manipulate Azure AD identities. It consists of appending an existing AAD, which can be a Service Principal or a Managed Identity with a Federated Credential.&lt;/p>
&lt;p>In our example, I will configure it in a GitLab pipeline.&lt;/p>
&lt;p>To do so, it is necessary to inform&lt;/p>
&lt;ul>
&lt;li>Issuer: The Identity Provider, in our case &lt;code>[https://gitlab.com](https://gitlab.com)&lt;/code>&lt;/li>
&lt;li>Subject Identifier: In the case of a GitLab pipeline, the repository name &lt;code>project_path:&amp;lt;project&amp;gt;/&amp;lt;repo name&amp;gt;:ref_type:branch:ref:main&lt;/code>&lt;/li>
&lt;li>Audience: Service account tokens &lt;code>[https://gitlab.com](https://gitlab.com)&lt;/code>&lt;/li>
&lt;/ul>
&lt;h4 id="creating-an-azure-user-managedidentity">Creating an Azure User Managed Identity
&lt;/h4>&lt;p>If you don’t have a Service Principal or Managed Identity in place yet, you can run the Azure CLI script below. It creates the MI and sets Contributor permission in the current subscription.&lt;/p>
&lt;p>The script will also print out the TenantId a ClientID that will be necessary to connect on the GitLab pipeline.&lt;/p>
&lt;h4 id="setting-up-an-azure-federated-credential">Setting up an Azure Federated Credential
&lt;/h4>&lt;p>The script below creates the Federated Credential in an existing Manage Identity. It can also be replaced by a Service Principal.&lt;/p>
&lt;h3 id="configuring-gitlab-cicdsettings">Configuring GitLab CI/CD Settings
&lt;/h3>&lt;p>On the GitLab side, you just need to inform the TenantId and ClientId that were prompted in the creation of the Managed Identity.&lt;/p>
&lt;p>The pipeline below demonstrates how to connect and create a resource group in an Azure Subscription:&lt;/p>
&lt;p>After running the pipeline, you can see that the connection was successful:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/this-is-what-you-should-do-to-make-your-cicd-more-secure/1_iwJ-Vzmm0Nti_Ju2R_rykw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/this-is-what-you-should-do-to-make-your-cicd-more-secure/0_NDaQ7lVOrIQVhEGs.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>From Terraform to Azure Bicep: What You Need to Know about syntax</title><link>http://www.wesleycamargo.com/p/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/</link><pubDate>Fri, 17 Feb 2023 18:31:38 +0100</pubDate><guid>http://www.wesleycamargo.com/p/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/1_TaDCxnnAcZb53Fi-ToztNg.jpeg" alt="Featured image of post From Terraform to Azure Bicep: What You Need to Know about syntax" />&lt;h3 id="from-terraform-to-azure-bicep-what-you-need-to-know-aboutsyntax">From Terraform to Azure Bicep: What You Need to Know about syntax
&lt;/h3>&lt;p>&lt;img src="http://www.wesleycamargo.com/img/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/1_TaDCxnnAcZb53Fi-ToztNg.jpeg"
loading="lazy"
alt="Image"
>
Photo by Botond Czapp: &lt;a class="link" href="https://www.pexels.com/photo/birds-flying-on-blue-sky-7255793/" target="_blank" rel="noopener"
>https://www.pexels.com/photo/birds-flying-on-blue-sky-7255793/&lt;/a>&lt;/p>
&lt;p>Hey there Terraform experts! I am confident that you know the power of infrastructure as Code in managing and provisioning IT infrastructure and have been applying it with the famous HashiCorp tool. But have you heard about Azure Bicep, the newer Microsoft IaC language for managing Azure resources? If you’re curious about the differences between Terraform and Bicep, and how Bicep can help you better manage your Azure resources, you’ve come to the right place. Let’s dive in and explore the world of Infra as Code with Azure Bicep! In this first post, I’m going to break down the basic differences between Terraform and Bicep file structures. These infrastructure-as-code tools have their own unique syntax and components, so it’s important to know what sets them apart. By the end of this post, you’ll have a solid grasp of what makes them tick.&lt;/p>
&lt;h3 id="introducing-terraform-andbicep">Introducing Terraform and Bicep
&lt;/h3>&lt;p>Terraform and Azure Bicep are two popular Infra as Code (IaC) tools that allow developers and operations teams to manage and provision cloud infrastructure using development practices.&lt;/p>
&lt;p>Terraform is a tool developed by HashiCorp that supports multiple cloud platforms, including Azure, while Azure Bicep is a newer tool developed by Microsoft specifically for managing Azure resources. Both tools have their own syntax and language for defining Infrastructure as Code and offer benefits such as consistency, scalability, and version control. However, there are also some differences between the two, such as how they handle state management and the availability of community-built providers. In the following sessions, we’ll explore the similarities and differences between Terraform and Azure Bicep, and help you decide which tool is best for your infrastructure management needs.&lt;/p>
&lt;h3 id="language-andsyntax">Language and Syntax
&lt;/h3>&lt;p>Terraform and Bicep has a lot in common. Both use their own domain-specific languages, with a declarative approach, support modularization, and are designed to be human-friendly(I am looking at you, ARM Templates 🙃). Terraform uses HashiCorp Configuration Language, also known as HCL, developed by HashiCorp and has several providers, supporting not only Azure, but AWS, GCP, and even VMWare. Bicep is developed by Microsoft with the intention to abstract the usage of ARM Templates and was developed specifically for Azure, which gave a great integration.&lt;/p>
&lt;p>The structure of both languages is similar, within the same building blocks, with the main components being resources, inputs, and outputs, and as I said above, quite easy to read. Below we can see a comparison of the creation of an Azure Storage Account:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/1_StyddfWR0evZ6TjZ4MKRNQ.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;p>Now let’s analyze the main differences:&lt;/p>
&lt;h4 id="provider">Provider
&lt;/h4>&lt;p>The first and biggest difference that note is that in the Terraform example, we have a section called “provider”. As Terraform supports not only Azure but also other providers, it is required to declare the provider that we want to use.&lt;/p>
&lt;p>As Bicep is designed specifically for Azure, the provider statement is not required.&lt;/p>
&lt;h4 id="input">Input
&lt;/h4>&lt;p>Another difference is that the input parameters have different reserved words. In Terraform it’s called &lt;code>variable&lt;/code>, the default values are declared with a &lt;code>default&lt;/code> statement and its syntax require curly brackets.&lt;/p>
&lt;p>Bicep, in turn, declares the inputs by the reserved word &lt;code>param&lt;/code> , the attribution of a default value can be done with the equals sign and it’s not required any brackets. Bicep also has a &lt;code>variable&lt;/code> reserved world, but it’s used not for inputs, below we can see more about it.&lt;/p>
&lt;h4 id="local-variables">Local variables
&lt;/h4>&lt;p>Local variables in Terraform have a special section called &lt;code>locals&lt;/code>. All necessary variables must be declared in this section and must be accessed by the syntax &lt;code>local.&amp;lt;variable name&amp;gt;&lt;/code> and can be used to create combinations and complex operations.&lt;/p>
&lt;p>locals {
resource_group_name = &amp;ldquo;myTerraformResourceGroup&amp;rdquo;
location = &amp;ldquo;West Europe&amp;rdquo;
}On Bicep, it is not necessary to have a specific session, being possible to declare anywhere in the file (although is recommended to do in the beginning to make it more readable). It also makes the syntax a little simpler than in terraform &lt;code>var location = ‘westeurope’&lt;/code>&lt;/p>
&lt;h4 id="resources">Resources
&lt;/h4>&lt;p>Finally something in common! For both, Terraform and Bicep, the resource is declared by the reserved word… &lt;code>resource&lt;/code>! And there is more in common, in both cases, when declaring the resource you need to declare which resource is desired and you also need to create an alias to this resource, so it will be possible to access information from it, even in the case that you have several resources of the same type. The internal properties will be different depending on each resource type, but in general, you need to provide the resource name, SKU, location, and so on.&lt;/p>
&lt;p>Although the concepts are quite the same, the syntax is slightly different as we can see below:&lt;/p>
&lt;p>&lt;strong>Terraform resource:&lt;/strong>&lt;/p>
&lt;p>resource &amp;ldquo;azurerm_storage_account&amp;rdquo; &amp;ldquo;storage&amp;rdquo; {
name = var.storage_account_name
resource_group_name = local.resource_group_name
location = local.location
account_tier = &amp;ldquo;Standard&amp;rdquo;
account_replication_type = &amp;ldquo;LRS&amp;rdquo;
}&lt;strong>Bicep resource:&lt;/strong>&lt;/p>
&lt;p>&lt;code>resource storage &amp;amp;#x27;Microsoft.Storage/storageAccounts@2022-09-01&amp;amp;#x27; = { kind: &amp;amp;#x27;StorageV2&amp;amp;#x27; location: location name: storageAccountName sku: { name: &amp;amp;#x27;Standard_LRS&amp;amp;#x27; } }&lt;/code>n&lt;/p>
&lt;h4 id="output">Output
&lt;/h4>&lt;p>The outputs follow a similar logic as the inputs. Terraform requires curly brackets, Bicep no. In terraform, it is necessary to specify the resource type first, then the alias, and finally the property. It is also important to highlight that is not possible to assign a type to an output in Terraform.&lt;/p>
&lt;p>output &amp;ldquo;storage_account_name&amp;rdquo; {
value = azurerm_storage_account.storage.name
}Bicep is again, slightly simple. No brackets and you can reference by the alias directly, without having to declare the resource type. In Bicep is also possible to assign a type in the output, which is useful in some cases.&lt;/p>
&lt;p>&lt;code>output storageName string = storage.name&lt;/code>n&lt;/p>
&lt;h4 id="terraform-storage-accountexample">Terraform storage account example
&lt;/h4>&lt;h4 id="bicep-storage-accountexample">Bicep storage account example
&lt;/h4>&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>In conclusion, while Terraform and Bicep share some similarities in their purpose and functionality, they have significant differences in syntax, which can affect the user experience and overall efficiency in deploying infrastructure as code. Understanding these syntax differences is crucial for developers to effectively utilize the benefits of each tool and to determine which one is the best fit for a particular project or organization.&lt;/p>
&lt;p>In the upcoming posts, we will dive deeper into other differences between both tools, exploring their impact on various aspects of infrastructure deployment and management, and offering practical tips and solutions to common challenges. Stay tuned to learn more about how to optimize your infrastructure as code with Terraform and Bicep!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/from-terraform-to-azure-bicep-what-you-need-to-know-about-syntax/0_XC6gJ9HR_xbxqqSp.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>Optimize Your Cloud Environment with Azure Platform Landing Zones</title><link>http://www.wesleycamargo.com/p/optimize-your-cloud-environment-with-azure-platform-landing-zones/</link><pubDate>Sun, 12 Feb 2023 20:36:00 +0100</pubDate><guid>http://www.wesleycamargo.com/p/optimize-your-cloud-environment-with-azure-platform-landing-zones/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*z0nVJG-R4dKvqap4" alt="Featured image of post Optimize Your Cloud Environment with Azure Platform Landing Zones" />&lt;h3 id="optimize-your-cloud-environment-with-azure-platform-landingzones">Optimize Your Cloud Environment with Azure Platform Landing Zones
&lt;/h3>&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*z0nVJG-R4dKvqap4"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/de/@zhpix?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Pascal Meier&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="what-are-azure-landing-zones-and-why-are-they-important">What are Azure Landing Zones and why are they important?
&lt;/h3>&lt;p>Imagine that you are building a house, it is necessary to prepare the ground and have a solid foundation to grow your walls. Moreover, it is also necessary to prepare essential services, for instance, plumbing, heating and insulation, and electric cables in this foundation, otherwise, it will be more complicated and expensive (although possible) to do it later.&lt;/p>
&lt;p>An Azure Landing Zone is the same as the house foundation, with essential services to support your platform or applications.&lt;/p>
&lt;p>We can say that Azure Landing Zone is a standardized and repeatable framework for deploying and managing resources in Microsoft Azure. It provides a set of best practices and policies, that helps to improve the cloud deployment process and ensure that resources are deployed in a consistent, scalable, and secure manner.&lt;/p>
&lt;h3 id="azure-platform-landingzones">Azure Platform Landing Zones
&lt;/h3>&lt;p>The set of essential services that are shared by multiple applications is also called Platform Landing Zone. These services, such as Networking and Identity management, are typically managed and centralized by dedicated teams, allowing application teams to concentrate on their core business objectives.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/optimize-your-cloud-environment-with-azure-platform-landing-zones/1_et3Q_YBVoZ62rNaL-yKKJQ.png"
loading="lazy"
alt="Image"
>
Azure Platform Landing Zone&lt;/p>
&lt;p>Microsoft divided the Platform Landing Zones into 8 design areas. These design areas are topics that must be carefully planned to ensure the security and performance of the platform:&lt;/p>
&lt;ul>
&lt;li>**Billing and Active Directory **—Billing is the process of tracking and paying for the resources used in an Azure environment. The Azure billing and cost management platform provide the ability to monitor usage and costs, set budgets and alerts, and optimize spending. Azure Active Directory is a cloud-based identity and access management service that provides centralized identity management and robust security features.&lt;/li>
&lt;li>**Identity and access management **— IAM controls access to Azure resources. Azure Active Directory is the main service used for IAM and helps manage user identities, groups, and access to cloud-based apps.&lt;/li>
&lt;li>&lt;strong>Network topology and connectivity&lt;/strong> — It deals with the design and communication between virtual network resources. A good design ensures secure and efficient communication and access to the internet and external resources.&lt;/li>
&lt;li>&lt;strong>Resource organization&lt;/strong> — It involves grouping and managing resources within an Azure environment. It provides structure and scalability, making it easier to manage and control resource access. Resource groups, subscriptions, and policies to improve efficiency are used to reduce complexity, making it easy to adminstrate and ensure policy compliance in the platform.&lt;/li>
&lt;li>&lt;strong>Security&lt;/strong> — This is one of the most important design areas when planning the landing zone. It involves protecting resources with a multi-layered approach, including access control, network security, encryption, and incident response planning.&lt;/li>
&lt;li>**Management — **Management in Azure Landing Zones covers processes and tools used to manage and maintain resources. A well-managed landing zone needs clear roles, a change management process, and a structured approach to resource management.&lt;/li>
&lt;li>**Governance **— This is about setting the rules to keep your Azure environment organized and secure. Azure has tools like Policy and Role-Based Access Control to enforce your policies. To make things easy, make sure roles are clear and have a plan for making changes.&lt;/li>
&lt;li>&lt;strong>Platform automation and DevOps&lt;/strong> — As I am a DevOps guy for almost 10 years, I am suspicious to talk about this topic :D. It basically ensures that tools and processes make the deployment and management of applications and infrastructure easier and faster.&lt;/li>
&lt;/ul>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Azure Platform Landing Zones are the perfect solution for businesses looking to streamline their cloud deployment and management processes. With its centralized services, specialized teams, and powerful tools for automation and DevOps, it makes it easier than ever to bring new applications and services to market. Not to mention, the added security and governance features give peace of mind when it comes to managing resources in the cloud. So, whether you’re just starting your cloud journey or looking to optimize your existing operations, Azure Landing Zones are the way to go! So why wait? Get on board and start experiencing the benefits for yourself!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/optimize-your-cloud-environment-with-azure-platform-landing-zones/0_f97d9JzKyDdTtruJ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>Don’t repeat yourself! Creating Azure Bicep modules 💪</title><link>http://www.wesleycamargo.com/p/dont-repeat-yourself-creating-azure-bicep-modules/</link><pubDate>Mon, 28 Nov 2022 18:34:16 +0100</pubDate><guid>http://www.wesleycamargo.com/p/dont-repeat-yourself-creating-azure-bicep-modules/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*ZB8clYDcM2jGQj71" alt="Featured image of post Don’t repeat yourself! Creating Azure Bicep modules 💪" />&lt;h3 id="dont-repeat-yourself-creating-azure-bicep-modules">Don’t repeat yourself! Creating Azure Bicep modules 💪
&lt;/h3>&lt;p>Since our Infrastructure is Code now, why don’t we leverage the best software development practices? Check out this post on achieving reusability on your IaC templates using Bicep Modules!&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*ZB8clYDcM2jGQj71"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@prateekkatyal?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Prateek Katyal&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="what-are-azure-bicepmodules">What are Azure Bicep Modules?
&lt;/h3>&lt;p>Bicep Modules are the application of the **Don’t Repeat Yourself **principle, where a Bicep template calls another Bicep template. As a result, this practice enables the reusability of existing code and can speed up the creation of future resources.&lt;/p>
&lt;p>Imagine, for example, that you need to control how infrastructure resources are created. To accomplish this, you can implement rules in the bicep templates that, for example, restrict the size of virtual machines or the regions in which they can be created.&lt;/p>
&lt;p>Since the definition has already been created and the rules, will probably remain the same in the next project, it is not necessary to create a new definition. We can create a module that allows us to save valuable time and money by reusing these definitions.&lt;/p>
&lt;h3 id="how-to-create-an-azure-bicepmodule">How to create an Azure Bicep Module?
&lt;/h3>&lt;p>If you are already familiar with Bicep Templates, creating a Bicep Module is effortless, as a module has exactly the same structure and it is not necessary to add any special configuration. It is possible, inclusive, to reuse existing templates as modules.&lt;/p>
&lt;h3 id="how-to-consume-an-azure-bicepmodule">How to consume an Azure Bicep Module?
&lt;/h3>&lt;h4 id="declaring-a-bicepmodule">&lt;em>&lt;strong>Declaring a Bicep Module&lt;/strong>&lt;/em>
&lt;/h4>&lt;p>When working with Bicep Modules, the syntax changes compared to resources. Instead of declaring &lt;code>resource&lt;/code>the declaration is now &lt;code>module&lt;/code>**. **Additionally, it is necessary to reference the module path, which can be local or remote.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_qtbw9GCE45MafTDjuJ_6vg.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;p>It is also mandatory to add a symbolic name to the resource. The symbolic name can be used to recover an output from the module to be used in another part of the template.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_dvcRYdnC-LfnI9eJGBiCwA.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;p>The property &lt;code>name&lt;/code>** **is mandatory. It will become the nested template name in the final template.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_6W6RH47RoNV7GF6CfzRC-w.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;h4 id="passing-parameters-to-bicepmodules">&lt;em>&lt;strong>Passing parameters to Bicep modules&lt;/strong>&lt;/em>
&lt;/h4>&lt;p>The parameters on modules follow the same syntax and contain the same features as regular templates. However, to send the parameters to a module it must be under the &lt;code>params&lt;/code> node. It must match those declared in the module, including the validations.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_QOZF4MK2Y5SfT6AuO2m2jg.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;h3 id="how-to-deploy-an-azure-bicepmodule">How to deploy an Azure Bicep Module?
&lt;/h3>&lt;p>Deployment of Bicep Modules works exactly like Bicep Templates. It is possible to use &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-cli?WT.mc_id=DT-MVP-5004039" target="_blank" rel="noopener"
>Azure CLI&lt;/a>, &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-powershell?WT.mc_id=DT-MVP-5004039" target="_blank" rel="noopener"
>Azure PowerShell&lt;/a>, or even through &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-rest?WT.mc_id=DT-MVP-5004039" target="_blank" rel="noopener"
>Azure API.&lt;/a>&lt;/p>
&lt;p>I explain in more detail in &lt;a class="link" href="https://medium.com/faun/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" target="_blank" rel="noopener"
>this post&lt;/a> how to deploy using Azure CLI. Below we can see the script used to deploy the templates and modules created above.&lt;/p>
&lt;p>After running it is possible to see in the deployments of Azure Resource Group the main.bicep deployment:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_4QSoI-AuLcjYe9zxF6iiiQ.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;p>And if we click on the nested storage deployment we can observe the resource storageAccount being deployed :&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/1_gqdrDwcLHLaVUXVLbG31_Q.png"
loading="lazy"
alt="Image"
>
Image prepared by the author&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Reusability is one of the main advantages that we can leverage from modularization in any programming language and with Infrastructure as Code templates, it wouldn’t be different. Another benefit is that it also will ensure that your environment is more stable as your templates will be already tested by others, and most importantly, will also save implementation time.&lt;/p>
&lt;p>I hope this helps you, and see you at the next one!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dont-repeat-yourself-creating-azure-bicep-modules/0_JSaWL5U0fpZZ0xeP.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>Stop breaking your environment: How to get started with Azure DevOps Pipelines</title><link>http://www.wesleycamargo.com/p/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/</link><pubDate>Mon, 07 Nov 2022 15:17:27 +0100</pubDate><guid>http://www.wesleycamargo.com/p/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*EkiWY-eBH6JhvNEU" alt="Featured image of post Stop breaking your environment: How to get started with Azure DevOps Pipelines" />&lt;h3 id="stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines">Stop breaking your environment: How to get started with Azure DevOps Pipelines
&lt;/h3>&lt;p>Have you ever had problems with manual deployments? It is not about if but when an error will happen. I even saw entire sites being replaced wrongly! It is scary, isn’t it? Azure DevOps Pipelines will help you to avoid such mistakes, so check on this post how to deploy your application in minutes, taking advantage of all benefits that automated pipelines can bring to you!&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*EkiWY-eBH6JhvNEU"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@louishansel?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Louis Hansel&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="what-is-azure-devops-pipelines">What is Azure DevOps Pipelines?
&lt;/h3>&lt;p>A Deployment Pipeline is an automated process that combines Continuous Integration (CI) and Continuous Delivery (CD), deploying your application in a given environment. In other words, it automatically builds, tests, and deploys your code to make them available to other people.&lt;/p>
&lt;h3 id="prerequisites">Prerequisites
&lt;/h3>&lt;p>Before we start creating the pipelines, there are configurations that we need to prepare in advance. My friend &lt;a class="link" href="https://www.devjev.nl/" target="_blank" rel="noopener"
>Jev Suchoi&lt;/a> and I have already created a series of posts covering all these topics:&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://www.devjev.nl/posts/2022/how-to-create-an-organization-in-azure-devops/" target="_blank" rel="noopener"
>&lt;strong>How to create an Azure DevOps organization&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;strong>How to configure your Azure DevOps project&lt;/strong>&lt;/li>
&lt;li>[&lt;strong>Basic git commands you need to know&lt;/strong>](http://Git Basic commands in a nutshell)&lt;/li>
&lt;li>&lt;a class="link" href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" target="_blank" rel="noopener"
>&lt;strong>Pushing code to git&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Connecting Azure DevOps with Azure&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Creating a variable group on Azure DevOps&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h3 id="how-to-create-an-azure-devopspipeline">How to create an Azure DevOps pipeline
&lt;/h3>&lt;p>Azure DevOps Pipelines are an implementation of deployment pipelines that supports multiple programming languages and clouds. Basically, everything can be deployed using this tool.&lt;/p>
&lt;p>So let’s create our first pipeline!&lt;/p>
&lt;p>First of all, we need our application under a Version Control System. In &lt;a class="link" href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" target="_blank" rel="noopener"
>&lt;strong>this post&lt;/strong>&lt;/a>, I showed how to create a local repository for a dotnet core application, and &lt;a class="link" href="https://medium.com/@camargo-wes/azure-devops-remote-repositories-in-a-nutshell-how-to-create-and-push-your-code-to-git-219d3e1df71" target="_blank" rel="noopener"
>**here **&lt;/a>I show how to push the code to a remote repository on Azure Repos.&lt;/p>
&lt;p>With the repo in place, go to Pipelines on the left menu, and then click on &lt;strong>New pipeline&lt;/strong>:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/1_zW4FBgtDLNby8FJinT8teQ.png"
loading="lazy"
alt="Image"
>
Image by Author&lt;/p>
&lt;p>In the new window, choose your repository. In this example we are using the Azure Repo that we created on the post mentioned above:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/1_M1g7_hmhSaBOQJs6-TzG2w.png"
loading="lazy"
alt="Image"
>
Image by Author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/1_IJZAmr6glzC5EW9PvB1DOg.png"
loading="lazy"
alt="Image"
>
Image by Author&lt;/p>
&lt;p>Choose the **Starter pipeline. **If you already have your own YAML, you can choose the Existing option.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/1_7dKmLb-LGN8neBcanVm9Eg.png"
loading="lazy"
alt="Image"
>
Image by Author&lt;/p>
&lt;h4 id="azure-devops-pipelineanatomy">Azure DevOps Pipeline anatomy
&lt;/h4>&lt;p>Azure DevOps will create a skeleton of a pipeline. It is quite simple, but enough to start. Let’s see what we have there:&lt;/p>
&lt;ul>
&lt;li>**Trigger — **This is the configuration about which branch(or branches) our pipeline will be triggered if we have new commits. Normally this is tied to your branch strategy, by default it is created to the default branch in the chosen repository.&lt;/li>
&lt;li>**Pool **— The pools are a set of machines that run our build inside. Azure DevOps has two pools when it’s created. The **Default **is a pool in which you can add your own agents. **Azure Pipelines **on the other hand is a SaaS agent that Microsoft provisions.&lt;/li>
&lt;li>**Steps **— Finally it starts to be fun, we have the steps! They are instructions that we send to agents in order to complete our pipeline. In some cases, they can be simple command-line scripts, but we can also make use of “packaged scripts” in the Microsoft marketplace, also known as &lt;strong>Tasks&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/1_ioGI-irRd-PRszOq7ZfqOQ.png"
loading="lazy"
alt="Image"
>
Image by Author&lt;/p>
&lt;p>To prepare the pipeline for dotnet core, we will change the pool to &lt;strong>windows-latest&lt;/strong>, as I am using a Windows machine, I want to keep the same.&lt;/p>
&lt;p>And we will also use a &lt;strong>dotnet core task&lt;/strong>, with the publish command. It will prepare all the artifacts necessary to deploy our application.&lt;/p>
&lt;p>In the next step, we will use an Azure Web App task, that will deploy in deploy in App Service previously created in Azure. Pay attention that a service connection is required here, so make sure that the name matches yours.&lt;/p>
&lt;p>Below there is all you need to create this pipeline. Simply delete the content created automatically and replace it.&lt;/p>
&lt;h3 id="how-to-create-an-azure-devops-pipeline-withstages">How to create an Azure DevOps pipeline with stages
&lt;/h3>&lt;p>Now let&amp;rsquo;s make it a bit more complex :). The pipeline above will cover some simple scenarios, mostly for testing and learning. However, if you need something more robust, you will need to organize it in a better way.&lt;/p>
&lt;p>There are two resources on Azure Pipelines that will enable it: &lt;strong>Stages&lt;/strong> and &lt;strong>jobs.&lt;/strong>&lt;/p>
&lt;h4 id="what-are-jobs-in-azuredevops">What are Jobs in Azure DevOps?
&lt;/h4>&lt;p>In a few words, **Jobs **are sets of **Steps **that run together. Every pipeline has at least one job, even if you do not specify one, by default your steps will be encapsulated in a job.&lt;/p>
&lt;p>There are multiple scenarios where the use of multiple jobs is beneficial, as per separate responsibilities, running different jobs in parallel, and so on.&lt;/p>
&lt;p>There is one special type of job for deployments. It is recommended to use it as brings some benefits as Deployment history and the possibility to use pre-configured strategies, such as canary, blue-green, etc.&lt;/p>
&lt;p>To specify a job, you can simply add this to your pipeline:&lt;/p>
&lt;h4 id="what-are-stages-in-azuredevops">What are Stages in Azure DevOps?
&lt;/h4>&lt;p>As we saw above that Jobs are sets of Steps, so guess what? Stages are sets of… Jobs!&lt;/p>
&lt;p>To determine the boundaries of your deployment, pausing and validating before moving on, Stages must be used.&lt;/p>
&lt;p>I recommend structuring your pipelines in the following manner:&lt;/p>
&lt;ul>
&lt;li>One stage to gather all artifacts that will be used during the deployment, also known as a “build stage” (in some cases, you don’t need a real build generating binaries, as some languages don’t produce them, as IaC languages or even PHP for example).&lt;/li>
&lt;li>Different deployment stages for different environments, for example, Development, UAT, and Production. It will allow you to validate the quality of your code during the journey toward production.&lt;/li>
&lt;/ul>
&lt;p>The stage structure is similar to the job syntax, and contains one or more jobs:&lt;/p>
&lt;p>Below we can see the conversion of the simple pipeline to a complete pipeline using **Jobs **and &lt;strong>Stages:&lt;/strong>&lt;/p>
&lt;h3 id="key-takeaways">Key takeaways
&lt;/h3>&lt;p>Azure Pipelines is a powerful and very flexible tool that can technically support all programming languages, clouds, and technologies. It is part of Azure DevOps ecosystem, having native integration with with the other tools, do not require external integrations, however it also supports if required, and it makes quite easy to configure and increase productivity from the first moment you start to use it.&lt;/p>
&lt;p>I hope this would help you, and see you in the next post!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines/0_rbBIrAtLWWmh60Qi.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="-if-you-find-this-helpful-please-click-the-clap--button-below-a-few-times-to-show-your-support-for-the-author">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇
&lt;/h4>&lt;h4 id="join-faun-developer-community--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>
&lt;/h4></description></item><item><title>Git Basic commands in a nutshell</title><link>http://www.wesleycamargo.com/p/git-basic-commands-in-a-nutshell/</link><pubDate>Thu, 27 Oct 2022 14:55:13 +0200</pubDate><guid>http://www.wesleycamargo.com/p/git-basic-commands-in-a-nutshell/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/0_Fuhc6LIKQ3NiJEDU.png" alt="Featured image of post Git Basic commands in a nutshell" />&lt;h3 id="git-basic-commands-in-anutshell">Git Basic commands in a nutshell
&lt;/h3>&lt;p>Without a doubt, git is the most popular Version Control System nowadays. There is a big chance that everyone who works with IT already heard about it, or even already used git. In this post, I gathered the most common git commands in one place and a brief explanation about them.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/0_Fuhc6LIKQ3NiJEDU.png"
loading="lazy"
alt="Image"
>
Commit workflow — Image from &lt;a class="link" href="https://git-scm.com/about/staging-area" target="_blank" rel="noopener"
>Git Docs&lt;/a>&lt;/p>
&lt;p>At the end of the post, I will let all commands used with the description of them.&lt;/p>
&lt;h3 id="prerequisites">Prerequisites
&lt;/h3>&lt;p>To demonstrate in a more realistic scenario, in this post we will use a dotnet core project and, of course, the git tool. Right below, you can see all the prerequisites to follow it, and after there are links for previous posts showing how to configure git and VS Code, as well as how to install dotnet core and create a project with it.&lt;/p>
&lt;ul>
&lt;li>git&lt;/li>
&lt;li>Visual Studio Code&lt;/li>
&lt;li>dotnet core&lt;/li>
&lt;li>Windows Terminal&lt;/li>
&lt;/ul>
&lt;h4 id="git-and-visual-studiocode">Git and Visual Studio Code
&lt;/h4>&lt;p>Git and Visual Studio Code are the main tools that we will be using in this post, so if you do not have it already configured, in &lt;a class="link" href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" target="_blank" rel="noopener"
>this post&lt;/a>, I describe how to set it up.&lt;/p>
&lt;h4 id="creating-a-dotnet-coreproject">Creating a dotnet core project
&lt;/h4>&lt;p>To demonstrate in a more realistic scenario, we will create a simple dotnet core project. In this &lt;a class="link" href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" target="_blank" rel="noopener"
>post&lt;/a>, I show how to configure dotnet core on your computer, and also how to create a web app project to be used as an example.&lt;/p>
&lt;h3 id="how-to-configure-gitlocally">How to configure git locally
&lt;/h3>&lt;h4 id="initializing-a-git-repository">Initializing a git repository
&lt;/h4>&lt;p>Initializing the git repository is the first step to start working with git. It will create the git structure, and allow you to start versioning your files. It is possible to initialize either an empty directory or a directory with files inside already. In our case, we already created the project files previously following this &lt;a class="link" href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" target="_blank" rel="noopener"
>post&lt;/a>.&lt;/p>
&lt;p>It is possible to initialize the git repository by either the user interface or the command line, which one is better, depending on your personal preferences. Below you can see both options:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_a9Ym0PL-XMeIMNAnBT4aHA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>For the command line, simply type the command &lt;code>git init&lt;/code> . And that’s it! Quite simple as I promised :).&lt;/p>
&lt;h4 id="what-is-thegit-directory">What is the .git directory?
&lt;/h4>&lt;p>.git directory is a hidden directory that git creates to keep its files inside. You rarely need to change something in these files, but it’s worth knowing that git uses &lt;code>.git&lt;/code> a directory to identify and control your repository. Due to the fact this is hidden, you need to run a special command to see it. With PowerShell, you can see with the command &lt;code>Get-ChildItem -Hidden&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_c9xJW-cSEhtYjljWwKCFAA.png"
loading="lazy"
alt="Image"
>
.git directory — Image prepared by Author&lt;/p>
&lt;p>To verify how the files are being tracked by git, click on the git icon on the left menu. After that, it is possible to see all files under “Changes”&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_kOv7KudC4OCvilsM8AoVdA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="what-are-the-basic-git-commands-for-local-repositories">What are the basic git commands for local repositories
&lt;/h3>&lt;h4 id="ignoring-files">ignoring files
&lt;/h4>&lt;p>Before we go to the commands themselves, it is important to understand that in some cases, it is not desirable to keep certain files under source control. For example, when we work with compiled languages, it generates binary files that you don’t want to keep under version control, as they can always be generated using the code that is already versioned.&lt;/p>
&lt;p>To solve this problem you need to create a .gitignore file, with instructions on which files you don’t want to keep versioned.&lt;/p>
&lt;p>To create this file, as we are using a dotnet core application as an example, in the VS Code terminal, ensure that you are in the root directory of your repository and type &lt;code>dotnet new gitignore&lt;/code>.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_rgiVE7dvpIlT5CrLezoBpw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>You can see that among others, the folders &lt;code>bin&lt;/code>and &lt;code>obj&lt;/code> are listed, which is what we want in our case.&lt;/p>
&lt;h4 id="stageadding-files-to-stage-withgit">stage — Adding files to stage with git
&lt;/h4>&lt;p>Staging is an intermediate area where you keep your changed files before you finish the commit. It allows you to review and format them, and also makes it easy to commit your files partially.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/0_Fuhc6LIKQ3NiJEDU.png"
loading="lazy"
alt="Image"
>
Commit workflow — Image from &lt;a class="link" href="https://git-scm.com/about/staging-area" target="_blank" rel="noopener"
>Git Docs&lt;/a>&lt;/p>
&lt;p>The command &lt;code>git add&lt;/code> is used to add the files to the staging area. You can add file by file specifying the name &lt;code>git add &amp;lt;your file name&amp;gt;&lt;/code>, or you can add all files at once with &lt;code>git add .&lt;/code>&lt;/p>
&lt;p>In our project, let’s first add the gitignore that we created in the session above. It will prevent adding any undesired files that are already generated.&lt;/p>
&lt;p>For this type the command &lt;code>git add .\.gitignore&lt;/code>. You will notice that on VS Code the letter in front of the file name changed from U(Untracked) to A(index Added) and also it slightly changed the color. It means that this file is under the staging area.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_ExLkWcOnrGycDacgiftVyg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now that the gitignore is already there, we can add the remaining files with &lt;code>git add .&lt;/code> .&lt;/p>
&lt;h4 id="recording-your-changes-with-gitcommit">Recording your changes with git commit
&lt;/h4>&lt;p>Finally, we will be able to create our first commit! It will record our changes in the version control. It always requires a comment, to identify what had changed in this commit. To do so, use the command &lt;code>git commit -m &amp;quot;my first commit&amp;quot;&lt;/code> . Notice that all files under the source control menu disappeared, but no worries, it means that there are no more files in the staging area, and they are already “safe”.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_WWe1X1lVtUuQmyIzE47fWw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="finding-the-status-of-your-changedfiles">Finding the status of your changed files
&lt;/h4>&lt;p>Before, we checked the files in the staging area by the user interface. But it’s also possible to use the command &lt;code>git status&lt;/code> for that. Notice that is possible to visualize either the Staged and Untracked files:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_J3B6lmtSlSvvBFwOxAputw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="using-git-log-to-show-yourhistory">Using git log to show your history
&lt;/h4>&lt;p>The command&lt;code>git log&lt;/code> is used to show the commits history, and brings useful information. By default, it shows the commit hash, which helps to track in which branches, or environments the changes are, the author and date of commits, which helps to identify who made those changes, and finally the comment of the commits that shows (if used correctly🙃) the purpose of that commit.&lt;/p>
&lt;p>You can also customize the results, one of my favorites is to show all commits in one line, for this you can use &lt;code>git log — pretty=oneline&lt;/code>.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_bRS7QOz3KK4cBgHWbRUEiw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>If you followed the &lt;a class="link" href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" target="_blank" rel="noopener"
>first post&lt;/a> of the version control series to set up your git environment, I also included the configuration of an alias for a log command with some formats I like to use. You can also see all details of this in &lt;a class="link" href="https://camargo-wes.medium.com/creating-a-pretty-git-log-61f312f45201" target="_blank" rel="noopener"
>this post&lt;/a>.&lt;/p>
&lt;h4 id="creating-and-moving-among-gitbranches">Creating and moving among git branches
&lt;/h4>&lt;p>There are several ways to work with git and organize your branches, which is called &lt;strong>branch strategy&lt;/strong>. In the most common it is necessary to create branches to apart your code from the stable branch.&lt;/p>
&lt;p>In the DevOps community, there are polemic discussions that branching is a bad practice that avoids real continuous integration, but this is not the topic that we are approaching today.&lt;/p>
&lt;p>Independent if it is a good practice or not, branches are very useful for many situations and it’s worth having it in your toolbox.&lt;/p>
&lt;p>When a repository is created, it always creates a default branch, which can be called &lt;code>master&lt;/code> or &lt;code>main&lt;/code> depending on your preferences, and both can be used as stable branches or baselines.&lt;/p>
&lt;p>It is fairly common to create branches called &lt;code>**features**&lt;/code>, so it is possible to work without interfering with the stable branch.&lt;/p>
&lt;p>To list the branches on your repository, simply type &lt;code>git branch&lt;/code>, and it will show all local branches that you have. If you have a remote repository you can also list the remote branches with the command &lt;code>git branch -r&lt;/code>.&lt;/p>
&lt;p>To create a new branch use the command &lt;code>git branch &amp;lt;branch name&amp;gt;&lt;/code> or &lt;code>git checkout -b &amp;lt;branch name&amp;gt;&lt;/code> . Personally, I prefer the second option, as it already switches to the newlywed-created branch.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/1_-kVWZXyyymzr93tN1j3CtA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Imagine that after some commits on your feature branch for some reason you want to move back to master, so the &lt;code>git checkout &amp;lt;branch name&amp;gt;&lt;/code>command will be moving from one branch to another.&lt;/p>
&lt;h3 id="all-basic-git-commandsgathered">All basic git commands gathered
&lt;/h3>&lt;p>As promised, below are all commands used in this post:&lt;/p>
&lt;h3 id="key-takeaways">Key take aways
&lt;/h3>&lt;p>Git is a foundation of mostly modern development, and starting with it is quite simple. I hope that with this commands list you will help you move forward with the IT world!&lt;/p>
&lt;h4 id="related-posts">Related posts
&lt;/h4>&lt;p>&lt;a class="link" href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" target="_blank" rel="noopener"
>How to create a dotnet core project with command line | by Wesley Camargo | Oct, 2022 | Medium&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" target="_blank" rel="noopener"
>How to setup your environment with git and VS Code with choco | by Wesley Camargo | Oct, 2022&lt;/a>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/git-basic-commands-in-a-nutshell/0_Ibsvh13DKfhQqsj3.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>
&lt;h3 id="join-faun--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>
&lt;/h3></description></item><item><title>How to create a dotnet core project with command line</title><link>http://www.wesleycamargo.com/p/how-to-create-a-dotnet-core-project-with-command-line/</link><pubDate>Wed, 26 Oct 2022 18:21:02 +0200</pubDate><guid>http://www.wesleycamargo.com/p/how-to-create-a-dotnet-core-project-with-command-line/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*bpTSYTtQASQsZBf1" alt="Featured image of post How to create a dotnet core project with command line" />&lt;h3 id="how-to-create-a-dotnet-core-project-with-commandline">How to create a dotnet core project with command line
&lt;/h3>&lt;p>In this post, we will see how to simply create a dotnet core application using the command line. For that, we will use Windows Terminal with PowerShell, but it is possible to use any terminal for it :)&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*bpTSYTtQASQsZBf1"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@lordarcadius?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Vipul Jha&lt;/a> on &lt;a class="link" href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="installing-dotnet-core-with-commandline">Installing dotnet core with command line
&lt;/h3>&lt;p>Install dotnet core with the command line is quite simple. For that, we will use Winget with the command below:&lt;/p>
&lt;h3 id="creating-dotnet-project-in-windowsterminal">Creating dotnet project in Windows Terminal
&lt;/h3>&lt;p>For this post, we will use Windows Terminal, but you can use any terminal that you want.&lt;/p>
&lt;p>Open the terminal in the directory that you want to create your project and type the command &lt;code>dotnet new webapp -n demo&lt;/code> . It will generate a directory called “**demo” **within the project structure.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_08bKMGd2HDp7FNVYBkk1FA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Enter into the directory created and type &lt;code>code .&lt;/code> . This command will open the Visual Studio Code in your project directory:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_TXv2VCIEUCL6IB1HJ1Z9hg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>In the VS Code is possible to see the project structure, as we can see below:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_40oFqCrIUrJMRJjI0txVOA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="how-to-build-and-run-a-dotnet-core-projectlocally">How to build and run a dotnet core project locally
&lt;/h3>&lt;p>Now let’s build our dotnet project to ensure everything is working properly. The easiest way to do that is using the integrated terminal in VS Code.&lt;/p>
&lt;p>To open the terminal type &lt;code>ctrl + `` or go to **View &amp;gt; Terminal. **In the terminal that will appear at the bottom of your VS Code, type the command &lt;/code>dotnet build` . If everything goes well you should see the **Build succeeded **message.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_Ay0Vk78CsEux4r2KuxV2PQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>We can now run our web app with the command &lt;code>dotnet run&lt;/code> . It will start the web app locally in some ports. You can copy one of them and open it on your browser:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_Jtan4uZ740glcB0y3OXBEg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-a-dotnet-core-project-with-command-line/1_N21SjaR9uc_j1XBD2xOfpQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>In further posts, we will see more about DevOps practices, and having a real application to start with is crucial to understand all the steps that will be applied in a real-life scenario.&lt;/p>
&lt;p>I hope this post could be useful and see you in the next one!&lt;/p></description></item><item><title>How to create commits with different users in git</title><link>http://www.wesleycamargo.com/p/how-to-create-commits-with-different-users-in-git/</link><pubDate>Wed, 19 Oct 2022 23:12:09 +0200</pubDate><guid>http://www.wesleycamargo.com/p/how-to-create-commits-with-different-users-in-git/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-commits-with-different-users-in-git/1_fLG0WrzYU-ZuAkqAKqT__A.jpeg" alt="Featured image of post How to create commits with different users in git" />&lt;h3 id="how-to-create-commits-with-different-users-ingit">How to create commits with different users in git
&lt;/h3>&lt;p>In my previous &lt;a class="link" href="https://faun.pub/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" target="_blank" rel="noopener"
>post&lt;/a>, I showed among other stuff how to configure your git credentials. But in case you need to use different users in different projects or repositories, you need to be sure that your commits are using the correct credentials. Check on this post how to configure it properly and stop messing up your repos ;)&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-commits-with-different-users-in-git/1_fLG0WrzYU-ZuAkqAKqT__A.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Yancy Min&lt;/a> on &lt;a class="link" href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>I know a lot of people that already made a commit using the wrong credentials in either work or personal repos. Having to remember to configure this in every new repository is not the best way to do that.&lt;/p>
&lt;p>For this, we can use &lt;a class="link" href="https://git-scm.com/docs/git-config#_conditional_includes" target="_blank" rel="noopener"
>Conditional Includes&lt;/a> when creating our config file. This is a bit more complex than just setting the user and email, but it will help you to avoid a lot of work, in case you need to rewrite your commit history later :).&lt;/p>
&lt;h3 id="understanding-the-git-configuration">Understanding the git configuration
&lt;/h3>&lt;p>The git configuration is used to introduce customized behaviors on git and it has three different scopes of settings:&lt;/p>
&lt;ul>
&lt;li>**System **— In this scope, the settings are applied to all users and all repositories. To edit this scope use the parameter &lt;code>--system&lt;/code> . To verify which configurations are in the system scope, type the command &lt;code>git config --system -l&lt;/code>&lt;/li>
&lt;li>**Global **— This is the user scope, where it is possible to customize settings using the parameter &lt;code>--global&lt;/code> , and it is applied to all repositories of that user. The global configuration file sits in the user directory on your computer.&lt;/li>
&lt;li>&lt;strong>Local&lt;/strong>— Each repository can also have its own customized settings. It is possible to find the configuration file in the git directory inside each repository &lt;code>./.git/config&lt;/code> , or it is also possible to check with the parameter&lt;code>--local&lt;/code> .&lt;/li>
&lt;/ul>
&lt;p>The lower the scope, the higher the priority, so it means that the local scope overrides the global scope, and the global overrides the system scope. With that said, the precedence is in the following order: &lt;strong>System&lt;/strong>&amp;gt; **Global **&amp;gt; &lt;strong>Local&lt;/strong>&lt;/p>
&lt;p>It is possible to trace back from where the configuration is coming from: &lt;code>git config -l --show-origin&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-commits-with-different-users-in-git/1_Y_rGL86RNTws8Z7qeAD59Q.png"
loading="lazy"
alt="Image"
>
Different scopes of configuration — Image by author&lt;/p>
&lt;p>In our case, we will play around with the user&amp;rsquo;s configurations. These configurations are stored in a file &lt;code>.gitconfig&lt;/code> that sits in your user directory, as mentioned above. To easily access it, you can type &lt;code>~/.gitconfig&lt;/code> in your terminal and you will be able to see something similar to this:&lt;/p>
&lt;h3 id="creating-the-conditional-includes-in-gitconfig">Creating the conditional includes in gitconfig
&lt;/h3>&lt;p>For each user we want to use, it is necessary to create a separate folder, where the repositories will sit. This is because we will use the directory that git specifies in its configuration to identify where we are. In my example, I will configure my global email, which will be used for all repositories, except those under the folder &lt;code>c:\repos\work&lt;/code> .&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-commits-with-different-users-in-git/1_rW4Zp3L7W8fYOY94dmpV5w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>With our work repositories under the correct folder, we need to create a specific configuration file for that “profile”. You can type the command &lt;code>echo [user] &amp;gt; ~/work.gitconfig&lt;/code>to create it under your user directory. After creation, populate with needed information for the profile, as per below:&lt;/p>
&lt;p>After creating the &lt;code>work.gitconfig&lt;/code> file, in your main file (&lt;code>.gitconfig&lt;/code>), include the &lt;code>[includeIf]&lt;/code> session. The command &lt;code>gitdir/i&lt;/code> will return the directory of your repository, and if it matches the directory that you specified, it will load the &lt;code>work.gitconfig&lt;/code> .&lt;/p>
&lt;h3 id="concluding">Concluding…
&lt;/h3>&lt;p>This configuration is quite simple, but can be very helpful if you work in many projects simultaneously . I hope it can help somehow and see you in the next post!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-create-commits-with-different-users-in-git/0_nTpwFrWVp057bnqw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>
&lt;h3 id="join-faun--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>
&lt;/h3></description></item><item><title>How to setup your environment with git and VS Code with choco</title><link>http://www.wesleycamargo.com/p/how-to-setup-your-environment-with-git-and-vs-code-with-choco/</link><pubDate>Mon, 10 Oct 2022 15:10:04 +0200</pubDate><guid>http://www.wesleycamargo.com/p/how-to-setup-your-environment-with-git-and-vs-code-with-choco/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-setup-your-environment-with-git-and-vs-code-with-choco/1_fLG0WrzYU-ZuAkqAKqT__A.jpeg" alt="Featured image of post How to setup your environment with git and VS Code with choco" />&lt;h3 id="how-to-setup-your-environment-with-git-and-vs-code-withchoco">How to setup your environment with git and VS Code with choco
&lt;/h3>&lt;p>Configuring your git environment is something very important to begin using version control. In this post, I will show you, step by step, how to install and configure git correctly and also how to use Visual Studio Code as a default editor, And at the end of the post, there are the full scripts to help you set up your environment, **with a bonus **in it ;).&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-setup-your-environment-with-git-and-vs-code-with-choco/1_fLG0WrzYU-ZuAkqAKqT__A.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Yancy Min&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/git?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="how-to-install-git-and-visual-studio-code-with-powershell-andchoco">How to install git and Visual Studio Code with PowerShell and Choco
&lt;/h3>&lt;h4 id="how-to-install-chocolatey-with-powershell">How to install Chocolatey with PowerShell
&lt;/h4>&lt;p>Before we proceed with git and VSCode, first we need to install the Chocolatey. &lt;a class="link" href="https://community.chocolatey.org/" target="_blank" rel="noopener"
>Chocolatey&lt;/a>, or simply Choco, is a package installer designed for work with PowerShell.&lt;/p>
&lt;p>The easiest way to install choco is by running a PowerShell script in your terminal. Below I have prepared a script that calls the official Choco script on its site:&lt;/p>
&lt;h3 id="how-to-install-git-on-windows-usingchoco">How to install git on Windows using choco
&lt;/h3>&lt;p>After installing Choco, we will be able to install the git package available there. To install, the command is very straightforward as we can see below (might be necessary to run the command with administrative privileges):&lt;/p>
&lt;p>After the installation, check if git was correctly installed with the command &lt;code>git -v&lt;/code> :&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-setup-your-environment-with-git-and-vs-code-with-choco/1_n_lAcHewgubjgsb-KeoXLw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>If you receive an error saying that git is not installed, close and reopen your terminal, it will reload the environment variables with the correct git path.&lt;/p>
&lt;h3 id="how-to-install-visual-studio-code-with-choco-and-powershell">How to install Visual Studio Code with choco and PowerShell
&lt;/h3>&lt;p>As well we saw to install git, the command to install VSCode with choco and PowerShell is also very simple:&lt;/p>
&lt;p>To check the installation, use the command &lt;code>code -v&lt;/code> . Again, in case of any problem, close and reopen your terminal.&lt;/p>
&lt;h3 id="how-to-setup-git-credentials">How to setup git credentials
&lt;/h3>&lt;h4 id="how-to-setup-git-username-andemail">How to setup git username and email
&lt;/h4>&lt;p>To associate your identity with your commits, it is necessary to define your git user name and email. You can configure it in different scopes, below we can see how to configure it globally:&lt;/p>
&lt;h3 id="how-to-setup-visual-studio-code-as-the-default-giteditor">How to setup Visual Studio Code as the default git editor
&lt;/h3>&lt;p>The default editor for git is nano. Personally, I prefer VS Code, as it has several extensions that can improve productivity. In the script below, we are setting up the VSCode as the default tool for the command diff and merge and also as the default editor:&lt;/p>
&lt;h3 id="how-to-install-and-configure-git-and-vs-code-with-powershell-script">How to install and configure Git and VS Code with PowerShell Script
&lt;/h3>&lt;h4 id="installation">Installation
&lt;/h4>&lt;p>To install all necessary tools, you can simply run the script below. Might be necessary to have administrator permissions for that. In the first 6 lines, the script installs choco, and then uses choco to install git and vscode:&lt;/p>
&lt;h4 id="configuration">Configuration
&lt;/h4>&lt;p>After installing the tools, you may need to reload your terminal, as I said above, so to make it easier I created two different scripts 😉. As a &lt;strong>Bonus,&lt;/strong> I also added an alias to a command &lt;code>git lg&lt;/code>, which is an alias for &lt;code>git log&lt;/code> , but using prettier options. You can check more about it on this post &lt;a class="link" href="https://faun.pub/creating-a-pretty-git-log-61f312f45201" target="_blank" rel="noopener"
>Creating a pretty git log&lt;/a>:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Source control is the basis of any DevOps process, and git is currently the most used tool for it. Using the right configuration together with VS Code will help to start this journey!&lt;/p>
&lt;h3 id="references">References
&lt;/h3>&lt;p>&lt;a class="link" href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" target="_blank" rel="noopener"
>Git — Installing Git (git-scm.com)&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://docs.chocolatey.org/en-us/" target="_blank" rel="noopener"
>Chocolatey Software Docs | Chocolatey — Software Management for Windows&lt;/a>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-setup-your-environment-with-git-and-vs-code-with-choco/0_3ahp0-lW18WfoBhc.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>
&lt;h3 id="join-faun--get-similar-stories-in-your-inbox-eachweekhttpfromfauntor8zxxd">🚀&lt;a class="link" href="http://from.faun.to/r/8zxxd" target="_blank" rel="noopener"
>Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>
&lt;/h3></description></item><item><title>How to deploy Management Groups with Azure Bicep and Azure DevOps</title><link>http://www.wesleycamargo.com/p/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/</link><pubDate>Mon, 26 Sep 2022 15:04:40 +0200</pubDate><guid>http://www.wesleycamargo.com/p/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/1_dpWnelmmdCalVRtcf1k5fQ.jpeg" alt="Featured image of post How to deploy Management Groups with Azure Bicep and Azure DevOps" />&lt;h3 id="how-to-deploy-management-groups-with-azure-bicep-and-azuredevops">How to deploy Management Groups with Azure Bicep and Azure DevOps
&lt;/h3>&lt;p>If you have several Subscriptions on your Azure Tenant, Management Groups can be very handy to organize them. Check in this post, on how to deploy Management Groups using Azure Bicep.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/1_dpWnelmmdCalVRtcf1k5fQ.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@ianjbattaglia?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Ian Battaglia&lt;/a> on &lt;a class="link" href="https://unsplash.com/collections/16762197/data-center?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="what-are-azurescopes">What are Azure Scopes?
&lt;/h3>&lt;p>According to official Microsoft documentation “&lt;em>Scope&lt;/em> is the set of resources that access applies to.” This is used to have granularity when assigning permission in your Azure resources. The majority of Azure resources are deployed into the Resource Group scope, and when we use Azure bicep, this is the default. But there are four levels of scopes in Azure as we can see in the image below:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/0_7OACaXq6bHYTogMW.png"
loading="lazy"
alt="Image"
>
Azure Scope levels — Image from &lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/scope-overview?WT.mc_id=DT-MVP-5004039" target="_blank" rel="noopener"
>Microsoft Docs&lt;/a>&lt;/p>
&lt;p>With that said, when we are deploying a resource different than those deployed at the resource level, we need to specify against which scope we are running it. For Management groups, the scope must be the **tenant. **In the following sessions, we will see how to set it up.&lt;/p>
&lt;h4 id="bicep-scope-to-deploy-azure-management-groups">Bicep scope to deploy Azure Management Groups
&lt;/h4>&lt;p>As said before, the default scope in an Azure Bicep script is the resource group. For most traditional resources such as App Services, or Storage Accounts, it is not necessary to specify it, but to deploy management groups it is necessary to specify the tenant as the target scope:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/1_9ubvxa-Zjx8xk4dz0iucFw.png"
loading="lazy"
alt="Image"
>
Image prepared by Author&lt;/p>
&lt;p>Below it’s possible to see the code necessary for the most basic creation of a Management Group:&lt;/p>
&lt;h4 id="how-to-call-an-azure-bicep-template-at-the-management-group-scope-with-azure-cli-and-azure-devops-yaml-pipelines">How to call an Azure Bicep template at the Management Group scope with Azure CLI and Azure DevOps YAML pipelines
&lt;/h4>&lt;p>To run deployments against tenant scope it is also necessary to specify it in Azure CLI&lt;/p>
&lt;p>Below there is an Azure DevOps YAML pipeline with the task configured to deploy the bicep file created above:&lt;/p>
&lt;h3 id="spn-permissions-to-deploy-azure-management-groups">SPN permissions to deploy Azure Management Groups
&lt;/h3>&lt;p>By default, the Service Principal Name does not have permission to deploy tenant resources. You need to grant it at the root scope “/” to make it work.&lt;/p>
&lt;p>In this case, the error below will show up:&lt;/p>
&lt;p>&lt;code>ash AuthorizationFailed: The client with object id does not have authorization to perform action 'Microsoft.Resources/deployments/validate/action' over scope '/providers/Microsoft.Resources/deployments/main' or the scope is invalid. &lt;/code>&lt;/p>
&lt;h4 id="how-to-elevate-user-permissions-as-azure-ad-global-administrator">How to elevate user permissions as Azure AD Global Administrator
&lt;/h4>&lt;p>First, you need to elevate your permissions as user Global Administrator into Azure AD:&lt;/p>
&lt;h4 id="how-to-grant-service-principal-name-permissions-to-deploy-azure-management-groups">How to grant Service Principal Name permissions to deploy Azure Management Groups
&lt;/h4>&lt;p>After setting up your permissions as Global Administrator, you are able to set your SPN with the correct permissions:&lt;/p>
&lt;h3 id="the-best-azure-management-groups-naming-convention">The best Azure Management Groups naming convention
&lt;/h3>&lt;p>It is also crucial to properly name your Management Groups, making them easy to maintain, especially if you are adopting Infrastructure as Code with automated pipelines. Also, if you have multiple directories, you also need to efficiently identify which directory a particular management group belongs to.&lt;/p>
&lt;p>My friend &lt;a class="link" href="https://twitter.com/DevJevNL" target="_blank" rel="noopener"
>@DevJevNL&lt;/a> has an excellent proposal to tackle the naming convention in a series of posts, here is his suggestion for &lt;a class="link" href="https://www.devjev.nl/posts/2022/the-ideal-management-group-naming-convention/" target="_blank" rel="noopener"
>Management Groups.&lt;/a>&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Although it is a very simple process, there are some tricks to deploying management groups. In this post, I tried to clarify all the necessary steps to deploy it. Below it is possible to visualize the management group deployed in our Azure Tenant.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops/1_v7ss3g8wQRZUMN4XuXvs8w.png"
loading="lazy"
alt="Image"
>
Image prepared by Author&lt;/p>
&lt;h3 id="references">References
&lt;/h3>&lt;p>&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin?WT.mc_id=DT-MVP-5004039" target="_blank" rel="noopener"
>https://learn.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin&lt;/a>
&lt;a class="link" href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md" target="_blank" rel="noopener"
>&lt;strong>Enterprise-Scale/EnterpriseScale-Setup-azure.md at main · Azure/Enterprise-Scale&lt;/strong>
*This article will guide you through the process of configuring permissions in your Azure environment to enable ARM…*github.com&lt;/a>&lt;a class="link" href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md" target="_blank" rel="noopener"
>&lt;/a>&lt;/p></description></item><item><title>Como funcionam os Loops — Developer BR — Corujinhas</title><link>http://www.wesleycamargo.com/p/como-funcionam-os-loops-developer-br-corujinhas/</link><pubDate>Wed, 27 Jul 2022 23:48:29 +0200</pubDate><guid>http://www.wesleycamargo.com/p/como-funcionam-os-loops-developer-br-corujinhas/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/como-funcionam-os-loops-e-developer-br-e-corujinhas/0_hgbUwY6z642w44jS.png" alt="Featured image of post Como funcionam os Loops — Developer BR — Corujinhas" />&lt;h3 id="como-funcionam-os-loopsdevelopers-brcorujinhas">Como funcionam os Loops — Developers BR — Corujinhas
&lt;/h3>&lt;h3 id="loops">Loops
&lt;/h3>&lt;h4 id="o-que-é-um-loop-oulaço">O que é um loop ou laço?
&lt;/h4>&lt;p>Um loop é uma maneira de executar um trecho código repetidas vezes. É composto de uma condição e o código que será executado.&lt;/p>
&lt;p>O loop é representado por um circuito fechado, e enquanto a condição não for satisfeita se repete infinitamente.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-funcionam-os-loops-e-developer-br-e-corujinhas/0_hgbUwY6z642w44jS.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="condições-de-umloop">Condições de um loop
&lt;/h4>&lt;p>As condições são usadas para verificar quantas vezes o trecho de código será repetido. Antes de cada execução (ou depois, dependendo do tipo da estrutura de repetição usada), a condição é verificada e se continuar verdadeira o código é executado. Os tipo de condições podem ser:&lt;/p>
&lt;ul>
&lt;li>Verdadeiro ou Falso&lt;/li>
&lt;li>Um número específico de vezes&lt;/li>
&lt;li>O número de elementos em uma coleção&lt;/li>
&lt;/ul>
&lt;h4 id="código">Código
&lt;/h4>&lt;p>Praticamente qualquer tipo de código pode ser executado em um loop, não há restrições! Em alguns casos, certos tipos de variáveis são usadas para ajudar a controlar o que está acontecendo durante as repetições. Essa variável é chamada de &lt;strong>contador&lt;/strong>.&lt;/p>
&lt;h4 id="quando-usar-umloop">Quando usar um loop
&lt;/h4>&lt;p>Usamos loops quando precisamos fazer a mesma coisa várias vezes. Vamos a um exemplo:&lt;/p>
&lt;p>Imagine que estamos criando um sistema para uma cafeteria. Os requisitos para esse sistema são:&lt;/p>
&lt;ul>
&lt;li>Para cada novo café pedido escrever na tela o número do pedido que está sendo executado&lt;/li>
&lt;li>Ao final exibir a quantidade total de cafés preparados&lt;/li>
&lt;/ul>
&lt;p>Para simplificar, vamos imaginar que temos 3 pedidos de café e precisamos executá-los. Como seria esse código?&lt;/p>
&lt;p>&lt;code>int cafesPreparados = 0;&lt;/code>&lt;/p>
&lt;p>&lt;code>ash &lt;/code>// Preparando o café
cafesPreparados++;
Console.WriteLine($&amp;ldquo;Preparando o 1° café&amp;rdquo;);&lt;code> &lt;/code>&lt;/p>
&lt;p>&lt;code>ash &lt;/code>cafesPreparados++;
Console.WriteLine($&amp;ldquo;Preparando o 2° café&amp;rdquo;);&lt;code> &lt;/code>&lt;/p>
&lt;p>&lt;code>ash &lt;/code>cafesPreparados++;
Console.WriteLine($&amp;ldquo;Preparando o 3° café&amp;rdquo;);&lt;code> &lt;/code>&lt;/p>
&lt;p>&lt;code>ash &lt;/code>Console.WriteLine($&amp;ldquo;Total de devs felizes: {cafesPreparados}&amp;rdquo;);&lt;code> &lt;/code>
Não parece tão complicado, certo? Realmente, se tivermos poucos pedidos não é uma tarefa difícil, mas temos dois problemas:&lt;/p>
&lt;ul>
&lt;li>No caso de apenas 3 pedidos, foram apenas mais 6 linhas de código, mas e se fossem 100? Ou 1000? Teremos um programador bem entediado repetindo esse código tantas vezes…&lt;/li>
&lt;li>Além do problema acima, de termos tarefas repetitivas, nós adicionamos dentro do código cada pedido feito - O que impede de recebermos pedidos dinamicamente e na pratica inviabiliza a aplicação.&lt;/li>
&lt;/ul>
&lt;p>Mas imagine que agora nossa cafeteria aceita pedidos online, e recebeu 10000 pedidos. Como fazer isso?&lt;/p>
&lt;p>É nessa situação que os loops vão te ajudar!&lt;/p>
&lt;h3 id="tipos-deloops">Tipos de loops
&lt;/h3>&lt;h4 id="while">While
&lt;/h4>&lt;p>É o tipo mais básico de loop. No while, a condição é verificada antes da execução, e se for verdadeira o código é executado. Normalmente é usado para comparações de verdadeiro e falso mas com um pouco mais de trabalho, ele consegue substituir algumas das outras estruturas de repetição, como for e forEach.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-funcionam-os-loops-e-developer-br-e-corujinhas/0_GaTv8RxkcfvejFwH.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>As principais características do while são:&lt;/p>
&lt;ul>
&lt;li>Enquanto uma condição for verdadeira(ou falsa), continue repetindo.&lt;/li>
&lt;li>Executa o trecho de código uma vez, volta ao inicio e verifica se a condição continua verdadeira e executa novamente.&lt;/li>
&lt;li>Atenção! Isso pode acontecer para sempre, desde que a condição continue verdadeira! Isso é chamado de loop infinito e na maioria dos casos não é desejado.&lt;/li>
&lt;/ul>
&lt;p>&lt;code>ash Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;); *int* devs = Convert.ToInt32(Console.ReadLine()); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash *int* cafesPreparados = 0; &lt;/code>&lt;/p>
&lt;p>&lt;code>ash while (cafesPreparados &amp;lt; devs) { cafesPreparados++; Console.WriteLine($&amp;quot;Preparando o {cafesPreparados}° café&amp;quot;); } &lt;/code>&lt;/p>
&lt;p>&lt;code>ash Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;); &lt;/code>&lt;/p>
&lt;h4 id="do-while">Do While
&lt;/h4>&lt;p>Para do while, acontece o oposto, o código é executado e apenas após a condição é verificada. Isso pode ser útil em casos onde pelo menos uma execução é sempre necessária.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-funcionam-os-loops-e-developer-br-e-corujinhas/0_7FpTKrY1o27XneqV.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>ash Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;); *int* devs = Convert.ToInt32(Console.ReadLine()); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash *int* cafesPreparados = 0; &lt;/code>&lt;/p>
&lt;p>&lt;code>ash do { cafesPreparados++; Console.WriteLine($&amp;quot;Preparando o {cafesPreparados}° café&amp;quot;); } while (cafesPreparados &amp;lt; devs); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash if (cafesPreparados &amp;gt; devs) { Console.WriteLine($&amp;quot;Oh não! O café está esfriando e nenhum dev está por perto!&amp;quot;); } else { Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;); } &lt;/code>&lt;/p>
&lt;h4 id="for">For
&lt;/h4>&lt;p>O for funciona da mesma maneira que o while. É recomendado seu uso para casos em que a quantidade de vezes que a repetição deve acontecer é conhecida. Para declarar um for é necessária uma variável, chamada index ou i e são necessárias 3 declarações separadas por ponto e vírgula(;):&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-funcionam-os-loops-e-developer-br-e-corujinhas/0_TcDDIvQkLXBxHr-T.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;ul>
&lt;li>Inicializar: Declaramos o valor inicial do índice&lt;/li>
&lt;li>Condição: Adicionamos a comparação que será usada para parar o loop&lt;/li>
&lt;li>Iterar: Incrementamos o índice, normalmente com ++&lt;/li>
&lt;/ul>
&lt;p>&lt;code>ash Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;); *int* devs = Convert.ToInt32(Console.ReadLine()); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash *int* cafesPreparados = 0; &lt;/code>&lt;/p>
&lt;p>&lt;code>ash for (*int* i = 0; i &amp;lt; devs; i++) { Console.WriteLine($&amp;quot;Preparando o {i}° café&amp;quot;); cafesPreparados = i; } &lt;/code>&lt;/p>
&lt;p>&lt;code>ash Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;); &lt;/code>&lt;/p>
&lt;h4 id="foreach">Foreach
&lt;/h4>&lt;p>O foreach é recomendado quando trabalhamos com coleções ou listas. Sua tradução é “para cada”, o que significa o trecho de código será repetido uma vez para cada elemento da lista.&lt;/p>
&lt;p>&lt;code>ash var developers = new List&amp;lt;*string*&amp;gt;(); *string* maisdevs = &amp;quot;s&amp;quot;; &lt;/code>&lt;/p>
&lt;p>&lt;code>ash do { Console.WriteLine(&amp;quot;Digite o nome do dev:&amp;quot;); developers.Add(Console.ReadLine() as *string* ?? string.Empty); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash Console.WriteLine(&amp;quot;Mais algum dev precisa de café? [S/N]&amp;quot;); maisdevs = Console.ReadLine() as *string* ?? string.Empty; } while (maisdevs.ToLower().Equals(&amp;quot;s&amp;quot;)); &lt;/code>&lt;/p>
&lt;p>&lt;code>ash foreach (var dev in developers) { Console.WriteLine($&amp;quot;Preparando café para o dev {dev}&amp;quot;); } &lt;/code>&lt;/p>
&lt;p>&lt;code>ash Console.WriteLine($&amp;quot;Total de devs felizes: {developers.Count}&amp;quot;); &lt;/code>&lt;/p>
&lt;h3 id="github-do-corujinhas">GitHub do Corujinhas
&lt;/h3>&lt;p>Para os exemplos completos, veja o repositório do corujinhas no GitHub!
&lt;a class="link" href="https://github.com/Developers-BR/corujinhas" target="_blank" rel="noopener"
>Developers-BR/corujinhas (github.com)&lt;/a>&lt;/p></description></item><item><title>Creating Infrastructure as Code for Azure with Azure Bicep step by step</title><link>http://www.wesleycamargo.com/p/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/</link><pubDate>Wed, 23 Mar 2022 10:54:57 +0100</pubDate><guid>http://www.wesleycamargo.com/p/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/1_opFga-VoKoV_iJ_UdsHyIQ.jpeg" alt="Featured image of post Creating Infrastructure as Code for Azure with Azure Bicep step by step" />&lt;h3 id="creating-infrastructure-as-code-for-azure-with-azure-bicep-step-bystep">Creating Infrastructure as Code for Azure with Azure Bicep step by step
&lt;/h3>&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/1_opFga-VoKoV_iJ_UdsHyIQ.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@golfarisa?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Arisa Chattasa&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/boxing?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>One of the natural steps towards DevOps and Cloud Adoption is to create your Infrastructure using Code. For Azure, the most convenient language for this is Azure Bicep which abstracts several aspects of this complex process, and supports more resources available in Azure than any other tool, making it one of the most powerful Infrastructure as Code tools for Azure.&lt;/p>
&lt;h3 id="what-is-azurebicep">What is Azure Bicep?
&lt;/h3>&lt;p>According to &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" target="_blank" rel="noopener"
>Microsoft Documentation&lt;/a>, this is the definition of Bicep:&lt;/p>
&lt;blockquote>
&lt;p>Bicep is a domain-specific language (DSL) that uses declarative syntax to deploy Azure resources. In a Bicep file, you define the infrastructure you want to deploy to Azure, and then use that file throughout the development lifecycle to repeatedly deploy your infrastructure.&lt;/p>
&lt;/blockquote>
&lt;p>In summary, this is an abstraction over ARM templates which simplifies A LOT the development of Infrastructure as Code. Its syntax is much simpler and less verbose than ARM but still has all its capabilities.&lt;/p>
&lt;p>As bicep is a DSL, we can consider ARM as an Intermediate Language and we can “build” bicep into ARM to perform our deployments. A curiosity is that the name bicep is a play on words for ARM (Azure Resource Manager) 😄.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/0_Xj6hKE461XITJs6O.gif"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="how-to-create-an-azure-resource-group-with-azurebicep">How to create an Azure Resource Group with Azure Bicep?
&lt;/h3>&lt;p>Usually, one of the firsts resources on Azure that we need to create is a Resource Group, as it will group all other resources, and make it easier to administrate.&lt;/p>
&lt;p>Create an Azure Resource Group using Azure Bicep it is quite simple, you need just the name of the resource group and the location that it will be created. Additionally, it is necessary to define the &lt;code>*targeScope *&lt;/code>as a subscription, it will be explained in more detail below.&lt;/p>
&lt;p>It is possible to deploy it in different ways, using Azure PowerShell, Azure CLI, or even Azure API’s. In this example, we will use Azure CLI to execute the deployment.&lt;/p>
&lt;h3 id="how-to-execute-an-azure-resource-group-deployment-with-azure-bicep-and-azurecli">How to execute an Azure Resource Group deployment with Azure Bicep and Azure CLI?
&lt;/h3>&lt;p>On the latest versions of Azure CLI, there are different commands to run deployments against different scopes on Azure. To create Azure Resource Groups, it is necessary to use the *subscription *scope, which was also defined on the bicep template above.&lt;/p>
&lt;p>The command used is &lt;code>az deployment sub create&lt;/code> :&lt;/p>
&lt;p>After running the script, we can check the resource group with the command &lt;code>az group show --name rg-bicepdemo&lt;/code> :&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/1_VqjeZS9nGltwhUhh5dnfKw.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h3 id="how-to-create-an-azure-storage-account-with-azure-bicep-and-azurecli">How to create an Azure Storage Account with Azure Bicep and Azure CLI?
&lt;/h3>&lt;p>When we will create a “common” resource, like Storage Account, Resource Group scope must be used. This is the default behavior of bicep, so it is not necessary to specify like it was for Resource Group creation.&lt;/p>
&lt;p>To create resources on Resource Group scope, the Azure CLI command used must be &lt;code>az deployment group create&lt;/code> :&lt;/p>
&lt;p>To check the Storage Account creation run the command &lt;code>az storage account show --name stbicepdemo&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/1_cpJGnAWnd5Epc1NgkxxQ4A.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>As they are in different scopes, it is not possible to run both bicep files with one command, however, I prepared a PowerShell script to run them in sequence:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Azure Bicep is one of the most promising Infra as Code tools for Azure, and it is quite simple to create new templates for it. Its syntax is very simple and easy to learn, so why not give it a chance? :)&lt;/p>
&lt;p>See you in the next post!
[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>It’s time to tidy up your code: How to use Visual Studio Code Autoformat</title><link>http://www.wesleycamargo.com/p/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/</link><pubDate>Wed, 16 Mar 2022 12:25:13 +0100</pubDate><guid>http://www.wesleycamargo.com/p/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_N_tA9AjjjsJm1w_h2pPghQ.jpeg" alt="Featured image of post It’s time to tidy up your code: How to use Visual Studio Code Autoformat" />&lt;h3 id="its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat">It’s time to tidy up your code: How to use Visual Studio Code Autoformat
&lt;/h3>&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_N_tA9AjjjsJm1w_h2pPghQ.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@hocza?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Jozsef Hocza&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/broom?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>If you are like me and like to have consistency in formatting your code, this is definitely a must to have configuration.&lt;/p>
&lt;p>By default, you can use VS code formatters with the shortcut &lt;code>Alt+Shift+F&lt;/code> but, you can also configure it to format every time you save your file, like this:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_BGAaZ9S8L34Ju1fHOxV56Q.gif"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="how-to-enable-autoformat-on-visual-studiocode">How to enable autoformat on Visual Studio Code
&lt;/h3>&lt;p>There are two options to enable autoformat by UI and editing settings.json file, let’s check both:&lt;/p>
&lt;h4 id="how-to-edit-autoformat-option-on-vs-code-user-interface">How to edit autoformat option on VS Code User Interface
&lt;/h4>&lt;p>Open the menu &lt;code>File-&amp;gt;Preferences-&amp;gt;Settings&lt;/code> and under Text Editor look for &lt;code>Formating&lt;/code> and enable the option &lt;code>Format On Save&lt;/code> choosing which option is better on &lt;code>Format On Save Mode&lt;/code> .&lt;/p>
&lt;p>If you’re using version control, you can choose to format changes only, this is particularly useful if you’re working on legacy code and don’t want to change a large file at once. For this option choose &lt;code>modificationsIfAvailable&lt;/code> .&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_wet4EZdGEKs4L2FqZathyg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="how-to-edit-autoformat-option-on-vs-code-settingsjson">How to edit autoformat option on VS Code settings.json
&lt;/h4>&lt;p>To find settings.json file, open your Visual Studio Code and press F1:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_6e0UH_No8bBsxSamdTcy2A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now type &lt;code>settings.json &lt;/code>, open the file and add the section:&lt;/p>
&lt;p>For the configuration&lt;code>Format On Save Mode&lt;/code> you can pick of the of the options below:&lt;/p>
&lt;ul>
&lt;li>file&lt;/li>
&lt;li>modifications&lt;/li>
&lt;li>modificationsIfAvailable&lt;/li>
&lt;/ul>
&lt;p>This is how your file should look like:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_NFY7b7pWnYaRY68q3Tsheg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>This configuration applies to most part of the supported languages, like PowerShell, JSON, C#, and others.&lt;/p>
&lt;h3 id="how-to-autoformat-terraform-files-on-visual-studiocode">How to autoformat Terraform files on Visual Studio Code
&lt;/h3>&lt;p>Although the configuration above works for most languages if you are using terraform you need additional configurations. The plugin also doesn’t have a UI for it, so we need to add the configuration manually in the file settings.json.&lt;/p>
&lt;p>To do it, open again the &lt;code>settings.json&lt;/code> file and add the following sections:&lt;/p>
&lt;p>Pay attention that you must add one section for Terraform, and one more for terraform-vars.&lt;/p>
&lt;p>This is the final file:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_61hu0VbbIpGNiVOXYJz29w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Autoformatting is an easy and helpful option that will for sure help your team to have consistency and keep your codebase tidy and clean.&lt;/p>
&lt;p>See you in the next post!
[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>First steps with Azure: Creating an Azure Resource Group with Azure CLI</title><link>http://www.wesleycamargo.com/p/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/</link><pubDate>Mon, 07 Mar 2022 18:25:56 +0100</pubDate><guid>http://www.wesleycamargo.com/p/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_EERoSBDh5ydWiIxF4MQ_mw.jpeg" alt="Featured image of post First steps with Azure: Creating an Azure Resource Group with Azure CLI" />&lt;h3 id="first-steps-with-azure-creating-an-azure-resource-group-with-azurecli">First steps with Azure: Creating an Azure Resource Group with Azure CLI
&lt;/h3>&lt;p>An Azure Resource Group is a container that holds related resources for an Azure solution. This is an important resource in Azure and in this post, I will continue the series of Basic commands for Azure CLI and show how it is possible to create Azure Resource Groups using Azure CLI.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_EERoSBDh5ydWiIxF4MQ_mw.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@photosimon?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Simon Infanger&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/baby-steps-sand?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="what-is-azcli">What is Az CLI?
&lt;/h3>&lt;p>Az CLI or Azure CLI is a command line interface with Azure. It can be used in any command line prompt, including PowerShell and Bash, and it allows the creation of resources and resource groups, executing actions, and much more possibilities. In the previous post, I showed the basic commands to connect and configure your Azure Subscription using Azure CLI, if you don’t know how to configure your Azure CLI local environment you can &lt;a class="link" href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" target="_blank" rel="noopener"
>check it here&lt;/a>.&lt;/p>
&lt;h3 id="what-is-an-azure-resourcegroup">What is an Azure Resource Group
&lt;/h3>&lt;p>According to Microsoft documentation, this is the definition of an Azure Resource Group:&lt;/p>
&lt;blockquote>
&lt;p>A resource group is a container that holds related resources for an Azure solution. The resource group can include all the resources for the solution, or only those resources that you want to manage as a group. You decide how you want to allocate resources to resource groups based on what makes the most sense for your organization. Generally, add resources that share the same lifecycle to the same resource group so you can easily deploy, update, and delete them as a group.&lt;/p>
&lt;/blockquote>
&lt;p>In practice, we can consider it as a “Directory” on Azure where you can group your resources. There are many ways to organize it, the most common is to make them small with resources of the same context.&lt;/p>
&lt;p>For more information, you can check the official documentation &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#what-is-a-resource-group" target="_blank" rel="noopener"
>here&lt;/a>.&lt;/p>
&lt;h3 id="az-cli-commands-for-azure-resourcegroup">Az CLI commands for Azure Resource Group
&lt;/h3>&lt;h4 id="azure-resource-group---summary-ofcommands">Azure Resource Group - Summary of commands
&lt;/h4>&lt;p>Below there is a summary of all commands used in this tutorial. You can copy it and replace the values between &amp;lt;&amp;gt; to your own values :)&lt;/p>
&lt;h4 id="how-to-use-az-clihelp">How to use Az CLI Help?
&lt;/h4>&lt;p>It is also possible to check all commands related to resource groups with the command &lt;code>az --help&lt;/code> . For more details about how to use the help check&lt;a class="link" href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" target="_blank" rel="noopener"
> this post&lt;/a> where I also show how to login into Azure Subscription with Azure CLI.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_qzsCZn6P4B_IGE7aNc54Xw.png"
loading="lazy"
alt="Image"
>
az group help — Image by author&lt;/p>
&lt;h3 id="how-to-list-existing-azure-resource-groups-with-azcli">How to list existing Azure Resource Groups with Az CLI
&lt;/h3>&lt;p>The command used to list Azure Resource Groups is &lt;code>az group list&lt;/code> . It will return a JSON by default. To have a more human understandable output you can add &lt;code>--output table&lt;/code>in front of the command or any other output of your choice. The final command would be&lt;code>az group list --output table&lt;/code> .&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_Jg2D1lp2XIK4jOkssyQKqA.png"
loading="lazy"
alt="Image"
>
az group list — Image by author&lt;/p>
&lt;h3 id="how-to-create-an-azure-resource-group-with-azcli">How to create an Azure Resource Group with Az CLI
&lt;/h3>&lt;p>To create a new Azure Resource Group, it is necessary to provide two required information:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Location&lt;/strong>: The Azure Region where your resource group will be created.&lt;/li>
&lt;li>**Name: **The name of your Resource Group&lt;/li>
&lt;/ul>
&lt;p>The final command is &lt;code>az group create --location &amp;lt;location of your resource group&amp;gt; --name &amp;lt;name of your resource group&amp;gt;&lt;/code> . Replace the content between &amp;lt;&amp;gt; with your own values .&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_Jyy_7GHOHiTDpqud7hGruw.png"
loading="lazy"
alt="Image"
>
az group create — Image by author&lt;/p>
&lt;p>To check additional options use the command &lt;code>az group --help&lt;/code> .&lt;/p>
&lt;p>After creation, run again the command &lt;code>az group list --output table&lt;/code>to check if the resource group is shown.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_u805NgHvFi7QjF5qTGfICw.png"
loading="lazy"
alt="Image"
>
az group list — Image by author&lt;/p>
&lt;h3 id="how-to-show-details-of-an-azure-resource-group-with-azcli">How to show details of an Azure Resource Group with Az CLI
&lt;/h3>&lt;p>To check the details of a specific Resource Group, you can run the command &lt;code>az group show --name &amp;lt;your resource group name&amp;gt;&lt;/code> . This command returns basically the same information after the creation command.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_p_zyDT4xi590b0oXXbIewQ.png"
loading="lazy"
alt="Image"
>
az group show — Image by author&lt;/p>
&lt;h3 id="how-to-delete-an-azure-resource-group-with-azcli">How to delete an Azure Resource Group with Az CLI
&lt;/h3>&lt;p>The delete command will prompt if you are sure about executing the delete operation. This is because all resources created under this resource group will also be deleted, so run this command only when you want to delete them as well.&lt;/p>
&lt;p>After the conclusion of the command, after running the list command the created resource group is not listed anymore.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_sXlJmtY762m-Y74U2dVfHw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>The Resource Groups are an important part of Azure and automating its creation is a fundamental part of a DevOps process.&lt;/p>
&lt;p>See you in the next post!
[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>The entry gate to Azure: Configuring your Azure subscription with Azure CLI</title><link>http://www.wesleycamargo.com/p/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/</link><pubDate>Fri, 25 Feb 2022 16:51:35 +0100</pubDate><guid>http://www.wesleycamargo.com/p/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/1_WUN0NX9YOBytDa6iXLB5BQ.jpeg" alt="Featured image of post The entry gate to Azure: Configuring your Azure subscription with Azure CLI" />&lt;h3 id="the-entry-gate-to-azure-configuring-your-azure-subscription-with-azurecli">The entry gate to Azure: Configuring your Azure subscription with Azure CLI
&lt;/h3>&lt;p>Azure CLI is a command line interface with Azure. It can be used in any command line prompt, including PowerShell and Bash, and it allows the creation of resources and resource groups, executing actions like an Azure Data Factory pipeline, and much more possibilities. In this post, I will show the basic commands to connect and configure your Azure Subscription.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/1_WUN0NX9YOBytDa6iXLB5BQ.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@craft_ear?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Jan Tinneberg&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/door-open?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="how-to-set-an-azure-subscription-with-azurecli">How to set an Azure Subscription with Azure CLI
&lt;/h3>&lt;h4 id="azure-cli-commands-for-login-andaccount">Azure CLI commands for Login and Account
&lt;/h4>&lt;p>Below is a summary of all commands used&lt;/p>
&lt;p>Now let’s see the details of execution for each command.&lt;/p>
&lt;h4 id="how-to-know-which-commands-to-use-in-azurecli">How to know which commands to use in Azure CLI
&lt;/h4>&lt;p>At least in the beginning until you get familiar with the commands a very useful tip is to make use of the help command. It’s quite simple and you just need to add &lt;code>--help&lt;/code> or &lt;code>-h&lt;/code> after the command. The most basic would be to run it after &lt;code>az&lt;/code> like &lt;code>az --help&lt;/code> . It will show all subgroups and commands available for the tool.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/0_Ghwg5Wn9fm0PpMfY.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="how-to-login-into-azure-with-azurecli">How to login into Azure with Azure CLI
&lt;/h4>&lt;p>The easiest way to login into Azure is using the interactive mode. It will open a new tab on your browser with the authentication page.&lt;/p>
&lt;p>To do it run the command &lt;code>az login&lt;/code> and choose your account:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/1_cFaJ-sa-gDYIgWNEKGGXOA.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>By default, after choosing your account it will prompt a list of available subscriptions on that account. These subscriptions can also be listed with the command az account list, described below.&lt;/p>
&lt;h4 id="how-to-set-a-subscription-with-azurecli">How to set a subscription with Azure CLI
&lt;/h4>&lt;p>First, we need to see which subscriptions are available. To do it run the command &lt;code>az account list&lt;/code> , this command will display all subscriptions available in your logged accounts.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/1_u7pxouSyHjtGeWysTrJMWQ.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>Once you have your subscriptions id, you can connect to it through the command &lt;code>az account set --subscription&lt;/code> . After this command, you can confirm if the subscription was settled by running the command &lt;code>az account show&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/0_GxY7TQADhWhLRz4y.png"
loading="lazy"
alt="Image"
>
Ìmage by author&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Although the commands are simple, they are very important, as they are an entry gate to interact with Azure.
[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/the-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>Criando Azure Resource Group com Azure CLI</title><link>http://www.wesleycamargo.com/p/criando-azure-resource-group-com-azure-cli/</link><pubDate>Thu, 24 Feb 2022 18:26:54 +0100</pubDate><guid>http://www.wesleycamargo.com/p/criando-azure-resource-group-com-azure-cli/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_cilM3e42GLTP7Tod8bXeQg.jpeg" alt="Featured image of post Criando Azure Resource Group com Azure CLI" />&lt;h3 id="criando-azure-resource-group-com-azurecli">Criando Azure Resource Group com Azure CLI
&lt;/h3>&lt;p>O Azure CLI é uma interface de linha de comando para o Azure. Ele pode ser usado com PowerShell ou em bash, com ele é possível criar recursos, resource groups, executar ações no Azure entre outras coisas. Aqui vou mostrar os comandos básicos para conectar ao Azure utilizando o Azure CLI e como criar um resource group.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_cilM3e42GLTP7Tod8bXeQg.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@fakurian?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Milad Fakurian&lt;/a> on &lt;a class="link" href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>No vídeo abaixo é possível acompanhar todo o processe de conexão ao Azure e criação do Resource Group usando Azure CLI. Após o vídeo estão os comandos utilizados e um breve resumo sobre seu uso.&lt;/p>
&lt;h3 id="como-conectar-ao-azure-com-azurecli">Como conectar ao Azure com Azure CLI
&lt;/h3>&lt;h4 id="azure-cli---comandos-paraaccount">Azure CLI - comandos para Account
&lt;/h4>&lt;p>Abaixo estão todos os comandos utilizados para realizar login e configurar a Azure Subscription para ser utilizada&lt;/p>
&lt;p>Agora vamos ver os detalhes de execuçao dos comandos:&lt;/p>
&lt;p>&lt;code>az -h&lt;/code> — Lista os comandos disponíveis no Azure CLI&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_xtFjXLBbgrQw6IOTLT5HZA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>az login&lt;/code>- Abre a página de login no browser para selecionar a conta que será conectada&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_cFaJ-sa-gDYIgWNEKGGXOA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>az account list&lt;/code> - Lista as subscription disponíveis
&lt;code>az account set -subscription&lt;/code> - Seleciona a subscription que será usada
&lt;code>az account show&lt;/code> - Exibe as informações da subscription atual&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_UXnIG5vzHh8dZ51X44rqtw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="como-criar-um-azure-resource-group-com-azurecli">Como criar um Azure Resource Group com Azure CLI
&lt;/h3>&lt;h4 id="azure-clicomandos-para-resourcegroup">Azure CLI — comandos para Resource Group
&lt;/h4>&lt;p>&lt;code>az group -h&lt;/code> - Lista os comandos disponíveis para Resource Groups
&lt;code>az group create -h&lt;/code> - Lista os argumentos necessários para criar um Resource Group&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_q9u4264fwYxWQQ2l2ieLEA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>az group create --location -–name&lt;/code> - Cria um Resource Group&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_ZKz9LJWr6lrBvZFPGKMJjA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>az group list --output table&lt;/code> - Lista Resource Groups da subscription em formato de tabela&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-azure-resource-group-com-azure-cli/1_ru6Eh_JTfYgz9ooYcZqZ6w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;code>az group delete --name&lt;/code>- Apaga o Resource Group&lt;/p></description></item><item><title>Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines</title><link>http://www.wesleycamargo.com/p/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/</link><pubDate>Thu, 03 Feb 2022 00:02:46 +0100</pubDate><guid>http://www.wesleycamargo.com/p/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_fsn7lNWadvhhO4YLZ_YTxQ.jpeg" alt="Featured image of post Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines" />&lt;h3 id="creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines">Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines
&lt;/h3>&lt;p>PowerShell Modules are very useful and can save a lot of time if well designed and created. Check on this post how to create and pack a basic PowerShell Module, and publish it into Azure Artifact using Azure DevOps YAML Pipelines.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_fsn7lNWadvhhO4YLZ_YTxQ.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@trnavskauni?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Trnava University&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/artifact?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="creating-powershell-module-and-powershell-modulemanifest">Creating PowerShell Module and PowerShell Module Manifest
&lt;/h3>&lt;h4 id="creating-a-powershell-module--psm1">Creating a PowerShell Module - psm1
&lt;/h4>&lt;p>A PowerShell Module is a way to organize and pack a set of PowerShell components to be reused or shared. The most common components to be shared are functions.&lt;/p>
&lt;p>In this example, we will create the module &lt;code>Example.Module&lt;/code> with the extension &lt;code>psm1&lt;/code> , and include a PowerShell function.&lt;/p>
&lt;h4 id="creating-a-powershell-module-manifest--psd1">Creating a PowerShell Module Manifest - psd1
&lt;/h4>&lt;p>To create the Module Manifest, it is possible to run the cmdlet &lt;code>New-ModuleManifest&lt;/code> . It will generate the &lt;code>psd1&lt;/code> manifest file with default configurations.&lt;/p>
&lt;p>The most important variables are &lt;code>NestedModules&lt;/code> and &lt;code>RootModule&lt;/code> which must contain the name of the psm1 file.&lt;/p>
&lt;h4 id="creating-a-nuspec-file-for-the-powershell-module">Creating a nuspec file for the PowerShell Module
&lt;/h4>&lt;p>To create the nuspec file you need to run the command &lt;code>nuget spec Example.Module&lt;/code> . It will generate a base file that it is possible to replace with your values.&lt;/p>
&lt;h4 id="making-the-powershell-module-versiondynamic">Making the PowerShell Module version dynamic
&lt;/h4>&lt;p>In both &lt;code>psm1&lt;/code>(1) and &lt;code>nuspec&lt;/code> (2) files there is a variable &lt;code>$(version)&lt;/code> . This variable will be replaced by the version defined in the deployment pipeline. It uses the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&amp;amp;tabs=yaml%2Cbatch#understand-variable-syntax" target="_blank" rel="noopener"
>Azure DevOps macro syntax&lt;/a> to consume the variables.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_hC2Fp7Sq3dAcnFCrOSfRSA.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_TOn6t_70pay-LOgPYJVjAg.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h3 id="creating-an-azure-artifacts-feed">Creating an Azure Artifacts Feed
&lt;/h3>&lt;p>For instructions on how to create a feed, you can check this post where I also show how to push a dotnet Core package to Azure Artifacts:&lt;/p>
&lt;p>&lt;a class="link" href="https://camargo-wes.medium.com/how-to-send-net-core-nuget-packages-to-azure-artifacts-238fa08db6b5" target="_blank" rel="noopener"
>How to send .Net Core NuGet packages to Azure Artifacts | by Wesley Camargo | Medium&lt;/a>&lt;/p>
&lt;h3 id="deploying-powershell-module-with-azure-devops-yaml-pipeline-into-azureartifact">Deploying PowerShell Module with Azure DevOps YAML Pipeline into Azure Artifact
&lt;/h3>&lt;h4 id="version-number-to-update-powershell-module">Version Number to update PowerShell Module
&lt;/h4>&lt;p>To simplify this example, we will provide the version number of the module by Azure DevOps parameter(1). Then we populate a variable with the value of the parameter using template expression syntax(2). In a future post, I will how to bump this number automatically.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_ntWVJnMc2jpUqLegnE_fkw.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="replacing-version-number-in-nuspec-and-modulemanifest">Replacing version number in nuspec and module manifest
&lt;/h4>&lt;p>The next step is to replace the variable &lt;code>$(version)&lt;/code> mentioned above with the version number. To do it will be used the &lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens" target="_blank" rel="noopener"
>replace token task&lt;/a>. Note that we specify the extensions of the manifest and nuspec files.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_xMkiWFVlx2G_UJ_M6-pinQ.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="packing-powershell-module-withnuget">Packing PowerShell Module with NuGet
&lt;/h4>&lt;p>To pack the module is used the NuGetCommand task, and specified the nuspec file. After generating the NuGet package it will be published as a pipeline artifact - be careful not to confuse with Azure Artifacts, we are almost there but not yet :) - which will be consumed in the next stage: deployment.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_RNGcd5bStLWiDOzCSIUTpA.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="pushing-powershell-module-to-azure-artifacts">Pushing PowerShell Module to Azure Artifacts
&lt;/h4>&lt;p>Finally, in the deployment stage, we will push our package into our Azure Artifacts. It will also use the NuGet Command task to push it, sending the &lt;code>nupkg&lt;/code> generate in the build stage. It is also necessary to provide the name of the Azure Artifacts Feed.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_8L4ufhKDW1GtuEU_gsEPyQ.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="complete-azure-pipelinesyml-to-publish-powershell-modules-to-azure-artifacts">Complete azure-pipelines.yml to publish PowerShell Modules to Azure Artifacts
&lt;/h4>&lt;p>[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>Delivery as Code with Azure DevOps Release Engine</title><link>http://www.wesleycamargo.com/p/delivery-as-code-with-azure-devops-release-engine/</link><pubDate>Fri, 28 Jan 2022 19:05:03 +0100</pubDate><guid>http://www.wesleycamargo.com/p/delivery-as-code-with-azure-devops-release-engine/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1__BNFAVB90d4cdBvFgz7loA.jpeg" alt="Featured image of post Delivery as Code with Azure DevOps Release Engine" />&lt;h3 id="delivery-as-code-with-azure-devops-releaseengine">Delivery as Code with Azure DevOps Release Engine
&lt;/h3>&lt;p>Delivery as Code is the concept of having all necessary configurations of your delivery defined in a file, which can be kept under source control and have all good practices applied to application development over it. It ensures that your deliveries are consistent and reliable.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1__BNFAVB90d4cdBvFgz7loA.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@actionjackson801?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Jackson Hendry&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/night-sky?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="everything-ascode">Everything as Code
&lt;/h3>&lt;p>In the past years, everything is becoming “as Code”. It started with Infrastructure as Code, aka IaC, and today there are many languages supporting it, since the AWS Cloud Formation, passing through Terraform and Pulumi, that are Cloud agnostics, until the Azure ARM Templates and his newborn son Azure Bicep.&lt;/p>
&lt;p>But there are also other uses of as Code, such as Database as Code, Pipelines as Code, Monitoring as Code, Security as Code, and so forth, this list is big and still growing.&lt;/p>
&lt;h4 id="why-have-my-definitions-ascode">Why have my definitions as code?
&lt;/h4>&lt;p>One of the reasons behind this is if you have the instructions to create your environment versioned, you can easily reproduce the steps to create it. Imagine that for some reason you lose your infrastructure environment, in some minutes you can spin up a new environment based on the versioned definitions.&lt;/p>
&lt;p>Another reason is that as you can easily create a new environment, you can apply development good practices on it. For example, you can deploy a new environment using the versioned scripts, and run Unit Tests against it. With frameworks like Pester this is easy to implement.&lt;/p>
&lt;h3 id="what-is-delivery-ascode">What is Delivery as Code?
&lt;/h3>&lt;p>The advantages of having definitions under source control are clear, so why do not apply them in the Delivery of the software?&lt;/p>
&lt;p>With that in mind and my passion to automate everything that I can, I started to develop an easy way to configure the releases and make them as simple as possible, based on my experience working in the DevOps field.&lt;/p>
&lt;p>To configure a new delivery, instead of configuring manually or having scripts of how to implement it, you just need to inform what you need and all the complexity of the implementation will be abstracted. This is the declarative approach very keen on Infrastructure as Code, which allows you have indepotent deployments.&lt;/p>
&lt;h3 id="what-is-azure-devops-releaseengine">What is Azure DevOps Release Engine
&lt;/h3>&lt;p>Azure DevOps Release Engine is an approach developed to support Delivery as Code. It was built on top of Azure DevOps YAML Templates and can be used to deploy any kind of technology, with any kind of tool anywhere.&lt;/p>
&lt;p>It means that you can deploy languages such as:&lt;/p>
&lt;ul>
&lt;li>dotnet Core&lt;/li>
&lt;li>nodeJS&lt;/li>
&lt;li>Java&lt;/li>
&lt;/ul>
&lt;p>Using any tool like:&lt;/p>
&lt;ul>
&lt;li>Azure Bicep&lt;/li>
&lt;li>Terraform&lt;/li>
&lt;li>Cloud Formation&lt;/li>
&lt;li>Pulumi&lt;/li>
&lt;/ul>
&lt;p>In any platform:&lt;/p>
&lt;ul>
&lt;li>Azure&lt;/li>
&lt;li>AWS&lt;/li>
&lt;li>VMWare&lt;/li>
&lt;li>OnPremisses data centers&lt;/li>
&lt;/ul>
&lt;h3 id="how-does-azure-devops-release-enginework">How does Azure DevOps Release Engine work?
&lt;/h3>&lt;p>Azure DevOps Release Engine was created using Azure DevOps YAML Pipelines as a support tool. It consists of a centralized repository where they centralize deployment definitions - the instructions of how to deploy - are versioned and Client/Application repositories which must have the declaration of what should be deployed.&lt;/p>
&lt;p>The client application repository must have a YAML pipeline that extends from the main YAML in the centralized repository - &lt;a class="link" href="https://towardsdev.com/how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872" target="_blank" rel="noopener"
>here there is a post explaining how the extended pipelines work&lt;/a>. The main file is responsible to parse the instructions provided and deciding which definition must be used.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_TdY4HlqI1O_KNVr0Rljknw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="centralized-release-definitions">Centralized Release definitions
&lt;/h4>&lt;p>The definitions in this repository can be reused, saving time and allowing all deployments of the same kind of component to be deployed in the same way, which leads to more consistent and less problematic releases, as the deployment instructions were well tested.&lt;/p>
&lt;h4 id="clientapplication-repositories">Client/Application repositories
&lt;/h4>&lt;p>The client repositories are the repos where your applications are versioned. It can have any sort of resource to be deployed and to consume the Release Engine you just need to create a YAML file following the Azure DevOps Release Engine schema.&lt;/p>
&lt;h3 id="how-to-set-up-azure-devops-releaseengine">How to set up Azure DevOps Release Engine?
&lt;/h3>&lt;h4 id="importing-the-repo-into-azuredevops">Importing the repo into Azure DevOps
&lt;/h4>&lt;p>In the Azure DevOps Release Engine repository at GitHub copy the link to the repository following the sequence below:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_uPtLLtDIIbY3RKAgTjMX7A.png"
loading="lazy"
alt="Image"
>
Copy the repository URL — Image by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_aqO2RG6w41ox4JDYWe8twg.png"
loading="lazy"
alt="Image"
>
Click in Import repository — Image by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_wvfx90_WRO7LRsbyJ_v-Dw.png"
loading="lazy"
alt="Image"
>
Paste the link and import — Image by author&lt;/p>
&lt;p>After it you should have the repository in your Azure DevOps repos, with the structure below:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_-E9yirfM67UbeJjnPi8rVg.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h3 id="how-to-set-up-the-application-to-consume-the-azure-devops-releaseengine">How to set up the application to consume the Azure DevOps Release engine?
&lt;/h3>&lt;h4 id="repository-structure">Repository structure
&lt;/h4>&lt;p>In a dotnet Core application repository add the file azure-pipelines.yml in the root folder, and one file corresponding to each environment that will be deployed in a “variables” directory. I recommend having the source code under a different directory to keep the repository cleaner and tidy, in my case it’s under the &lt;code>src&lt;/code>directory.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_wZ_WvkWKvUAYkNZIJD1R9Q.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;h4 id="creating-the-azure-pipelinesyml-file">Creating the azure-pipelines.yml file
&lt;/h4>&lt;p>This file contains all instructions on what resources need to be deployed. I will add the complete file in the end so it will be possible to just copy it ;).&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_4ozkyI8QtFth7UpEaAZQGw.png"
loading="lazy"
alt="Image"
>
“Importing” a repository in Azure DevOps — Image by author&lt;/p>
&lt;p>The beginning of the file contains pipeline configurations that will be the same in most of the pipelines. The declaration of Release Engine as a repository resource is very important, as the templates will be consumed from this resource that will be “imported”.&lt;/p>
&lt;h4 id="azure-devops-release-enginesettings">Azure DevOps Release Engine settings
&lt;/h4>&lt;p>With Release Engine imported, it is necessary now to extend from the main.yml file &lt;strong>(1)&lt;/strong>. This file is basically a parser that will read the information provided as parameters and redirect to the correct file. I will deep dive into this file in future posts.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_G470hXFe5jMfVuOFv_Stkw.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>The most important section is the &lt;strong>parameters&lt;/strong>. This section contains all information that will be provided to the engine. As mentioned above this information will be parsed by the main file, and according to the resource types provided. call the right definition to deploy it.&lt;/p>
&lt;p>**Release settings
**Inside parameters, the session **settings (2) **contain the configuration of your release.&lt;/p>
&lt;p>**Azure settings
**In the current version, it is possible to enable or disable the deployment of your infrastructure, application, and build &lt;strong>(3)&lt;/strong>. Here it is also necessary to provide the directory of your variable files. The variables will be explained later. It is possible to provide the values straight on this file,&lt;/p>
&lt;p>**Environments
**It is also necessary to provide information about your Azure environment &lt;strong>(4)&lt;/strong>, such as service connection, resource group where the resources will be deployed, and so on. If the parameter **new **under resource group is provided, it will also create the resource group.&lt;/p>
&lt;p>Last but not least, you must declare which environments will be deployed. The way that it was built will create exactly the same configuration for all environments, which ensures that the implementation in your production environment will follow the same steps as in the others, increasing the &lt;strong>reliability of the delivery&lt;/strong>, as was mentioned at the beginning of this post.&lt;/p>
&lt;h4 id="configuring-resources-to-be-deployed-with-azure-devops-releaseengine">Configuring resources to be deployed with Azure DevOps Release Engine
&lt;/h4>&lt;p>The latest section in the azure-pipelines.yml is the resource. This is a list of resources that will be deployed in this release and its configurations. In this example, we are going to deploy a dotnet Core application into an Azure Web App. Let’s go through the main items in this section:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_WWvMG336nyZ1iMQj4kWsPQ.png"
loading="lazy"
alt="Image"
>
Image by author&lt;/p>
&lt;p>**name **- This is the name of the web app that will be created into Azure. This is provided through a parameter that is stored in the respective variable file of the environment that is running. It means that you can deploy in different environments like dev, uat and prd with unique names, avoiding conflicts.&lt;/p>
&lt;p>**type **- The type is parsed inside the main.yml file and calls the right deployment definition for the type provided. This example is a dotnet Core application but it is possible to deploy any resource with the deployment definition already implemented on Release Engine.&lt;/p>
&lt;p>&lt;strong>runName&lt;/strong> - Run name is the name of the Azure DevOps job. This is necessary to make the run unique and have the possibility to link dependent resources.&lt;/p>
&lt;p>&lt;strong>enabled&lt;/strong> - It is possible to easily disable the deployment of this resource.&lt;/p>
&lt;p>&lt;strong>deploy.type&lt;/strong> - Inform which type of deployment it is. In this example, the dotnet Core application will be deployed into an Azure Web App.&lt;/p>
&lt;p>&lt;strong>deploy.infrastructure.servicePlanName&lt;/strong> - Similar to the name, we are informing the name of the service plan that will be used by our Azure Web App.&lt;/p>
&lt;h4 id="configuring-variables-for-azure-devops-releaseengine">Configuring variables for Azure DevOps Release Engine
&lt;/h4>&lt;p>As mentioned before, it is necessary one variable file per environment. The variable file allows having resources with unique names in the environments.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_aQ7Pc0GTl1tcQViMPWR7Xw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>This file will be loaded automatically by the engine, so the only action necessary is to add the file following the patter {env-name}-vars.yml, where env-name is the name defined at azure-pipelines.yml&lt;/p>
&lt;p>After being loaded by the engine, the variables will be available like any other variable in Azure DevOps. In azure-pipelines the variables are accessed using the macro syntax $(variable-name).&lt;/p>
&lt;h4 id="complete-template">Complete template
&lt;/h4>&lt;p>Below there is the complete template for dotnet Core and Azure Web Apps. You can also check the repository with more examples and the implementation of the engine on &lt;a class="link" href="https://github.com/devopsnights/AzureDevOpsReleaseEngine" target="_blank" rel="noopener"
>Azure DevOps Release Engine repository at GitHub&lt;/a>.&lt;/p>
&lt;h3 id="takeaways">Takeaways
&lt;/h3>&lt;p>The Azure DevOps Release Engine simplifies the release configuration, abstracting the release definition providing an “as Code” approach for your Delivery.&lt;/p>
&lt;p>This is a work in progress but built on top of a very mature process based on real-life experience, solving real-life problems that we face in our day-by-day activities.&lt;/p>
&lt;p>I hope it can help, and see you in future posts!
[&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/delivery-as-code-with-azure-devops-release-engine/1_BCiLLad3dvZLwBa-B5cAVQ.png"
loading="lazy"
alt="Image"
>
](&lt;a class="link" href="https://faun.to/bP1m5" target="_blank" rel="noopener"
>https://faun.to/bP1m5&lt;/a>)&lt;/p>
&lt;p>Join FAUN: &lt;a class="link" href="https://faun.to/i9Pt9" target="_blank" rel="noopener"
>&lt;strong>Website&lt;/strong>&lt;/a>** &lt;strong>💻&lt;/strong>|&lt;strong>&lt;a class="link" href="https://faun.dev/podcast" target="_blank" rel="noopener"
>&lt;strong>Podcast&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🎙️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://twitter.com/joinfaun" target="_blank" rel="noopener"
>&lt;strong>Twitter&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🐦&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.facebook.com/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>Facebook&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>👥&lt;/strong>|&lt;strong>&lt;a class="link" href="https://instagram.com/fauncommunity/" target="_blank" rel="noopener"
>&lt;strong>Instagram&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>📷|&lt;a class="link" href="https://www.facebook.com/groups/364904580892967/" target="_blank" rel="noopener"
>&lt;strong>Facebook Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>🗣️&lt;/strong>|&lt;strong>&lt;a class="link" href="https://www.linkedin.com/company/faundev" target="_blank" rel="noopener"
>&lt;strong>Linkedin Group&lt;/strong>&lt;/a>&lt;/strong> &lt;strong>💬&lt;/strong>|** &lt;a class="link" href="https://faun.dev/chat" target="_blank" rel="noopener"
>&lt;strong>Slack&lt;/strong>&lt;/a> 📱&lt;strong>|&lt;/strong>&lt;a class="link" href="https://thechief.io" target="_blank" rel="noopener"
>&lt;strong>Cloud Native&lt;/strong> &lt;strong>News&lt;/strong>&lt;/a>** &lt;strong>📰&lt;/strong>|&lt;strong>&lt;a class="link" href="https://linktr.ee/faun.dev/" target="_blank" rel="noopener"
>&lt;strong>More&lt;/strong>&lt;/a>&lt;/strong>.**&lt;/p>
&lt;p>&lt;strong>If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p></description></item><item><title>How to extend an Azure DevOps YAML Pipeline Template</title><link>http://www.wesleycamargo.com/p/how-to-extend-an-azure-devops-yaml-pipeline-template/</link><pubDate>Thu, 30 Dec 2021 17:28:36 +0100</pubDate><guid>http://www.wesleycamargo.com/p/how-to-extend-an-azure-devops-yaml-pipeline-template/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-extend-an-azure-devops-yaml-pipeline-template/1_8JQMH109KuJHKrUubmjxqA.jpeg" alt="Featured image of post How to extend an Azure DevOps YAML Pipeline Template" />&lt;h3 id="how-to-extend-an-azure-devops-yaml-pipelinetemplate">How to extend an Azure DevOps YAML Pipeline Template
&lt;/h3>&lt;p>If you need to control what is allowed during your deployment, extending the YAML Templates is the easiest way to know what is being done on your deployments.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-extend-an-azure-devops-yaml-pipeline-template/1_8JQMH109KuJHKrUubmjxqA.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@zonduurzaam?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Zonduurzaam Deventer&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/power-strip?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="azure-devops-yaml-templates">Azure DevOps YAML Templates
&lt;/h3>&lt;p>YAML Templates are the smartest way to create your pipelines. It allows you to break down the pipelines into small pieces reusing your logic, which leads to some best practices as &lt;em>Don&amp;rsquo;t Repeat Yourself &lt;em>and&lt;/em> Dependency Inversion.&lt;/em>&lt;/p>
&lt;p>It’s also possible to use the *Declarative *instead of the &lt;em>Imperative&lt;/em> approach, therefore who will consume your pipelines does not need to know the details of how to deploy an application, but just say what is necessary to deploy.&lt;/p>
&lt;p>With these principles being correctly applied, it is possible to build a reliable and robust way to deploy new applications, but who will consume it doesn’t need to be a DevOps expert.&lt;/p>
&lt;h3 id="creating-an-azure-devops-yaml-templates">Creating an Azure DevOps YAML Templates
&lt;/h3>&lt;h4 id="parameters-on-azure-devops-yaml-templates">Parameters on Azure DevOps YAML Templates
&lt;/h4>&lt;p>On top of the template, the first section is &lt;code>parameters&lt;/code> . As our goal is to make the templates reusable, makes complete sense to have a way to change values according to which application is consuming the template. To keep it simple in this example, it was parametrized the application name.&lt;/p>
&lt;p>`ash
parameters:&lt;/p>
&lt;ul>
&lt;li>name: applicationName
type: string
`&lt;/li>
&lt;/ul>
&lt;h4 id="stages-on-azure-devops-yaml-templates">Stages on Azure DevOps YAML Templates
&lt;/h4>&lt;p>To have an extendible template, it must be created on the level of the stages. This example has two of them, one for build and one more for development environment. 
Below you can check the full template script:&lt;/p>
&lt;h3 id="extending-azure-devops-yaml-templates">Extending Azure DevOps YAML Templates
&lt;/h3>&lt;h4 id="configuring-triggers-on-azure-devops-yaml-templates">Configuring triggers on Azure DevOps YAML Templates
&lt;/h4>&lt;p>On top of the consumer file, in our case &lt;code>azure-pipelines.yml&lt;/code> , we need to declare the triggers of the pipeline. It is mandatory to include at least one value for branch(it can be * if needed), or &lt;code>none&lt;/code> . You can also set the path where your files are, and your pipeline will run only when those files change.&lt;/p>
&lt;p>&lt;code>ash trigger: branches: include: - main - develop paths: include: - src/* &lt;/code>&lt;/p>
&lt;h4 id="referencing-azure-devops-yaml-templates">Referencing Azure DevOps YAML Templates
&lt;/h4>&lt;p>To extend a template, you need to provide the relative path for your template file. In this example, there is a &lt;code>templates&lt;/code> directory with the file &lt;code>template.yml&lt;/code> so on the consumer file, it’s necessary to provide the template path in the format &lt;code>./templates/template.yml&lt;/code> &lt;code>.&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-extend-an-azure-devops-yaml-pipeline-template/1_PKHTHZN9K5hkDjgXRZ7mzQ.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>We also need to provide the parameter defined in our template. To this, you just need to add the parameters section right below the template, the name of the parameter, and of course, the value for it. Below there is the complete “consumer” file.&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>In this post, I introduced the basic concepts of how to extend Azure DevOps YAML Pipelines. This is easy to implement but can yield good fruits in future implementations.&lt;/p>
&lt;p>In future articles, I will deep dive into this subject and show the full potential of this approach :).&lt;/p></description></item><item><title>How to suppress warning and error messages in Azure CLI</title><link>http://www.wesleycamargo.com/p/how-to-suppress-warning-and-error-messages-in-azure-cli/</link><pubDate>Mon, 20 Dec 2021 09:02:01 +0100</pubDate><guid>http://www.wesleycamargo.com/p/how-to-suppress-warning-and-error-messages-in-azure-cli/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-suppress-warning-and-error-messages-in-azure-cli/0_CRHG3CI34LabcOV4.jpeg" alt="Featured image of post How to suppress warning and error messages in Azure CLI" />&lt;h3 id="how-to-suppress-warning-and-error-messages-in-azurecli">How to suppress warning and error messages in Azure CLI
&lt;/h3>&lt;h4 id="in-azure-cli-some-commands-can-return-errors-and-warning-messages-which-can-cause-troubles-on-your-script-so-check-out-how-to-suppressit">In Azure CLI some commands can return errors and warning messages, which can cause troubles on your script, so check out how to suppress it
&lt;/h4>&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-suppress-warning-and-error-messages-in-azure-cli/0_CRHG3CI34LabcOV4.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@ahsanjaya?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Muhammad Daudy&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/warning?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;h3 id="how-to-suppress-warnings-on-azurecli">How to suppress warnings on Azure CLI
&lt;/h3>&lt;h4 id="command-group-is-in-preview-and-under-development">Command group is in preview and under development
&lt;/h4>&lt;p>In some cases the CLI used can be under development and show the message: &lt;code>Command group is in preview and under development. Reference and support levels: [https://aka.ms/CLI_refstatus](https://aka.ms/CLI_refstatus)&lt;/code>&lt;/p>
&lt;p>At the moment that I am writing this post, the az devops CLI variable-group for example is always returning the message above, which have been causing troubles and breaking my pester tests :)&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-suppress-warning-and-error-messages-in-azure-cli/0_SHfQUJPYn9MuJ-i3.png"
loading="lazy"
alt="Image"
>
Photo prepared by author&lt;/p>
&lt;h4 id="quiet-mode-on-azurecli">Quiet mode on Azure CLI
&lt;/h4>&lt;p>For Azure CLI, the simplest way to make the commands “quiet” is by adding the global parameter &lt;code>--only-show-errors&lt;/code> in your command. **It will suppress only the warnings **and keep the message in case you have any errors during the execution.&lt;/p>
&lt;p>So in our example for &lt;code>az pipelines variable-group&lt;/code> our command will be like this:&lt;/p>
&lt;p>&lt;code>ash az pipelines variable-group list --org $organization -p $project --only-show-errors &lt;/code>&lt;/p>
&lt;h3 id="how-to-suppress-errors-on-azurecli">How to suppress errors on Azure CLI
&lt;/h3>&lt;p>In some cases, you may need to also suppress the errors during your script execution and there is one more option for it. I would recommend this approach only if you really do not care if something went wrong during your script execution.&lt;/p>
&lt;h3 id="redirecting-the-console-outputstderr">Redirecting the console output STDERR
&lt;/h3>&lt;p>A common scenario to redirect streams is when the symbol &lt;code>&amp;gt;&lt;/code> is used to write the output of the command in a file. It redirects the standard output - STDOUT - to the file added as a parameter.&lt;/p>
&lt;p>In the situation that is necessary to suppress the errors, we need to redirect the output of the error stream — STDERR.&lt;/p>
&lt;p>To do it you simply need to add &lt;code>2&amp;gt;nul&lt;/code> after the CLI command, which means that the second stream (STDERR) will be redirected to &lt;code>null&lt;/code> .&lt;/p>
&lt;p>So in our example for &lt;code>az pipelines variable-group&lt;/code> the command will be:&lt;/p>
&lt;p>&lt;code>ash az pipelines variable-group list --org $organization -p $project 2&amp;gt;nul &lt;/code>&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Although this topic looks simple, sometimes it’s not so easy to find this information in the documentation, especially regarding the error suppressing topic, and also the comparison of both approaches is not documented.&lt;/p>
&lt;p>I grouped both, how to suppress warnings and errors in one place, so would be to choose which option suits better in each scenario.&lt;/p>
&lt;h3 id="references">References
&lt;/h3>&lt;p>&lt;a class="link" href="https://docs.microsoft.com/en-us/troubleshoot/cpp/redirecting-error-command-prompt" target="_blank" rel="noopener"
>Redirecting error from Command Prompt — Visual C++ | Microsoft Docs&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/Azure/azure-cli/issues/13384" target="_blank" rel="noopener"
>https://github.com/Azure/azure-cli/issues/13384&lt;/a>&lt;/p></description></item><item><title>Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines</title><link>http://www.wesleycamargo.com/p/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/</link><pubDate>Fri, 20 Aug 2021 19:45:12 +0200</pubDate><guid>http://www.wesleycamargo.com/p/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/1_q45YY42etgKPognuoFZJmA.jpeg" alt="Featured image of post Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines" />&lt;h3 id="creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines">Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines
&lt;/h3>&lt;h4 id="continuing-the-dataops-automation-series-in-this-post-i-will-demonstrate-how-to-create-your-databricks-workspace-using-infrastructure-as-code-with-bicep-and-azure-devops-yaml-pipelines-to-deploy-it-in-azure-lets-check-itout">Continuing the DataOps Automation series, in this post I will demonstrate how to create your Databricks workspace using Infrastructure as Code with Bicep and Azure DevOps YAML Pipelines to deploy it in Azure. Let’s check it out!
&lt;/h4>&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/1_q45YY42etgKPognuoFZJmA.jpeg"
loading="lazy"
alt="Image"
>
Photo by &lt;a class="link" href="https://unsplash.com/@benjopen?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Benjamin Jopen&lt;/a> on &lt;a class="link" href="https://unsplash.com/s/photos/brick-construction?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" target="_blank" rel="noopener"
>Unsplash&lt;/a>&lt;/p>
&lt;p>In the previous articles, you can check how to&lt;a class="link" href="https://towardsdatascience.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" target="_blank" rel="noopener"
> create an Azure Data Factory with git integration using Bicep&lt;/a> and also the &lt;a class="link" href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" target="_blank" rel="noopener"
>easiest way to create a CI/CD pipeline for Azure Data Factory&lt;/a>&lt;/p>
&lt;p>At the end of the post, you can check a complete YAML pipeline read to be used!&lt;/p>
&lt;h3 id="what-is-a-bicep-template">What is a Bicep template?
&lt;/h3>&lt;p>If you are not familiar with Bicep, this is a DSL for the ARM Templates, that has a cleaner syntax, better support to modules, and other great features. It also has a nice &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/quickstart-create-bicep-use-visual-studio-code?tabs=CLI&amp;amp;WT.mc_id=devops-34401-jagord" target="_blank" rel="noopener"
>Visual Studio Code extension &lt;/a>that helps a lot in building templates from scratch.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/0_FsceF8fsND7cZ2BM.png"
loading="lazy"
alt="Image"
>
Nice extension for Visual Studio Code! — Image from &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" target="_blank" rel="noopener"
>Microsoft Docs&lt;/a>&lt;/p>
&lt;p>When you run a deployment using a bicep template, it transpile the file and generates a native ARM Template, similar to what happens between Typescript and Javascript.&lt;/p>
&lt;p>If you want to learn more about it, check the official documentation &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" target="_blank" rel="noopener"
>here&lt;/a>.&lt;/p>
&lt;h3 id="creating-the-infrastructure-as-code-for-azure-databricks">Creating the Infrastructure as Code for Azure Databricks
&lt;/h3>&lt;h4 id="creating-a-resource-group-with-azurecli">Creating a Resource Group with Azure CLI
&lt;/h4>&lt;p>To deploy our Databricks workspace we need to have a Resource Group created in your Azure Subscription. The easiest way to do that is through Azure CLI. To do that you need to log in with the command &lt;code>az login&lt;/code> and then run the following command:&lt;/p>
&lt;p>az group create -name RG-Databricks -location northeuropeReplace the parameters name and location for those that best suit your needs.&lt;/p>
&lt;h4 id="creating-bicep-templates-for-azure-databricks">Creating Bicep templates for Azure Databricks
&lt;/h4>&lt;p>The Bicep template for Azure Databricks it’s quite simple and has 4 main sections:&lt;/p>
&lt;p>&lt;strong>Parameters:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Workspace Name: If you do not provide a value, it uses a &lt;code>uniqueString&lt;/code> function, which ensures that it will always be the same, as this is based on the resource group id.&lt;/li>
&lt;li>Location: By default, this is using the resource group location&lt;/li>
&lt;li>SKU: The default value is trial, so be sure to replace it in your real-life scenario ;).&lt;/li>
&lt;/ul>
&lt;p>**Variables: **The template also has the variable &lt;code>managedResourceGroupName&lt;/code> . This resource group will be managed by Azure Databricks to create your clusters later on.&lt;/p>
&lt;p>**Resources: **Here we have only one resource that is the Databrics Workspace. This is consuming the API version &lt;code>2018–04–01&lt;/code> .&lt;/p>
&lt;p>**Output: **This section contains the variables that you need to expose. It means that they can be accessed by other processes later on in your deployment process.&lt;/p>
&lt;h3 id="deploying-bicep-with-azure-devops-yaml-pipelines">Deploying Bicep with Azure DevOps YAML Pipelines
&lt;/h3>&lt;h4 id="building-biceptemplate">Building Bicep Template
&lt;/h4>&lt;p>As I said before, it is possible to “build” the Bicep template transpiling it into an ARM Template. So to ensure that our template is valid, let’s do it!&lt;/p>
&lt;p>To build it, you will also use the Azure CLI. The command is also quite simple:&lt;/p>
&lt;p>az bicep build &amp;ndash;file &lt;your file> &amp;ndash;outdir &lt;your directory>To create an Azure DevOps YAML Pipeline, we will run the command above in an AzureCLI task:&lt;/p>
&lt;p>After transpile the Bicep into ARM Template, it will deploy as a Deployment Artefact read to be consumed:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/1_GhTEFX4p8uW0MOolGJJRsQ.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines/1_GsfTVy6oBm0Deal_YVFUcw.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>Build your Bicep is a good practice, as you can validate that there is no error in it and gather all necessary files to be deployed.&lt;/p>
&lt;h4 id="deploying-bicep-with-yaml-pipelines">Deploying Bicep with YAML Pipelines
&lt;/h4>&lt;p>With the artifacts generated in the build step, now we are ready to deploy them in our environment. For that it is necessary to add one more stage into the build YAML, with the instruction to run the ARM Template:&lt;/p>
&lt;p>It consumes the task &lt;code>AzureResourceManagerTemplateDeployment@3&lt;/code> that is responsible to run the ARM Template into Azure Subscription. You can have more information about this task &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-resource-group-deployment?view=azure-devops" target="_blank" rel="noopener"
>here&lt;/a>.&lt;/p>
&lt;p>This stage represents the development stage. To deploy it in other environments, you just need to copy it and replace the values according to your environments :)&lt;/p>
&lt;h3 id="real-lifeexample">Real life example
&lt;/h3>&lt;p>To check these examples in more realistic situations, I have been working in a GitHub repository with examples of pipelines configured and working. You can check that in the DevOps Nights GitHub here: &lt;a class="link" href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" target="_blank" rel="noopener"
>devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>
&lt;h3 id="databricks-yamlpipeline">Databricks YAML Pipeline
&lt;/h3>&lt;p>As promised below you can check a full Azure DevOps YAML Pipeline configured and working:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Bicep has become a very relevant tool for Azure and has a good potential to be the default tool for Infrastructure as Code in Azure. So start to be familiar with it now, will be very relevant in the future :)&lt;/p>
&lt;p>I hope this post could help you, and see you in the next post!&lt;/p></description></item><item><title>Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML…</title><link>http://www.wesleycamargo.com/p/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/</link><pubDate>Fri, 13 Aug 2021 18:24:55 +0200</pubDate><guid>http://www.wesleycamargo.com/p/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/0_UxUKOY8oNniMGGHd.png" alt="Featured image of post Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML…" />&lt;h3 id="azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml-pipelines">Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML Pipelines
&lt;/h3>&lt;h4 id="the-easiest-way-to-publishdeploy-azure-data-factory-artifacts">The easiest way to publish/deploy Azure Data Factory artifacts
&lt;/h4>&lt;h3 id="how-to-create-azure-data-factory-usingiac">How to Create Azure Data Factory using IaC
&lt;/h3>&lt;h4 id="infrastructure-ascode">Infrastructure as Code
&lt;/h4>&lt;p>There are tons of reasons to use IaC in your projects, as you can check &lt;a class="link" href="https://docs.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code#:~:text=Infrastructure%20as%20Code%20enables%20DevOps,to%20prevent%20common%20deployment%20issues." target="_blank" rel="noopener"
>here&lt;/a>. One of them is that Infrastructure as Code is the easiest and fast way to implement your environment. So, as we want to keep our ADF deployment simple, why not use it :)?&lt;/p>
&lt;p>In this example, I will use &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" target="_blank" rel="noopener"
>Bicep &lt;/a>templates to deploy our Data Factory. If Bicep is new to you, it is basically a DSL (Domain Specific Language) to make things easier for ARM Templates users.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/0_UxUKOY8oNniMGGHd.png"
loading="lazy"
alt="Image"
>
Bicep is has a good extension for VS Code— Image from &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" target="_blank" rel="noopener"
>Microsoft Docs&lt;/a>&lt;/p>
&lt;p>In this &lt;a class="link" href="https://camargo-wes.medium.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" target="_blank" rel="noopener"
>post&lt;/a>, you can check how to create the Bicep file for Data Factory with git integration that will be used to deploy the ADF.&lt;/p>
&lt;p>It will create a link between your Azure Data Factory and your git repo (it works on Azure DevOps and GitHub), so when you create a pipeline in your Data Factory, it will also be versioned into the git repo.&lt;/p>
&lt;h3 id="git-repository">Git Repository
&lt;/h3>&lt;h4 id="repository-structure">Repository Structure
&lt;/h4>&lt;p>The repo structure will depend on each project. One of the best practices is to keep all necessary code to deploy a project in the same repo. Due to that, I like to create a structure where I have the name of the component, and always an “src” folder underneath. In this case, we will make the src folder as “Root folder” in the git integration process.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_YtAqSUP9bqM4NyrMgs3UIw.png"
loading="lazy"
alt="Image"
>
Repository Structure — Image by author&lt;/p>
&lt;h4 id="required-files-to-build-arm-templates">Required files to build ARM Templates
&lt;/h4>&lt;p>Some files are necessary to have in our repo to generate the templates. These files need to be added to the src folder, and they will be referenced during the build stage.&lt;/p>
&lt;p>In the src folder create the file package.json. It contains the metadata of the package that will be used to build the ADF Artifacts.&lt;/p>
&lt;p>In the same folder also create the file publish_config.json with the content below. It will not impact the generation of the ARM Templates, but it’s necessary to run the build:&lt;/p>
&lt;p>The last file is arm-template-parameters-definition.json. This contains the definitions of your ARM Parameters. I won’t go into details, as it requires a dedicated post for it. For the initial version, you can just create the content below:&lt;/p>
&lt;p>After create git integrate and all necessary files this is how your repo will look like:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_xesC9GvPVvyOeHafv6EvXg.png"
loading="lazy"
alt="Image"
>
Repository structure for Azure Data Factory — Image by author&lt;/p>
&lt;h3 id="how-to-create-build-yaml-pipelines-for-azure-datafactory">How to create Build YAML Pipelines for Azure Data Factory
&lt;/h3>&lt;p>No doubt that pipeline as code will be the future of pipeline definitions, with the capacity to be under version control and reusability.&lt;/p>
&lt;h4 id="variables">Variables
&lt;/h4>&lt;p>The first configuration that is necessary is the variables. They will be used both for build and release later on.&lt;/p>
&lt;p>The most important variables during the build stage are:&lt;/p>
&lt;ul>
&lt;li>workingDir - This is the src directory. There must be the required files mentioned above.&lt;/li>
&lt;li>dataFactoryResourceId - Fill this with the resource Id of your ADF. It’s a good idea to make it parametrizable to work in different environments&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_Y8FG1YgQAtQCCysOutYifw.png"
loading="lazy"
alt="Image"
>
Build and Deployment Variables — Image by author&lt;/p>
&lt;h4 id="building-datafactory">Building Data Factory
&lt;/h4>&lt;p>As mentioned above, we need to consume the &lt;a class="link" href="https://www.npmjs.com/package/@microsoft/azure-data-factory-utilities" target="_blank" rel="noopener"
>ADFUtilities NPM package&lt;/a> in the build process.&lt;/p>
&lt;p>In the first two tasks, NodeJS is configured in the build agent. Pay attention to workingDir variable that we mentioned in the Variables section.&lt;/p>
&lt;p>In the latest two tasks, we are calling the NPM package to Validate and “Build” our Data Factory and Generate the ARM Templates. In the last task “artifacts” is the relative output directory. It means that it will be the output directory to the ARM Templates.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_hxff1a4SfxpSRAKGjak-7A.png"
loading="lazy"
alt="Image"
>
Build tasks for Azure Data Factory — Image by author&lt;/p>
&lt;p>In the next tasks, we are copying the ARM Templates from the output to the staging directory, and “building“ the bicep files into ARM Templates. These ones will be used to create the Azure Data Factory Workspace.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_FzU20QATViUliVFKaujdlw.png"
loading="lazy"
alt="Image"
>
Build tasks for Azure Data Factory — Image by author&lt;/p>
&lt;p>After running the build pipeline, you will have the artifacts that will be consumed during the deployment stage:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_xLM1sqP0zF8ToLhmWy84bA.png"
loading="lazy"
alt="Image"
>
Azure Data Factory artifacts — Image by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_KokLuIz66bVH_C8D9MqvGA.png"
loading="lazy"
alt="Image"
>
Azure Data Factory ARM Templates — Image by author&lt;/p>
&lt;h3 id="how-to-create-release-yaml-pipelines-for-azure-datafactory">How to create Release YAML Pipelines for Azure Data Factory
&lt;/h3>&lt;p>To deploy Data Factory we are using the run Once strategy. It will consume the artifacts created on the build stage&lt;/p>
&lt;h4 id="development">Development
&lt;/h4>&lt;p>When the git integration is enabled in development environment, as the code is produced in the workspace, there is no need to publish in this environment. It will deploy only the environment using the Infrastructure as Code templates. It also contains a dependency for the build stage.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_1CyHziX8HIxTiFKWd1AHJw.png"
loading="lazy"
alt="Image"
>
Development environment — Image by author&lt;/p>
&lt;h4 id="uat-and-production">UAT and Production
&lt;/h4>&lt;p>In UAT we have a dependency on the development environment. In Production, the dependency is on UAT. As in these stages, we need to deploy both, infrastructure and code, we will use a preDeploy and deploy job:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_H7fXBNZIabhKW5BEoxT2Lw.png"
loading="lazy"
alt="Image"
>
preDeploy stage — Image by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_TK9afdqzBDdiE2m1791joQ.png"
loading="lazy"
alt="Image"
>
deploy stage — Image by Author&lt;/p>
&lt;p>When run it will first create the Infrastructure using the Bicep files in the preDeploy Stage, and then deploy the artifacts generated on the build stage. And this is the final result:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-data-factory-ci-cd-made-simple-building-and-deploying-arm-templates-with-azure-devops-yaml/1_D1TW--IjWUMr1c-TR5CNYQ.png"
loading="lazy"
alt="Image"
>
Deployment Pipeline — Image by Author&lt;/p>
&lt;h3 id="key-takeaways">Key Takeaways
&lt;/h3>&lt;p>There is more than one strategy to deploy Azure Data Factory, I have tried most of them and they work very well, but this one from my point of view is the simplest and clean way to achieve fully automated deployments.&lt;/p>
&lt;p>Below you can check the complete YAML used to deploy it. You can also check other Azure DevOps YAML Templates examples in my GitHub repo: &lt;a class="link" href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" target="_blank" rel="noopener"
>devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>
&lt;p>I hope it can be useful!&lt;/p></description></item><item><title>DataOps Automation — Creating Azure Data Factory with git integration using Bicep</title><link>http://www.wesleycamargo.com/p/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep/</link><pubDate>Sun, 25 Jul 2021 00:48:52 +0200</pubDate><guid>http://www.wesleycamargo.com/p/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-creating-azure-data-factory-with-git-integration-using-bicep/1_HzDcdeTCGa9vVDuUQulXAQ.png" alt="Featured image of post DataOps Automation — Creating Azure Data Factory with git integration using Bicep" />&lt;h3 id="dataops-automationcreating-azure-data-factory-with-git-integration-usingbicep">DataOps Automation — Creating Azure Data Factory with git integration using Bicep
&lt;/h3>&lt;p>An important feature available in Azure Data Factory is the git integration, which allows us to keep Azure Data Factory artifacts under Source Control. This is a mandatory step to achieve Continuous Integration and Delivery later on, so why not configure this using Infrastructure as Code with Bicep in a fully automated way?&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-creating-azure-data-factory-with-git-integration-using-bicep/1_HzDcdeTCGa9vVDuUQulXAQ.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>In the &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" target="_blank" rel="noopener"
>official Microsoft documentation&lt;/a> there is a good topic explaining how to integrate Azure Data Factory with git, but through the Azure Portal. In this post, I will explain how to do that using Bicep, the new IaC language for Azure, to make it possible to include this step into your CI/CD process, and also how to deploy only on needed environments.&lt;/p>
&lt;h3 id="azure-data-factory-git-integration">Azure Data Factory Git integration
&lt;/h3>&lt;p>Okay, but why do I need to use git on my ADF? To explain this, I’ll list some advantages that the git integration offers, taken from &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" target="_blank" rel="noopener"
>Microsoft’s documentation&lt;/a>:&lt;/p>
&lt;h4 id="source-control">&lt;strong>Source control&lt;/strong>
&lt;/h4>&lt;p>As your data factory workloads become crucial, you would want to integrate your factory with Git to leverage several source control benefits like the following:&lt;/p>
&lt;ul>
&lt;li>Ability to track/audit changes.&lt;/li>
&lt;li>Ability to revert changes that introduced bugs.&lt;/li>
&lt;/ul>
&lt;h4 id="partial-saves">&lt;strong>Partial saves&lt;/strong>
&lt;/h4>&lt;p>When authoring against the data factory service, you can’t save changes as a draft and all publish must pass data factory validation. Whether your pipelines are not finished or you simply don’t want to lose changes if your computer crashes, git integration allows for incremental changes of data factory resources regardless of what state they are in. Configuring a git repository allows you to save changes, letting you only publish when you have tested your changes to your satisfaction.&lt;/p>
&lt;h4 id="collaboration-andcontrol">Collaboration and control
&lt;/h4>&lt;p>If you have multiple team members contributing to the same factory, you may want to let your teammates collaborate with each other via a code review process. You can also set up your factory such that not every contributor has equal permissions. Some team members may only be allowed to make changes via Git and only certain people in the team are allowed to publish the changes to the factory.&lt;/p>
&lt;h4 id="better-cicd">Better CI/CD
&lt;/h4>&lt;p>If you are deploying to multiple environments with a &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment" target="_blank" rel="noopener"
>continuous delivery process&lt;/a>, git integration makes certain actions easier. Some of these actions include:&lt;/p>
&lt;ul>
&lt;li>Configure your release pipeline to trigger automatically as soon as there are any changes made to your ‘dev’ factory.&lt;/li>
&lt;li>Customize the properties in your factory that are available as parameters in the Resource Manager template. It can be useful to keep only the required set of properties as parameters and have everything else hardcoded.&lt;/li>
&lt;/ul>
&lt;h4 id="better-performance">Better Performance
&lt;/h4>&lt;p>An average factory with git integration loads 10 times faster than one authoring against the data factory service. This performance improvement is because resources are downloaded via Git.&lt;/p>
&lt;h3 id="git-integration-is-only-for-development-environment">Git Integration is only for Development Environment
&lt;/h3>&lt;p>There are two flows recommended by Microsoft to perform CI/CD on ADF, (you can check it on &lt;a class="link" href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" target="_blank" rel="noopener"
>this post&lt;/a>), in both cases the development happens in the Development Data Factory workspace only, and the artifacts are promoted through CI/CD deployments. It means that we should not create this integration for non-dev environments like UAT or Production. I will also cover how to identify the environment and create the integration only for your development environment :)&lt;/p>
&lt;h3 id="creating-bicep-templates-for-azure-data-factory-step-bystep">Creating Bicep templates for Azure Data Factory step by step
&lt;/h3>&lt;p>To keep the explanation simple, I’ll show each stage of the bicep file. Each stage is a deployable file that you can execute individually with the command&lt;/p>
&lt;p>*az deployment group create -f &lt;your file>.bicep -g &lt;your resource group>*In the end, we will have the complete file ready to use.&lt;/p>
&lt;h4 id="creating-data-factory-workspace">Creating Data Factory Workspace
&lt;/h4>&lt;p>In the first stage, we are creating only the workspace with the most basic configurations. You can see that for the location we are using the location of the Resource Group where we are executing this deployment.&lt;/p>
&lt;h4 id="linking-github-with-azure-datafactory">Linking GitHub with Azure Data Factory
&lt;/h4>&lt;p>In this stage we achieve the first goal of this post: create the **git integration. **I include the parameters necessary to connect with a GitHub repo, and then a section into “properties”. Now lets check the parameters:&lt;/p>
&lt;ul>
&lt;li>**accountName &lt;strong>-&lt;/strong> **This is your GitHub/Azure DevOps account name.&lt;/li>
&lt;li>**repositoryName **- Name of your repository, pay attention that you don’t need your account name at the beginning.&lt;/li>
&lt;li>**collaborationBranc **- The branch that will be used to integrate your feature branches. It will depend on your branch stratety. For git flow, it should be developed branch, for GitHub Flow, master/main.&lt;/li>
&lt;li>**rootFolder **- The folder in your repo where the databricks artifacts will be versioned.&lt;/li>
&lt;li>&lt;strong>projectName&lt;/strong> - This parameter is only used for Azure DevOps. It’s the Team Project name of your repo.&lt;/li>
&lt;li>**type **- This parameter defines if your repo is hosted on GitHub or Azure DevOps. For GitHub, the value must be:&lt;/li>
&lt;/ul>
&lt;p>FactoryGitHubConfigurationFor Azure Devops the value is:&lt;/p>
&lt;p>&lt;code>ash FactoryVSTSConfiguration &lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-creating-azure-data-factory-with-git-integration-using-bicep/1_kPiiBIbO9dRU8xDRdSdOmg.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;h4 id="checking-the-environments">Checking the environments
&lt;/h4>&lt;p>As was explained above, we must create git integration in the development environment only. If you are using only GitHub or only Azure DevOps, this stage should be enough for your scenario. To check that, we need the following steps:&lt;/p>
&lt;ul>
&lt;li>An environment parameter.&lt;/li>
&lt;li>Extract the content of &lt;strong>repoConfiguration&lt;/strong> to an external variable.&lt;/li>
&lt;li>Use a ternary if to check if the environment provided is development. If it is, then use the variable, if not, use an empty group.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-creating-azure-data-factory-with-git-integration-using-bicep/1_sR-iArVHnrubuSbaaH4a4A.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>The bicep file of this stage:&lt;/p>
&lt;h4 id="linking-github-or-azure-devops-to-azure-datafactory">Linking GitHub or Azure DevOps to Azure Data Factory
&lt;/h4>&lt;p>In case that in your scenario you have both Azure DevOps and GitHub, you can prepare your template to support that. This template is more flexible and can be used in more situations. Let’s check the differences from the previous one:&lt;/p>
&lt;ul>
&lt;li>Included a “User Friendly” parameter to indicate the type of the repo.&lt;/li>
&lt;li>Check the type parameter and create a variable with the expected value.&lt;/li>
&lt;li>Create two configurations, one for GitHub and one for Azure DevOps.&lt;/li>
&lt;li>Include another ternary if nested into the first one&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-creating-azure-data-factory-with-git-integration-using-bicep/1_axZ5TeO8PChLhDkzhOEbhA.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>Below you can check the final bicep template:&lt;/p>
&lt;h3 id="real-lifeexample">Real life example
&lt;/h3>&lt;p>To check these examples in more realistic situations, I have been working in a repository in GitHub with examples of pipelines configured and working. You can check that in the DevOps Nights GitHub here: &lt;a class="link" href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" target="_blank" rel="noopener"
>devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>
&lt;p>In &lt;a class="link" href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" target="_blank" rel="noopener"
>this post&lt;/a>, I am showing how to consume this Bicep Template into an Azure DevOps Pipeline.&lt;/p>
&lt;p>I hope this post can help you to create your ADF in a more automated way, and see you in the next post!&lt;/p>
&lt;h4 id="references">References
&lt;/h4>&lt;p>&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" target="_blank" rel="noopener"
>Source control — Azure Data Factory | Microsoft Docs&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://docs.microsoft.com/en-us/rest/api/datafactory/factories/configure-factory-repo#factoryvstsconfiguration" target="_blank" rel="noopener"
>Factories — Configure Factory Repo — REST API (Azure Data Factory) | Microsoft Docs&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/templates/microsoft.datafactory/factories?tabs=json" target="_blank" rel="noopener"
>Microsoft.DataFactory/factories 2018–06–01 — ARM template reference | Microsoft Docs&lt;/a>&lt;/p></description></item><item><title>DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines</title><link>http://www.wesleycamargo.com/p/dataops-automation-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/</link><pubDate>Tue, 15 Jun 2021 18:54:07 +0200</pubDate><guid>http://www.wesleycamargo.com/p/dataops-automation-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_7aLnpcc0eKFY3hptjG5W4Q.png" alt="Featured image of post DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines" />&lt;h3 id="dataops-automationdeploying-databricks-notebooks-with-azure-devops-yaml-pipelines">DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines
&lt;/h3>&lt;p>In this post, I will show an easy way how to deploy your Databricks notebooks using Azure DevOps and YAML pipelines.&lt;/p>
&lt;p>This will be the first of a series of posts, showing how to deploy code and infrastructure of Data Platform tools. I created GitHub repo to keep the examples, so if you want you can check that here: &lt;a class="link" href="https://github.com/wesleycamargo/DataOps" target="_blank" rel="noopener"
>wesleycamargo/DataOps (github.com)&lt;/a> 🙂&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_7aLnpcc0eKFY3hptjG5W4Q.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;h4 id="project-structure">Project structure
&lt;/h4>&lt;p>The organization of this repo is based on components, so I’ll keep everything necessary to deploy some kind of component together. If you have a different structure, remember to update the yaml templates with your paths.&lt;/p>
&lt;p>For databricks we have a &lt;code>/databricks&lt;/code> and a &lt;code>/src&lt;/code> folder, in the future it will be important to segregate from IaC code. You can have your project folders on this level, in my example, I have two notebooks inside a &lt;code>calculator&lt;/code> folder`.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_v-4dZZgIV3rrRXiZe6jcOA.png"
loading="lazy"
alt="Image"
>
Project structure — Image prepared by author&lt;/p>
&lt;h4 id="preparing-artifacts">Preparing artifacts
&lt;/h4>&lt;p>In the build stage, we will create a copy of our notebooks into a staging folder, and then publish them as build artifacts to be consumed later in the process.&lt;/p>
&lt;p>We will copy all folders under &lt;code>/src&lt;/code> folder, so when we deploy that into databricks workspace all folders will be created into the workspace as well.&lt;/p>
&lt;p>If you run the pipeline now you already can see the artifacts and the structure:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_zBile6BF8zXBHNK78lqPRQ.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;h4 id="setting-variables">Setting variables
&lt;/h4>&lt;p>In the deployment stage, we will need to consume some sensitive information like your databricks Personal Access Token. To avoid hard coding this information and to keep this example simple, let&amp;rsquo;s create some variables in the pipeline.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_YZkUdlCrfAwCZKOyL_Wo_g.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines/1_igdByvqLq-3bKW2Pvnl7JA.png"
loading="lazy"
alt="Image"
>
Image prepared by author&lt;/p>
&lt;h4 id="deploy">Deploy
&lt;/h4>&lt;p>To deploy we will use a special kind of job called &lt;code>deployment &lt;/code>🙂, there are some advantages to use this instead of the regular job, but I’ll do not explore them now.&lt;/p>
&lt;p>In the first step, we are setting up the python version to 3.x, to that we are using a task to abstract this activity.&lt;/p>
&lt;p>In the second one, we are setting app our databricks workspace. Basically, we are creating a &lt;code>.databrickscfg&lt;/code> file with your token and databricks URL. To populate this file we need to consume the variables created before. So be sure that you have &lt;code>databricks.host&lt;/code> and &lt;code>databricks.token&lt;/code> create. We are also installing the databricks CLI to run on the next step.&lt;/p>
&lt;p>And finally, in the last step we are importing the artifacts generated before using databricks CLI.&lt;/p>
&lt;p>Below you can see the complete YAML template.&lt;/p>
&lt;p>Hope that post can help you and see you in the next post! 😃&lt;/p></description></item><item><title>DataOps Automation — Accessing Databricks API with AAD Service Principal Name</title><link>http://www.wesleycamargo.com/p/dataops-automation-accessing-databricks-api-with-aad-service-principal-name/</link><pubDate>Sat, 29 May 2021 16:24:43 +0200</pubDate><guid>http://www.wesleycamargo.com/p/dataops-automation-accessing-databricks-api-with-aad-service-principal-name/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-accessing-databricks-api-with-aad-service-principal-name/1_r4Rwmx79PqTVP7A3ZlN8LA.png" alt="Featured image of post DataOps Automation — Accessing Databricks API with AAD Service Principal Name" />&lt;h3 id="dataops-automationaccessing-databricks-api-with-aad-service-principal-name">DataOps Automation — Accessing Databricks API with AAD Service Principal Name
&lt;/h3>&lt;p>Databricks is an Apache Spark tool for data engineering used to process and transform large amounts of data and explore running machine learning models.&lt;/p>
&lt;p>In this post I’ll show how to call databricks API’s, an important resource to automate the deployment and resources creation.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/dataops-automation-e-accessing-databricks-api-with-aad-service-principal-name/1_r4Rwmx79PqTVP7A3ZlN8LA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="preparing-tokens">Preparing Tokens
&lt;/h3>&lt;p>Yes, you read it right token&lt;strong>s&lt;/strong> in the plural, we need more than one token to perform authentication.&lt;/p>
&lt;p>Actually, if your SPN is a user in your databricks workspace only the AAD token should be enough, but I believe that in most situations if you want to automate from scratch your workspace it will not be the case.&lt;/p>
&lt;h4 id="creating-aadtoken">Creating AAD token
&lt;/h4>&lt;p>To create an AAD token it´s necessary the tenant Id of your subscription, an SPN Id, and SPN secret. If you don’t know how to create a Service Principal Name check it out here &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal" target="_blank" rel="noopener"
>Create an Azure AD app &amp;amp; service principal in the portal — Microsoft identity platform | Microsoft Docs&lt;/a>&lt;/p>
&lt;p>For this, I have created the function below, as we will use it more than once.&lt;/p>
&lt;h4 id="preparing-httpheader">Preparing HTTP header
&lt;/h4>&lt;p>As I mentioned before, we need two AAD Tokens if our SPN is not added as a user into databricks.&lt;/p>
&lt;p>The first token is a databricks token. To create that we need to provide the databricks resource id (2ff814a6–3304–4ab8–85cb-cd0e6f879c1d).&lt;/p>
&lt;p>If your SPN is a user in your databricks workspace, only this token should be enough.&lt;/p>
&lt;p>The second one is the management endpoint token you also need to provide the resource id, in this case, it should be “&lt;a class="link" href="https://management.core.windows.net/" target="_blank" rel="noopener"
>https://management.core.windows.net/&lt;/a>”. Additionally, your SPN must have Contributor or Owner permissions on your databricks.&lt;/p>
&lt;p>&lt;strong>Creating the databricks Personal Access Token&lt;/strong>&lt;/p>
&lt;p>With our header prepared, you just need to call the databricks API, consuming the methods that you need.&lt;/p>
&lt;p>&lt;strong>Complete Script&lt;/strong>&lt;/p>
&lt;p>Below you can find the complete script, including the auxiliar functions :)&lt;/p>
&lt;p>I hope it can help you, and see you in next post!&lt;/p></description></item><item><title>Creating a pretty git log</title><link>http://www.wesleycamargo.com/p/creating-a-pretty-git-log/</link><pubDate>Sat, 01 May 2021 12:33:52 +0200</pubDate><guid>http://www.wesleycamargo.com/p/creating-a-pretty-git-log/</guid><description>&lt;h3 id="creating-a-pretty-gitlog">Creating a pretty git log
&lt;/h3>&lt;p>Do you know git lg command? Git log command is very helpful, but sometimes, it can be a bit tricky to have a good view of your history tree. I’ll show with simple commands how to improve that and create your customized log message :).&lt;/p>
&lt;p>The default git log command brings a lot of useful information, as we can see in the picture below. But when you need to know which branch your commit was originally created, it didn’t give you a good tree view of that.&lt;/p></description></item><item><title>Azure Reports: Exporting Azure resources with Powershell and Azure CLI</title><link>http://www.wesleycamargo.com/p/azure-reports-exporting-azure-resources-with-powershell-and-azure-cli/</link><pubDate>Wed, 28 Apr 2021 17:31:36 +0200</pubDate><guid>http://www.wesleycamargo.com/p/azure-reports-exporting-azure-resources-with-powershell-and-azure-cli/</guid><description>&lt;img src="https://cdn-images-1.medium.com/max/800/0*ItDdV0YdZCjm5u5T" alt="Featured image of post Azure Reports: Exporting Azure resources with Powershell and Azure CLI" />&lt;h3 id="azure-reports-exporting-azure-resources-with-powershell-and-azurecli">Azure Reports: Exporting Azure resources with Powershell and Azure CLI
&lt;/h3>&lt;p>A common scenario when we work with DevOps and cloud is the need to export information about your resources. In this post, I’ll show the simplest way to extract that with the command line.&lt;/p>
&lt;p>&lt;img src="https://cdn-images-1.medium.com/max/800/0*ItDdV0YdZCjm5u5T"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>The idea of this post is to show the mechanism behind the extraction, I’ll run a simple command to recover the resources and choose some columns to export to a CSV file. You can use this as a base of more complex reports to handle properties, cross with other information, etc.&lt;/p>
&lt;p>The first step is to connect in our Azure Account using Azure CLI (you can also do it using Azure Powershell), and recover all resources in our subscription:&lt;/p>
&lt;p>Then we create an Array List to populate, iterate on the resources recovered above, and add the needed fields on the array:&lt;/p>
&lt;p>Now we create a file name based on date and time to export the populated array. In my case I’m using the Delimiter “;”, as in my favorite regionalization this is the default pattern for CSV files. If this is not your case, you can remove that parameter.&lt;/p>
&lt;p>This is the complete script, including the outputPath parameter:&lt;/p>
&lt;p>And this is the file exported:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/azure-reports-exporting-azure-resources-with-powershell-and-azure-cli/1_s2J6kTWmfhRKG0O86hqaHg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>This is the link for my GitHub repository, and the intention is to fill it with more complex reports :)&lt;/p>
&lt;p>&lt;a class="link" href="https://github.com/wesleycamargo/AzureReports" target="_blank" rel="noopener"
>https://github.com/wesleycamargo/AzureReports&lt;/a>&lt;/p>
&lt;p>See you in the next post!&lt;/p></description></item><item><title>Deploying a DotNet Core app in Azure Web App by command line</title><link>http://www.wesleycamargo.com/p/deploying-a-dotnet-core-app-in-azure-web-app-by-command-line/</link><pubDate>Thu, 07 Jan 2021 09:01:16 +0100</pubDate><guid>http://www.wesleycamargo.com/p/deploying-a-dotnet-core-app-in-azure-web-app-by-command-line/</guid><description>&lt;h3 id="deploying-a-dotnet-core-app-in-azure-web-app-by-commandline">Deploying a DotNet Core app in Azure Web App by command line
&lt;/h3>&lt;p>If you need to fast deploy your dotnet core App in Azure, but don’t want to configure an entire CI/CD Pipeline, check in this post on how to deploy it!&lt;/p>
&lt;p>To deploy the web app we will use a simple DotNet Core MVC application.&lt;/p>
&lt;p>First of all, let´s create some parameters to prepare our resources. We are using a random id to avoid create the resources with some existing name:&lt;/p>
&lt;p>To create the app, we will use an MVC Sample in the dotnet core templates. If you already have an existing project to deploy, skip the first line. We will prepare the publishing package with the dotnet core publish command and then zip it in a file:&lt;/p>
&lt;p>In Azure, we will create a resource group and an app service plan, that are pre reqs to run a WebApp.&lt;/p>
&lt;p>And finally, execute the deployment in the WebApp created above.&lt;/p></description></item><item><title>How to collect Business Information in Application Insights</title><link>http://www.wesleycamargo.com/p/how-to-collect-business-information-in-application-insights/</link><pubDate>Sun, 03 Jan 2021 16:06:38 +0100</pubDate><guid>http://www.wesleycamargo.com/p/how-to-collect-business-information-in-application-insights/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-collect-business-information-in-application-insights/1_Q236l-ogEMAxUQUTxLoV6A.png" alt="Featured image of post How to collect Business Information in Application Insights" />&lt;h3 id="monitoring---how-to-collect-business-information-in-application-insights">Monitoring - How to collect Business Information in Application Insights
&lt;/h3>&lt;p>Sometimes you have business requirements to know how many times something happened. An easy way to do that is by using Application Insights Telemetry. In this post, we will see how to do this configuration.&lt;/p>
&lt;h4 id="creating-the-azure-application-insights">Creating the Azure Application Insights
&lt;/h4>&lt;p>Create a new Application Insights in your Azure account. You can create with the ARM Template below:&lt;/p>
&lt;p>To run the ARM Template with Az CLI, you can use these commands:&lt;/p>
&lt;p>az group create -n RG-Samples -l northeurope
az deployment group create -g RG-Samples — template-file .\appInsights.jsonIt will return an Instrumentation Key as output, save this value to use later.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-collect-business-information-in-application-insights/1_Q236l-ogEMAxUQUTxLoV6A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="creating-the-asp-netproject">Creating the Asp Net Project
&lt;/h4>&lt;p>Create a new MVC application and add the package Microsoft.ApplicationInsights.AspNetCore:&lt;/p>
&lt;p>dotnet new mvc
dotnet add package Microsoft.ApplicationInsights.AspNetCoreNow in the Startup.cs file, we need to configure the Application Insights Telemetry.&lt;/p>
&lt;p>Go to the method ConfigureServices and add the line &lt;code>services.AddApplicationInsightsTelemetry();&lt;/code>&lt;/p>
&lt;p>At the end of the file Views/Home/Index.cshtml add a button to call the event:&lt;/p>
&lt;p>In the HomeController.cs, add a private variable with the type &lt;code>*TelemetryClient&lt;/code> and *add to the constructor a variable to assign it. Also, add a new method to call your Event Button.&lt;/p>
&lt;p>In the appSettings.json, replace the content as below and substituting the Instrumentation Key with the value collected in the steps above:&lt;/p>
&lt;h4 id="collecting-and-searching-data-in-application-insights">Collecting and searching data in Application Insights
&lt;/h4>&lt;p>Run the application with the command &lt;code>dotnet run&lt;/code> and open &lt;a class="link" href="https://localhost:5001" target="_blank" rel="noopener"
>https://localhost:5001&lt;/a> in your browser. Now click some times in Hello to generate data in the application insights:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-collect-business-information-in-application-insights/1_QEhqjDvoeaFCDf-j5tnvGg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-collect-business-information-in-application-insights/1_mLBIN--h0OCAHSrlEhiPSg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>In Azure Portal, open the Application Insights created, and click in search:&lt;/p></description></item><item><title>Az DevOps YAML Pipelines — Creating a Multi Source pipeline with GitHub Repositories</title><link>http://www.wesleycamargo.com/p/az-devops-yaml-pipelines-creating-a-multi-source-pipeline-with-github-repositories/</link><pubDate>Sun, 20 Dec 2020 01:21:03 +0100</pubDate><guid>http://www.wesleycamargo.com/p/az-devops-yaml-pipelines-creating-a-multi-source-pipeline-with-github-repositories/</guid><description>&lt;h3 id="az-devops-yaml-pipelinescreating-a-multi-source-pipeline-with-github-repositories">Az DevOps YAML Pipelines — Creating a Multi Source pipeline with GitHub Repositories
&lt;/h3>&lt;p>Sometimes should be necessary to use more than one repository in our deployment pipelines. Maybe you are deploying resources from different repositories together, or maybe you have a script repo with some reusable tools.&lt;/p>
&lt;p>But when we create a YAML pipeline, by default it just checkout the repo on what our YAML is versioned, so it´s necessary to add a second repo, and below we will see how to do it =).&lt;/p>
&lt;p>If you don´t know how to create a basic YAML pipeline, you can learn this here: &lt;a class="link" href="https://docs.microsoft.com/en-us/azure/devops/pipelines/create-first-pipeline?view=azure-devops&amp;amp;tabs=net%2Ctfs-2018-2%2Cbrowser" target="_blank" rel="noopener"
>Create your first pipeline — Azure Pipelines | Microsoft Docs&lt;/a>&lt;/p>
&lt;p>In this example, I´ll use two GitHub repositories, the first one has my App Code and the YAML pipeline, and the second one has some PowerShell scripts.&lt;/p>
&lt;p>We can see the initial build YAML below:&lt;/p>
&lt;p>During the build execution of this pipeline, we can see that we have an “auto checkout”, that is not required any additional configuration.&lt;/p></description></item><item><title>Save Money with Azure: Handling your resources with Azure Functions</title><link>http://www.wesleycamargo.com/p/save-money-with-azure-handling-your-resources-with-azure-functions/</link><pubDate>Sat, 01 Aug 2020 22:30:15 +0200</pubDate><guid>http://www.wesleycamargo.com/p/save-money-with-azure-handling-your-resources-with-azure-functions/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_VMDq41L7qXNa_uWH.png" alt="Featured image of post Save Money with Azure: Handling your resources with Azure Functions" />&lt;h4 id="one-of-the-incessant-things-when-we-use-cloud-providers-its-how-to-have-the-biggest-efficiency-with-our-resources-if-you-have-azure-virtual-machines-for-example-reduce-the-time-of-non-production-environments-stays-turned-on-to-12-hours-at-weekdays-can-reduce-your-bill-by67">ONE OF THE INCESSANT THINGS WHEN WE USE CLOUD PROVIDERS, IT’S HOW TO HAVE THE BIGGEST EFFICIENCY WITH OUR RESOURCES. IF YOU HAVE AZURE VIRTUAL MACHINES, FOR EXAMPLE, REDUCE THE TIME OF NON-PRODUCTION ENVIRONMENTS STAYS TURNED ON TO 12 HOURS AT WEEKDAYS CAN REDUCE YOUR BILL BY 67%.
&lt;/h4>&lt;h3 id="save-money-with-azure-handling-your-resources-with-azure-functions">Save Money with Azure: Handling your resources with Azure Functions
&lt;/h3>&lt;p>In fact, when a VM is created, there is an option for shutdown within the scheduled time, but it’s a bit limited, due to nonexistence of an option to startup the VMs, nor the option to do this for dependent VMs as a Domain Controller that should be online when the other VMs start.&lt;/p>
&lt;p>A good, simple, and cheaper solution for this, is to use an Azure Function to startup and shutdown the Virtual Machines. So let’s see how we can do it!&lt;/p>
&lt;h3 id="what-you-willneed">What you will need:
&lt;/h3>&lt;ul>
&lt;li>Azure Account&lt;/li>
&lt;li>Visual Studio Code&lt;/li>
&lt;li>VS Code — Azure Functions Plugin&lt;/li>
&lt;li>An Azure Virtual Machine&lt;/li>
&lt;/ul>
&lt;h3 id="preparing-the-virtualmachine">Preparing the Virtual Machine
&lt;/h3>&lt;p>Now we need to create a beacon in the VMs that we need to shutdown/startup. For this function, we’ll use a tag &lt;code>shutdownDaily&lt;/code> with the value &lt;code>true.&lt;/code> Later we will filter the VMs with this tag and shut it down in the function script.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_VMDq41L7qXNa_uWH.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="creating-the-shutdown-function">Creating the shutdown function.
&lt;/h3>&lt;p>Open the Visual Studio Code, and create a new Powershell Function:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_x3FsmyoMMUNj0q89.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Select the Timer Function option and give a name to the function:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_P6mXyablY5cs1Jfv.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now we need to define how often the function will be executed. Here we will execute every day at 7 PM.&lt;/p>
&lt;p>The Azure Functions use cron expression to define the frequency. (&lt;a class="link" href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=csharp" target="_blank" rel="noopener"
>You can have more information here&lt;/a>)&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_n0gQs-THU0idujzR.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>It will create a basic function based on a template. We just need to keep the parameter &lt;code>$Timer.&lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_oLUB3JIPcB0ma_tU.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>For ease, you can replace all code with the block below:&lt;/p>
&lt;h3 id="publishing-the-function-onazure">Publishing the function on Azure
&lt;/h3>&lt;p>Now let’s publish the function on Azure Account.&lt;/p>
&lt;p>First Sign in to Azure. It will redirect you to a Microsoft Login Screen in your browser. Enter your credentials and go back to Visual Studio Code.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_WmwVA4gnSHHC2RDf.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Click in the Upload Icon, and select the desired subscription to deploy:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_BYBgma7b7A8X1kAG.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now create a new function, give a name, and select the region. It will create all resources with this name. If you need to change something, use the advanced mode. After creation it will deploy the code automatically:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_YgzrA2wK4fkZ1byd.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="given-permissions-to-thefunction">Given permissions to the function
&lt;/h3>&lt;p>After creating the function, we need to authorize it to manipulate Azure Resources. On function Settings, open Identity menu and change the status to On and save this.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_vvKuP65ge7TiWRdW.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>It will enable Azure role assignments button, touch this, and Add role assignment. Here I’ll create permission as a contributor int the subscription, but use the best approach to your environment:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_0nDFGluJUhFbx2pj.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_5TpXmm0HWeY8kJtp.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_agTsn3G0E0Ym6ChC.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="testing-thefunction">Testing the function
&lt;/h3>&lt;p>To test the function open it and run:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_TTBxoeKG68JZL3hk.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_vub82xMTqcUO97ji.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Expand the Logs menu, and check if everything is ok :)&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/save-money-with-azure-handling-your-resources-with-azure-functions/0_ZIaRcU6mg_3awEce.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="creating-a-startup-function">Creating a startup function.
&lt;/h3>&lt;p>For the startup function, create a new function and in the step to replace the auto-generated code, use the code below:&lt;/p>
&lt;h3 id="conclusion">Conclusion
&lt;/h3>&lt;p>Thi’s a simple use with one Virtual Machine, but you can expand this, with more complex environments as dependent resources and uses for other resources.&lt;/p>
&lt;p>I hope that it can be helpful to you!&lt;/p></description></item><item><title>Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor</title><link>http://www.wesleycamargo.com/p/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/</link><pubDate>Fri, 05 Jun 2020 22:27:53 +0200</pubDate><guid>http://www.wesleycamargo.com/p/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_3cUlED971rCD_21ltjnMcQ.png" alt="Featured image of post Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor" />&lt;h3 id="make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops---classiceditor">Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor
&lt;/h3>&lt;p>One of the most regular works in clients or companies that I faced, is to improve your existing CI/CD pipelines, reducing errors or the time run. In this post, I’ll show how to configure your jobs using multi-configuration.&lt;/p>
&lt;h4 id="when-do-i-have-to-usethis">When do I have to use this?
&lt;/h4>&lt;p>I’ll use as a didactic example an application with two projects: an API and a Web Site. This maybe can be a simple example, but you can find a better use for this approach in your day-to-day activities, ideally with tasks that take a long time to execute, as creating resources like Virtual Machines, Web Apps, or any other operations. &lt;strong>The greater advantage is that if you have one job or ten, it will take just the time for one execution.&lt;/strong>&lt;/p>
&lt;p>Below you can see a representation of the process. Notice that we have two Web App deployments serialized. However maybe you can have many processes, and if you have to wait for all of them, it can have a long time-consuming.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_3cUlED971rCD_21ltjnMcQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Otherwise, create a parallel activity approach, as you can see in the next image, you can save a lot of time just doing a simple configuration.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_oGXCq1fM6O8MzJ5jPqUq8A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="configuring-the-cdpipeline">Configuring the CD pipeline
&lt;/h4>&lt;p>I’ll use an existing build with two outputs: an API and a WebApp. The names used in the artifacts are important, we will use this later to define our application name. &lt;a class="link" href="https://medium.com/@camargo.wes/creating-a-net-core-application-and-pushing-to-github-or-azure-repos-22c115dde3a9" target="_blank" rel="noopener"
>Here&lt;/a>, I’ll show you how to create an application and send it to Azure DevOps.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_sTwA07LJk9zKklF2u59tXQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Create a classic CD pipeline for WebApp:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_u0NLg8-CMJhc2SRj7HGAUw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>After creation, open the variables tab and create a new var named &lt;strong>application&lt;/strong>.** **In the value enter the name of your artifacts split by a comma:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_88PWuEkqzUz6zjGM0NIM2Q.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Go back to the Tasks tab and open the agent options. In item 3, notice that it has the same variable that we created before. Item 4 it’s how many parallel jobs you would like to run.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1__FvRmjyzQnPX3iz5EdlPWg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>To use the multi-configuration, your WebApps names need some pattern. Here, I created a suffix and the end of the name will be the artifact name (or the split variable):&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_aDFsdhjmSy2kkwLAydJ0WA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now let’s configure the WebApp options. This is easy, just configure according to your pattern using the variable name:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_sgqtmxbEd72BvLqnyvdKGw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Now, check if you have enough parallel jobs available in your account. The default’s it’s one parallel job for self-hosted and one Microsoft hosted agents, but if you have users with MSDN in their accounts, each one increases plus one parallel job. If you don’t have, you need to buy new parallel agents.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_AoqHHoWjq_HnTFCWD3MYag.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="running-and-testing">Running and testing :)
&lt;/h4>&lt;p>After running our pipeline, we can see it’s working running in two parallel agents:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_gg0HhZVjPrZkWtOHQVOokg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>After all, processes finished, we can see that’s done!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor/1_-Ari24iWsvnvWoF2hC6iuw.png"
loading="lazy"
alt="Image"
>&lt;/p></description></item><item><title>Pushing your code to GitHub and Azure Repos at the same time</title><link>http://www.wesleycamargo.com/p/pushing-your-code-to-github-and-azure-repos-at-the-same-time/</link><pubDate>Fri, 22 May 2020 06:33:08 +0200</pubDate><guid>http://www.wesleycamargo.com/p/pushing-your-code-to-github-and-azure-repos-at-the-same-time/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_T1XtTzfeztcxintWQDAMyA.png" alt="Featured image of post Pushing your code to GitHub and Azure Repos at the same time" />&lt;h3 id="pushing-your-code-to-github-and-azure-repos-at-the-sametime">Pushing your code to GitHub and Azure Repos at the same time
&lt;/h3>&lt;p>If you have an existing repository hosted by an Azure Repos or in GitHub, you can add new remotes easily. Let’s see how we can do it!&lt;/p>
&lt;h4 id="creating-and-versioning-a-localproject">Creating and versioning a local project
&lt;/h4>&lt;p>Let’s create our project. In an empty directory type the CLI commands below:&lt;/p>
&lt;p>It will create a new .net core web application, with a gitignore file and versioned in a local git.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_T1XtTzfeztcxintWQDAMyA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="creating-an-azure-repos-repository-and-pushing-yourcode">Creating an Azure Repos repository and pushing your code
&lt;/h4>&lt;p>In your Azure DevOps account, follow these steps:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_2-w6QFXI1BKNjpfsFA4j6A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>In the next screen disable the ‘Add a README’ option and enter your repo name:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_6Ac2s4pAuPtWqdJ83iZEFQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>In the empty repository created you have some options to push your code, we’ll push from an existing repository, so copy the command as the figure:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_-o92AzdgasXkufQXiH8yBA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>In your terminal paste the command, remember to check if you’re in your project directory. The highlighted log will confirm if your push was successful:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pushing-your-code-to-github-and-azure-repos-at-the-same-time/1_uCQXpknv5LfF8haIA44_Vg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Refresh your Azure Repos page and your code was pushed!&lt;/p></description></item><item><title>Maratona Azure DevOps -Aprendendo na prática</title><link>http://www.wesleycamargo.com/p/maratona-azure-devops-aprendendo-na-pr%C3%A1tica/</link><pubDate>Thu, 21 May 2020 19:26:41 +0200</pubDate><guid>http://www.wesleycamargo.com/p/maratona-azure-devops-aprendendo-na-pr%C3%A1tica/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/maratona-azure-devops-aprendendo-na-prtica/1_hZ6lf-gqj9UPNDzGQwW-Dg.png" alt="Featured image of post Maratona Azure DevOps -Aprendendo na prática" />&lt;h3 id="maratona-azure-devops--aprendendo-naprática">Maratona Azure DevOps -Aprendendo na prática
&lt;/h3>&lt;p>Quer aprender como utilizar o Azure DevOps na prática? Então assista a Maratona Azure DevOps com mais de 12 horas de vídeos GRATUITOS.&lt;/p>
&lt;p>Ontem eu e a &lt;a class="link" href="https://medium.com/u/5f3c9bcfc939" target="_blank" rel="noopener"
>Jaqueline Ramos&lt;/a> finalizamos a segunda edição da Maratona Azure DevOps, foram 3 vídeos com aproximadamente 2 horas de conteúdo cada onde abordamos conceitos de DevOps e como aplicar na prática utilizando a ferramenta.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/maratona-azure-devops-aprendendo-na-prtica/1_hZ6lf-gqj9UPNDzGQwW-Dg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>A idéia da segunda edição foi de complementar o conteúdo da primeira, onde mostramos novidades como Pipelines YAML, importações de repositório e itens que não tivemos tempo de exibir na primeira.&lt;/p>
&lt;p>Abaixo estão os links para os vídeos da primeira e segunda edição, vou adicionar os vídeos da segunda edição na frente pois estão mais atualizados, espero que gostem!&lt;/p>
&lt;h3 id="segunda-edição">Segunda Edição
&lt;/h3>&lt;h4 id="primeiro-episódio">Primeiro episódio:
&lt;/h4>&lt;p>No primeiro dia da segunda edição da Maratona Azure DevOps tivemos uma abordagem mais conceitual falando sobre:&lt;/p>
&lt;ul>
&lt;li>Introdução a DevOps: Cultura e Práticas relacionadas&lt;/li>
&lt;li>Carreira em DevOps&lt;/li>
&lt;li>Ferramentas de colaboração&lt;/li>
&lt;/ul>
&lt;h4 id="segundo-episódio">Segundo episódio:
&lt;/h4>&lt;p>No segundo dia da segunda edição da maratona apresentamos alguns itens que não foram cobertos na primeira edição em:&lt;/p>
&lt;ul>
&lt;li>Azure Boards - Como gerenciar times, criar Dashboards, alterar templates de processos&lt;/li>
&lt;li>Azure Repos-Importando repositórios, utilizando Az CLI para alterações nos repositórios, criando um repositório local e enviando para o Azure DevOps, boas práticas para criação de repositórios&lt;/li>
&lt;li>Azure Pipelines - Criando Pipelines YAML&lt;/li>
&lt;li>Azure Artifacts - Criando um feed e enviando pacotes NuGet para o Azure Artifacts&lt;/li>
&lt;/ul>
&lt;h4 id="terceiro-episódio">Terceiro episódio:
&lt;/h4>&lt;p>No terceiro dia da maratona apresentamos:&lt;/p>
&lt;ul>
&lt;li>Azure Test Plans - Conheça como você pode gerenciar seus testes com o Azure Devops através de Work Items e automações de teste&lt;/li>
&lt;li>Azure DevOps e Integrações -Já utiliza Jenkins, SonarCloud, AWS ou outras ferramentas em seus projetos? Saiba como integra-las ao Azure DevOps e obter o melhor para sua empresa&lt;/li>
&lt;li>Preços - Entenda como são feitas as cobranças do Azure DevOps, e COMO UTILIZAR OS RECURSOS GRATUÍTOS!&lt;/li>
&lt;/ul>
&lt;h3 id="primeira-edição">Primeira Edição
&lt;/h3>&lt;h4 id="primeiro-episódio-1">Primeiro episódio:
&lt;/h4>&lt;p>Azure DevOps: Introdução (Como começar, administração, custos, etc) Azure Boards: Trabalhando com WorkItens e Processo de desenvolvimento&lt;/p>
&lt;h4 id="segundo-episódio-1">Segundo episódio:
&lt;/h4>&lt;p>Utilizando Azure Repos: Controle de versão&lt;/p>
&lt;h4 id="terceiro-episódio-1">Terceiro episódio:
&lt;/h4>&lt;p>Azure Pipelines: Criando seu primeiro pipeline de entrega&lt;/p>
&lt;h4 id="quarto-episódio">Quarto episódio:
&lt;/h4>&lt;p>Azure Test Plans: Testes integrados ao seu pipeline 
Azure Boards: Dashboards&lt;/p></description></item><item><title>How to send .Net Core NuGet packages to Azure Artifacts</title><link>http://www.wesleycamargo.com/p/how-to-send-.net-core-nuget-packages-to-azure-artifacts/</link><pubDate>Sat, 09 May 2020 04:49:34 +0200</pubDate><guid>http://www.wesleycamargo.com/p/how-to-send-.net-core-nuget-packages-to-azure-artifacts/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_oywzs4eXdLxxWk5u.png" alt="Featured image of post How to send .Net Core NuGet packages to Azure Artifacts" />&lt;h3 id="how-to-sendnet-core-nuget-packages-to-azure-artifacts">How to send .Net Core NuGet packages to Azure Artifacts
&lt;/h3>&lt;p>Learn how you can send .net core NuGet packages to Azure Artifacts.&lt;/p>
&lt;p>To increase reusability in our company, an interesting thing that we can consider is to share our packages. Using .net, both core or standard, you can consider NuGet as a package manager. The Azure DevOps has an implementation for a &lt;strong>NuGet as a Service&lt;/strong> named &lt;strong>Azure Artifacts&lt;/strong>.&lt;/p>
&lt;p>In this post, I’ll show you how to deploy manually a NuGet package step by step.&lt;/p>
&lt;p>Below are all commands used in this tutorial, but I’ll explain each one.&lt;/p>
&lt;p>Let’s get the hands dirty!&lt;/p>
&lt;h4 id="creating-and-configuring-an-application">Creating and configuring an application
&lt;/h4>&lt;p>To start, we need a .net core class library application. To do this, type on terminal:&lt;/p>
&lt;p>dotnet new classlibIt will create a basic project with a .csproj and one class. Rename the class to Math and put the code below on this:&lt;/p>
&lt;p>To send new packages, first, we need to configure a connection between our app and the feed that will be created. For now, we’ll add a nuget.config file in our project. On terminal type:&lt;/p>
&lt;p>dotnet new nugetconfigA file like this will be created:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_oywzs4eXdLxxWk5u.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>This is the standard NuGet feed, after create ours we will update this file.&lt;/p>
&lt;p>Now let’s package the project in a NuGet package using this command:&lt;/p>
&lt;p>dotnet packIt will create a nupkg file in the bin directory. We’ll use this later.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_83XEvUyH0uDKcUWR.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>The project it’s done, now let’s create the feed.&lt;/p>
&lt;h4 id="creating-a-new-artifact-feed-with-azure-artifacts">Creating a new artifact feed with Azure Artifacts
&lt;/h4>&lt;p>Access your Azure DevOps account and follow the steps:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_EXzq8-qaE0Ac_ts2.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_vkeAqTVvYmVduEBd.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>On the next screen click on Connect to feed:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_9izcpWYFJoem9d1H.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_v8PKHzfxVPp0xt3g.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Here is the connection information necessary to connect our app with the feed. Copy the Project setup content and update the value of the nuget.config created before.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/how-to-sendanet-core-nuget-packages-to-azure-artifacts/0_egn74caQQW8ObuXS.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="connecting-tofeed">Connecting to feed
&lt;/h4>&lt;p>To make the connection, we need to download and install a connection provider. Save the content below in a file and run:&lt;/p>
&lt;p>After installing the credential provider, we can authenticate with Azure DevOps. In the previous section in Publish packages, it’s given to you command with your connection information, add the parameter &lt;strong>interactive&lt;/strong>. It will be used to start a new browser session and do the authentication. Without this parameter, the command won’t work.&lt;/p>
&lt;p>dotnet nuget push .\bin\Debug\NugetPackage.1.0.0.nupkg &amp;ndash;source &amp;ldquo;MeuFeed&amp;rdquo; &amp;ndash;api-key teste &amp;ndash;interactiveIt will be provided a URL and code, open the URL in the browser, and paste the code there.&lt;/p></description></item><item><title>Enviando pacotes Nuget .Net Core para o Azure Artifacts</title><link>http://www.wesleycamargo.com/p/enviando-pacotes-nuget-.net-core-para-o-azure-artifacts/</link><pubDate>Fri, 08 May 2020 00:40:29 +0200</pubDate><guid>http://www.wesleycamargo.com/p/enviando-pacotes-nuget-.net-core-para-o-azure-artifacts/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_IBa82AI5wwkn7GyNuVf4lw.png" alt="Featured image of post Enviando pacotes Nuget .Net Core para o Azure Artifacts" />&lt;h3 id="enviando-pacotes-nugetnet-core-para-o-azure-artifacts">Enviando pacotes Nuget .Net Core para o Azure Artifacts
&lt;/h3>&lt;p>Aprenda como publicar packages nuget no Azure Artifacts!&lt;/p>
&lt;p>Para podermos ter maior reusabilidade dentro de nossa empresa, é interessante a utilização de pacotes compartilhados. No caso do .net, tanto core como standart utilizam o Nuget como Gerenciador de pacotes.&lt;/p>
&lt;p>Nesse post irei ensinar passo a passo para realizar a publicação manual de um pacote nuget.&lt;/p>
&lt;p>Ao longo do post irei detalhar cada um deles, mas abaixo estão todos os comandos executados no terminal:&lt;/p>
&lt;p>Agora vamos botar a mão na massa!&lt;/p>
&lt;h4 id="criando-e-configurando-a-aplicação">Criando e configurando a aplicação
&lt;/h4>&lt;p>Vamos iniciar criando uma aplicação do tipo class library no .net core. Para isso digite no terminal (se você não tem familiaridade com o .net core &lt;a class="link" href="https://medium.com/@camargo.wes/criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650" target="_blank" rel="noopener"
>nesse post&lt;/a> ensino como criar uma aplicação web no VS Code):&lt;/p>
&lt;p>dotnet new classlibO projeto criado é bem básico, possuindo apenas um .csproj e uma classe. Renomeie a classe para Math e adicione o código abaixo:&lt;/p>
&lt;p>Vamos empacotar o projeto em um nuget package executando o comando:&lt;/p>
&lt;p>dotnet packSerá criado um arquivo nupkg na pasta bin. Usaremos ele mais tarde.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_IBa82AI5wwkn7GyNuVf4lw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Para enviar novos pacotes precisamos realizar a conexão da nossa aplicação com o feed que vamos criar. Vamos então adicionar um arquivo nuget.config em nosso projeto. No terminal digite:&lt;/p>
&lt;p>dotnet new nugetconfigSerá criado um arquivo em nosso projeto como este:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_WmvMZY1rk6UHFa3sTIp-dQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>O feed configurado é o padrão, para adicionar as configurações do nosso feed, vamos criá-lo e obter as conexões.&lt;/p>
&lt;h4 id="criando-o-feed-de-artefatos-no-azure-artifacts">Criando o feed de artefatos no Azure Artifacts
&lt;/h4>&lt;p>Acesse sua conta do Azure DevOps e siga os passos abaixo:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_pqzB4BtIR_fJZXV3Guv6BA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_FDgHA8bxqbOuQvbLXAIOOg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Na tela que irá aparecer clique em Connect to feed:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_59mH-OrThLhu6a8MZe3SDQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_srWBBdJZy5XlebE27MuQyA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Aqui estão as informações de conexão que iremos utilizar. Copie o conteúdo de Project setup e substitua o valor do arquivo nuget.config que criamos.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/enviando-pacotes-nugetanet-core-para-o-azure-artifacts/1_dQIXu0zg95Qtpn2EfuEMyA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="conectando-aofeed">Conectando ao feed
&lt;/h4>&lt;p>Para realizar a conexão, precisamos baixar um provider. Para isso abre uma nova janela no VS Code e copie o conteúdo do arquivo abaixo salvando como CredentialProvider.ps1 e execute:&lt;/p>
&lt;p>Agora que foi instalado o Credential Provider vamos conseguir autenticar no Azure DevOps. Na seção anterior em Publish packages é disponibilizado um comando copie ele e não se esqueça de adicionar o parâmetro &lt;strong>interactive&lt;/strong>. Ele serve para iniciar uma sessão no browser e realizar a autenticação. Sem ele o comando não irá funcionar.&lt;/p>
&lt;p>dotnet nuget push .\bin\Debug\NugetPackage.1.0.0.nupkg &amp;ndash;source &amp;ldquo;MeuFeed&amp;rdquo; &amp;ndash;api-key teste &amp;ndash;interactiveCopie e abra no browser a URL que será fornecida e copie o código:&lt;/p></description></item><item><title>Pessoas - A parte mais complexa do DevOps</title><link>http://www.wesleycamargo.com/p/pessoas-a-parte-mais-complexa-do-devops/</link><pubDate>Tue, 05 May 2020 19:11:47 +0200</pubDate><guid>http://www.wesleycamargo.com/p/pessoas-a-parte-mais-complexa-do-devops/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/pessoas-a-parte-mais-complexa-do-devops/0_Taa63z60tEhceJBY.png" alt="Featured image of post Pessoas - A parte mais complexa do DevOps" />&lt;h4 id="como-tornar-sua-equipe-mais-eficiente">Como tornar sua equipe mais eficiente
&lt;/h4>&lt;h3 id="por-que-pessoas-são-a-parte-mais-complexa-dodevops">Por que pessoas são a parte mais complexa do DevOps?
&lt;/h3>&lt;p>Pessoas é** **um dos três pilares do DevOps e frequentemente é o que apresenta maior dificuldade para que o resultado seja alcançado dentro das empresas. Mas por que isso ocorre e o que não adotar de DevOps pode causar?&lt;/p>
&lt;h4 id="equipes-separadas-objetivos-diferentes">Equipes separadas, objetivos diferentes
&lt;/h4>&lt;p>Quem já trabalhou em empresas que ainda não implementam DevOps, já deve ter presenciado algumas situação em que as equipes de desenvolvimento e infraestrutura se comportam como rivais. Isso acontece pois as equipes estão divididas em &lt;strong>Silos&lt;/strong>, e cada um desses silos possuem objetivos diferentes:&lt;/p>
&lt;ul>
&lt;li>**Desenvolvimento **normalmente é cobrada por entregar software cada vez mais rápido para atender as demandas de mercado.&lt;/li>
&lt;li>**Infraestrutura **tem a responsabilidade de manter a casa em ordem, com todas as aplicações estáveis, confiáveis e seguras para o cliente.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/pessoas-a-parte-mais-complexa-do-devops/0_Taa63z60tEhceJBY.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Com silos possuindo objetivos opostos, cada equipe irá trabalhar para cumprir seu objetivo, o que ajuda a explicar o sentimento de rivalidade entre as equipes.&lt;/p>
&lt;p>Essa rivalidade é maléfica para o time. As pessoas em ambos os lados se sentem &lt;strong>desmotivadas&lt;/strong>, &lt;strong>sem o controle de seus próprios resultados&lt;/strong>, pois seu objetivo nunca pode ser cumprido sem ter que entrar em algum conflito com uma área que possui um objetivo diferente. Esse desgaste e desmotivação a longo prazo, faz os profissionais procurem ambientes mais sadios e com melhores condições, fazendo com que as empresas &lt;strong>percam os melhores profissionais&lt;/strong>.&lt;/p>
&lt;p>Além dos resultados ruins com as pessoas, a empresa também perde. Começam a aparecer os famosos “jeitinhos” para não depender da outra área, não são respeitados processos e etapas essenciais são menosprezadas. Esse tipo de comportamento pode causar falhas de comunicação, testes inadequados e culminar com maior quantidade de erros e redução na velocidade de entrega, o que &lt;strong>ironicamente&lt;/strong> &lt;strong>compromete o objetivo de ambas as áreas.&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Não implementar&lt;/strong> novas versões mantém o ambiente estável, porém, &lt;strong>a&lt;/strong> &lt;strong>rapidez o que o mercado exige não é alcançada.&lt;/strong>
Por outro lado, implementar com mais frequência, significa &lt;strong>mais código sendo entregue&lt;/strong>, o que também significa que **mais comportamentos inesperados podem aparecer em produção **devido a proporção ser maior.&lt;/p></description></item><item><title>Criando um pipeline de CI/CD usando GitHub Actions</title><link>http://www.wesleycamargo.com/p/criando-um-pipeline-de-ci/cd-usando-github-actions/</link><pubDate>Sat, 02 May 2020 02:02:18 +0200</pubDate><guid>http://www.wesleycamargo.com/p/criando-um-pipeline-de-ci/cd-usando-github-actions/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_ui0WEO_7OKSGgN2M9PbE4A.png" alt="Featured image of post Criando um pipeline de CI/CD usando GitHub Actions" />&lt;h3 id="criando-um-pipeline-de-cicd-usando-githubactions">Criando um pipeline de CI/CD usando GitHub Actions
&lt;/h3>&lt;p>Nesse post vou demonstrar como criar uma aplicação DotNet core, versionar no GitHub, criar um workflow usando Actions e realizar deploy no Azure.&lt;/p>
&lt;p>Para acompanhar esse tutorial, você vai precisar de:&lt;/p>
&lt;ul>
&lt;li>Visual Studio Code - Pode ser baixado &lt;a class="link" href="https://code.visualstudio.com/download" target="_blank" rel="noopener"
>aqui&lt;/a>&lt;/li>
&lt;li>DotNet Core SDK - Pode ser baixado &lt;a class="link" href="https://dotnet.microsoft.com/download" target="_blank" rel="noopener"
>aqui&lt;/a>&lt;/li>
&lt;li>Uma conta no GitHub&lt;/li>
&lt;li>Uma conta no Azure&lt;/li>
&lt;/ul>
&lt;p>Todos os comandos realizados localmente estão no arquivo abaixo, mas irei explica-los um a um no decorrer do post&lt;/p>
&lt;h3 id="criando-a-aplicação">Criando a aplicação
&lt;/h3>&lt;p>Após cumpridos os pré reqs, abra o VS Code, vá em Open folder e selecione uma pasta vazia para criarmos o projeto:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_ui0WEO_7OKSGgN2M9PbE4A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora vá no menu superior vá em **Terminal **-&amp;gt; **New Terminal **ou pressione &lt;em>ctrl + ‘,isso irá abrir um terminal na parte inferior da tela. Para verificar a versão do sdk instalada clique nele e digite:&lt;/em>&lt;/p>
&lt;p>dotnet &amp;ndash;version&lt;em>No meu caso estou utilizando a versão 3.1.201, caso tenha algum problema durante a execução do tutorial e esteja utilizando uma versão diferente, utilizar essa versão pode te ajudar.&lt;/em>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1__AAY-oPkIg9HbrwnsizM1A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora para criarmos o projeto digite&lt;/p>
&lt;p>dotnet new webappEsse comando irá criar a estrutura da nossa aplicação que nada mais é que um site web baseado em MVC:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_WsYhHE1qwFyFqYPkK4QQbA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Repare que serão criados alguns arquivos na pasta que selecionamos no início. Eles podem ser vistos no menu Explorer ao lado esquerdo da tela&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_7qaqJxH-XhLcJ7imGQjFnQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Para verificar se tudo está ok com a aplicação, digite no terminal&lt;/p>
&lt;p>dotnet runIsso irá compilar e iniciar a aplicação. Aqui também pode ser verificado em qual porta está rodando e acessar para testar&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_KRkXlY-zDc8Y3KFVqLac2A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_Yoclb52yTys4elRfRX_NpA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora que temos uma aplicação rodando, podemos seguir para a etapa de versionamento.&lt;/p>
&lt;p>Para mais informações sobre comandos do dotnet core veja o conteúdo deste link &lt;a class="link" href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" target="_blank" rel="noopener"
>https://docs.microsoft.com/pt-br/dotnet/core/tools/&lt;/a>&lt;/p>
&lt;h3 id="adicionando-ao-github--controle-deversão">Adicionando ao GitHub / controle de versão
&lt;/h3>&lt;p>Antes de enviar nosso código ao GitHub, primeiro precisamos versionar localmente. Antes de realizar esse versionamento, vamos criar um arquivo chamado &lt;em>.gitignore&lt;/em>, onde iremos informar ao git, quais arquivos não queremos que sejam enviados, como binários por exemplo. O próprio dotnet Core possui um template pronto, onde automaticamente são adicionados os arquivos que não queremos versionar. No terminal digite:&lt;/p>
&lt;p>dotnet new gitignore&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_890wNaAHuUov2HuWgO-GMA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_MZv9nGPc9QVfguqERWvPHg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;ol>
&lt;li>Inicializando nosso repositório e adicionando todos os nossos arquivos para a área de staging.&lt;/li>
&lt;/ol>
&lt;p>git init&lt;/p>
&lt;p>&lt;code>ash git add . git status &lt;/code>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_3pibD-rKZP1PS1xljNecaQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_cRNA_rHAGGtS7UaFS_no9g.png"
loading="lazy"
alt="Image"
>
Realizando commit das alterações&lt;/p>
&lt;p>git commit -m &amp;ldquo;commit inicial&amp;rdquo;&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_HVKSn9IVa6DSs-r3BaU0Sw.png"
loading="lazy"
alt="Image"
>
Até agora todas as operações que realizamos foram locais. Para enviarmos o código para o GitHub, primeiro precisamos criar um repositório. Acesse sua conta no GitHub e siga os passos abaixo:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_HIljyNTqWb0jVrH3qQrgfg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_K4JZxUpaEpX6datV035Taw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Como já temos um repositório criado, copie o código da opção abaixo, cole e execute no terminal:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_t746pMFDe4DWlKE1faIoGQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>git remote add origin &lt;a class="link" href="https://github.com/wesleycamargo/Pipeline-CICD.git" target="_blank" rel="noopener"
>https://github.com/wesleycamargo/Pipeline-CICD.git&lt;/a>
git push -u origin master&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_Y3JwSEl19oSZZ-lM3OvteA.png"
loading="lazy"
alt="Image"
>
Ao atualizar a página do repositório nosso código já estará lá&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_5efmdYAQl8YQiFN28POzoA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="criando-action-deci">Criando Action de CI
&lt;/h3>&lt;p>Na tela anterior clique em Actions, o GitHub deverá identificar que o código da aplicação foi escrito em .NET Core e irá sugerir um template de workflow. Pode selecioná-lo:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_ywXMxJH3-1_g0QjONb_dRg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Na tela seguinte será apresentado um arquivo .yml. Nesse momento vamos mante-lo assim, realizando o commit na branch master:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_knrDZXqVK36ev1z3G0tZNQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_4gjYy7uBYpbqgLzEyz1q7Q.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Será criada uma pasta .github/workflows no seu repositório, nela será adicionado um arquivo com o conteúdo abaixo:&lt;/p>
&lt;p>Agora você será redirecionado para a parte de código. Clique novamente em Actions e você irá notar que foi criado um workflow e ele já foi iniciado automaticamente. Clique no evento que foi acionado e no build conforme as imagens:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_dz7AYBXgKaNs4oFZNTcjlA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_3U66s-lKGpwX3IhBfTWk4g.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Observe que é possível visualizar o log da execução do build.&lt;/p>
&lt;p>Já temos um build realizando a Continuous Integration(CI) de nossa aplicação.&lt;/p>
&lt;h3 id="adicionando-azure-web-app-publish-profile-aogithub">Adicionando Azure Web App Publish Profile ao GitHub
&lt;/h3>&lt;p>Vá a um Web App já existente no portal do Azure e clique em Get publish profile.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_3majHLs0wenSKihXcJz1_g.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Será realizado o download de um arquivo com a extensão .PublishSettings. Copie o conteúdo dele.&lt;/p>
&lt;p>No GitHub, vá às configurações para adicionar como Secret:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_NcJ8M45gPkf_Gri9_b6xCA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Nomeie como AZURE_WEBAPP_PUBLISH_PROFILE e em value adicione o conteúdo do arquivo .PublishSettings&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_4F2kuZv5VPXAyrfKlY5PLA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="publicando-a-aplicação-noazure">Publicando a aplicação no Azure
&lt;/h3>&lt;p>Para configurar o Continuous Delivery(CD) vamos realizar algumas alterações no arquivo yml. Eu acho um pouco difícil editar pela página web, então vou realizar um pull do meu repositório local e editar no VS Code, mas você pode fazer onde for melhor para você =).&lt;/p>
&lt;p>Primeiro vamos substituir o código anterior por um código mais enxuto e com uma nova função: *publish. *Vamos adicionar também uma task para realizar o upload dos artefatos gerados:&lt;/p>
&lt;p>Aqui também adicionamos variáveis de ambiente para nossa aplicação. Altere os valores de WebApp_Name e DotNet_Version para os valores de acordo com seu ambiente:&lt;/p>
&lt;p>env:
AZURE_WEBAPP_NAME: webAppAction-wes
AZURE_WEBAPP_PACKAGE_PATH: &amp;lsquo;.&amp;rsquo;
DOTNET_VERSION: &amp;lsquo;3.1.201&amp;rsquo;Com a task para realizar o upload dos artefatos, podemos notar que após executar o build podemos baixá-los:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_8yVX7O0LWDqV-I0JkRPl_w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Ao final sua aplicação estará publicada em seu WebApp:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/criando-um-pipeline-de-cicd-usando-github-actions/1_qNyToH28zHlXZfy3uUravA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Vou deixar aqui o link do repositório caso queiram visualizar: &lt;a class="link" href="https://github.com/wesleycamargo/Pipeline-CICD" target="_blank" rel="noopener"
>https://github.com/wesleycamargo/Pipeline-CICD&lt;/a>&lt;/p>
&lt;p>Valeu!&lt;/p></description></item><item><title>O que é Automação de Configuração e por que devo utilizar</title><link>http://www.wesleycamargo.com/p/o-que-%C3%A9-automa%C3%A7%C3%A3o-de-configura%C3%A7%C3%A3o-e-por-que-devo-utilizar/</link><pubDate>Sat, 25 Apr 2020 23:14:58 +0200</pubDate><guid>http://www.wesleycamargo.com/p/o-que-%C3%A9-automa%C3%A7%C3%A3o-de-configura%C3%A7%C3%A3o-e-por-que-devo-utilizar/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/o-que-automaao-de-configuraao-e-por-que-devo-utilizar/1_9pQikZFibQWVP6-zugbKWg.png" alt="Featured image of post O que é Automação de Configuração e por que devo utilizar" />&lt;h3 id="o-que-é-automação-de-configuração-e-por-que-devoutilizar">O que é Automação de Configuração e por que devo utilizar
&lt;/h3>&lt;h4 id="se-acidentalmente-alguém-destruir-seu-ambiente-de-produção-agora-quanto-tempo-você-gastaria-para-deixar-tudo-funcionando-novamente">Se acidentalmente alguém destruir seu ambiente de produção agora, quanto tempo você gastaria para deixar tudo funcionando novamente?
&lt;/h4>&lt;p>Automação de configuração ou Continuous Configuration Automation (CCA) é um tipo de ferramenta de IaC que após o provisionamento dos recursos irão garantir que todas as configurações necessárias para que a aplicação funcione estão instaladas e configuradas corretamente no nosso ambiente.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/o-que-automaao-de-configuraao-e-por-que-devo-utilizar/1_9pQikZFibQWVP6-zugbKWg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>No mundo de DevOps é muito comum ouvirmos falar sobre Infraestrutura como código (IaC), que nada mais é que provisionar a infraestrutura de nossas aplicações através de arquivos que são tratados da mesma forma que o código fonte.&lt;/p>
&lt;p>Basicamente Infra as Code possui 2 tipos de ferramentas:&lt;/p>
&lt;ul>
&lt;li>**Provisionamento de recursos **- nessa categoria estão ferramentas que criam os recursos de infraestrutura que serão utilizados por nossas aplicações. 
Entre as ferramentas mais conhecidas estão: &lt;strong>AWS Cloud Formation&lt;/strong>, &lt;strong>ARM Templates&lt;/strong> e talvez a mais conhecida de todos, o &lt;strong>Terraform&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Continuous Configuration Automation (CCA) ou Configuração de ambientes&lt;/strong> - aqui estão ferramentas, como mencionado acima, que após a criação dos recursos irão garantir que todas as configurações necessárias para que a aplicação funcionem estejam de acordo com o especificado. Exemplos dessas configurações são, garantir que portas de firewall estejam liberadas, outros softwares que minha aplicação tenha dependência estejam instalados, servidores de aplicação onde minha aplicação irá rodar esteja com a versão correta do framework utilizado, permissões de acesso, entre todas as outras configurações necessárias para nosso ambiente.
Aqui estão alguns exemplos dessas ferramentas: &lt;strong>Chef&lt;/strong>, &lt;strong>Puppet&lt;/strong>, &lt;strong>Powershell DSC&lt;/strong>, &lt;strong>Ansible&lt;/strong> entre vários outros. Aqui neste artigo demonstro a utilização básica do &lt;a class="link" href="https://medium.com/@camargo.wes/criando-um-dsc-b%C3%A1sico-9b0a694b8e12" target="_blank" rel="noopener"
>Powershell DSC&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Em algumas ferramentas é possível realizar as duas tarefas sendo assim você pode utilizar apenas uma, porém, sempre haverá especialização em uma das duas categorias (provisionamento ou configuração), o que pode dar um pouco mais de trabalho para a implementação na categoria menos especializada. Nesse caso deve ser avaliado o custo benefício de implementação vs valores gastos com licenças, por exemplo.&lt;/p>
&lt;h3 id="mas-por-que-eu-precisodisso">Mas por que eu preciso disso?
&lt;/h3>&lt;p>Acredito que hoje, 99% das as empresas devem utilizar algum tipo de controle de versão para manter seu software (se não está utilizando é melhor pensar nisso imediatamente!), entretanto, em grande parte esses sistemas são utilizados apenas para versionamento de código fonte, quando deveria englobar todos os artefatos necessários para recriar seus binários e ambientes.&lt;/p>
&lt;h4 id="criar-o-ambiente-da-aplicação-à-qualquermomento">&lt;strong>Criar o ambiente da aplicação à qualquer momento&lt;/strong>
&lt;/h4>&lt;p>Para que em uma emergência seja possível recriar nosso ambiente com o mínimo de esforço, um dos princípios de DevOps é que devemos manter absolutamente &lt;strong>TUDO&lt;/strong> que seja necessário para criarmos uma versão de nossa aplicação do zero em um sistema de &lt;strong>Controle de Versão&lt;/strong>&lt;/p>
&lt;p>Eu já presenciei essa experiência por duas vezes (não foi minha culpa heheh), e em ambas boa parte dos recursos estavam sim versionados, mas alguns como configurações de aplicação, regras de DNS, e alguns outros itens infelizmente não. A maior parte foi configurada razoavelmente rápido, mas por algumas semanas fomos descobrindo alguns itens de configuração que faltavam ou estavam incorretos.&lt;/p>
&lt;h4 id="ambientes-de-desenvolvimentos-padronizados">Ambientes de desenvolvimentos padronizados
&lt;/h4>&lt;p>Acredito que todos na área de TI já ouviram a famosa frase &lt;strong>“Na minha máquina funciona”&lt;/strong>.&lt;/p>
&lt;p>Outra vantagem será garantir que &lt;strong>todos os desenvolvedores utilizam um ambiente idêntico&lt;/strong>, com todas as dependências instaladas e configurações realizadas. Caso isso não seja implementado, poderá causar problemas como por exemplo, desenvolvedores utilizando versões diferentes de um framework, e ao juntar suas alterações ocorrerem conflitos que precisarão ser corrigidos, ou até mesmo alguma dependência de software que existe apenas no ambiente do desenvolvedor.&lt;/p>
&lt;h4 id="controle-das-alterações-realizadas-nos-ambientes">Controle das alterações realizadas nos ambientes
&lt;/h4>&lt;p>Com o versionamento das definições de configurações dos ambientes em arquivos armazenados em um **Sistemas de Controle de Versão **todas as alterações podem ser iniciadas através de alterações nos arquivos e enviadas ao SCV, o que nos fornece um &lt;strong>registro de todas as mudanças realizadas no ambiente&lt;/strong> e remove a necessidade de acessar algum servidor para realizar alterações, já que todo o processo será realizado de forma automática, garantindo padronização dos ambientes.&lt;/p></description></item><item><title>Criando um DSC básico</title><link>http://www.wesleycamargo.com/p/criando-um-dsc-b%C3%A1sico/</link><pubDate>Fri, 24 Apr 2020 22:54:25 +0200</pubDate><guid>http://www.wesleycamargo.com/p/criando-um-dsc-b%C3%A1sico/</guid><description>&lt;h3 id="continuous-configuration-automation-criando-um-arquivo-dscbásico">Continuous Configuration Automation— Criando um arquivo DSC básico
&lt;/h3>&lt;p>Estou apoiando na implementação de Powershell DSC em um cliente, e sempre preciso de alguma referência para executar algumas operações.&lt;/p>
&lt;p>Nesse primeiro post está um arquivo bem básico para ser utilizado como referência:&lt;/p></description></item><item><title>DevOps substitui os métodos Ágeis - Mitos de DevOps</title><link>http://www.wesleycamargo.com/p/devops-substitui-os-m%C3%A9todos-%C3%A1geis-mitos-de-devops/</link><pubDate>Sun, 22 Mar 2020 17:29:00 +0100</pubDate><guid>http://www.wesleycamargo.com/p/devops-substitui-os-m%C3%A9todos-%C3%A1geis-mitos-de-devops/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/devops-substitui-os-mtodos-geis-mitos-de-devops/0_b2a6QQ43p1DsN-jz.png" alt="Featured image of post DevOps substitui os métodos Ágeis - Mitos de DevOps" />&lt;h3 id="devops-substitui-os-métodos-ágeis---mitos-dedevops">DevOps substitui os métodos Ágeis - Mitos de DevOps
&lt;/h3>&lt;p>Tanto DevOps quanto desenvolvimento ágil se aplicam ao desenvolvimento de software visando melhorar a qualidade e velocidade de entrega de software, ou valor, para o usuário final, apesar disso, possuem maneiras de atuação diferentes.&lt;/p>
&lt;p>Todo mundo que trabalha na área de TI já deve ter ouvido sobre o famoso manifesto ágil. De maneira resumida, nos início dos anos 2000, um grupo de desenvolvedores se reuniu em Utah nos Estados Unidos, cada um já adotando algum método de desenvolvimento, mas em comum todos esses métodos compartilhavam dos mesmos fundamentos.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/devops-substitui-os-mtodos-geis-mitos-de-devops/0_b2a6QQ43p1DsN-jz.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Na minha opinião, a melhor definição de DevOps é uma cultura que combina &lt;strong>ferramentas&lt;/strong>, &lt;strong>pessoas&lt;/strong> e &lt;strong>processos&lt;/strong>, para aumentar a velocidade de entrega de valor, não necessáriamente software, para o cliente. Enquanto Ágil é considerado uma metodologia de desenvolvimento onde devemos ter feedback o mais cedo possível para que possamos melhorar continuamente, portanto, poderia se enquadrar como parte do &lt;strong>processo&lt;/strong> de DevOps.&lt;/p>
&lt;p>É muito comum vermos nas empresas a combinação de ambos para que alcancem seus objetivos, pois eles se complementam. Isso pode ser feito com uma combinação de desenvolvimento ágil com outras práticas como versionamento de código, automação de build e releases, aprovações de releases automatizadas, etc (apesar de DevOps não ser apenas automação, já falei sobre isso &lt;a class="link" href="https://medium.com/@camargo.wes/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops-5063e0aa8ff9" target="_blank" rel="noopener"
>nesse artigo&lt;/a>). Inclusive as práticas de DevOps ajudam a fornecer esse feedback rápido para o desenvolvedor, como a utilização de validações de integração de código com builds automatizadas, por exemplo.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/devops-substitui-os-mtodos-geis-mitos-de-devops/1_jIeajBIHkQlA2OHiCFZMzw.jpeg"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h4 id="mas-não-consigo-realizar-as-entregas-só-comágil">Mas não consigo realizar as entregas só com ágil?
&lt;/h4>&lt;p>Um dos princípios do manifesto ágil, é a entrega de software potencialmente “entregável”. Mas potencialmente entregável, não quer dizer implantado em produção… 🤔&lt;/p>
&lt;p>A utilização de DevOps seria o complemento para que o valor gerado pelo desenvolvimento ágil chegue até o usuário final de uma maneira mais rápida e confiável, promovendo a integração das equipes, pois se as boas práticas forem seguidas, seu software já pode ser publicado em um ambiente real desde o início, evitando surpresas e retrabalhos ao final de uma iteração. Pode até mesmo ser considerado o fim da famosa frase “Na minha máquina funciona!”&lt;/p></description></item><item><title>DevOps é Automação - Mitos de DevOps</title><link>http://www.wesleycamargo.com/p/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops/</link><pubDate>Fri, 20 Mar 2020 03:32:22 +0100</pubDate><guid>http://www.wesleycamargo.com/p/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/devops-automaao-mitos-de-devops/1_EI0H1iSfOK-JoTJJc5cE1w.png" alt="Featured image of post DevOps é Automação - Mitos de DevOps" />&lt;h3 id="devops-é-automação---mitos-dedevops">DevOps é Automação - Mitos de DevOps
&lt;/h3>&lt;p>Existem muitos benefícios de realizar as automações das etapas de nosso processo, como por exemplo, a redução do tempo de implantação uma release de 1 hora para 5 minutos. Conseguimos &lt;strong>economizar 55 minutos de tempo de deploy!&lt;/strong>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/devops-automaao-mitos-de-devops/1_EI0H1iSfOK-JoTJJc5cE1w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Mas pode ser que seu processo tenha um gargalo e seu software fique &lt;strong>1 semana aguardando uma aprovação&lt;/strong>.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/devops-automaao-mitos-de-devops/1_wpk0Cna1maqtuK4Q5e0s_w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Infelizmente, esses 55 minutos economizados, &lt;strong>se tornam praticamente irrelevantes se comparados à 1 semana aguardando aprovação&lt;/strong>. Seria mais eficiente entender o motivo de uma aprovação demorar dias ou semanas e então trabalhar para reduzir esse tempo.&lt;/p>
&lt;p>No livro “DevOps Handbook”, os autores chegam a uma conclusão em que sou obrigado a concordar com eles: Uma quantidade significativa dos problemas das empresas são os mesmos, e as soluções provavelmente também são as mesmas!&lt;/p>
&lt;p>Mas se as soluções para os problemas são conhecidos, por que não as utilizamos?&lt;/p>
&lt;p>Nessa série de artigos baseados no livro, irei descrever alguns mitos que fazem com que essas soluções sejam ignoradas, e os problemas continuem lá, esperando para serem resolvidos.&lt;/p>
&lt;h3 id="devops-é-apenas-automação">DevOps é apenas Automação?
&lt;/h3>&lt;p>Quem nunca ouviu em alguma empresa ou cliente as pessoas dizerem: “Temos DevOps, fazemos todo o deploy de nosso sistemas de forma automática!” ?&lt;/p>
&lt;p>É verdade que muitas práticas e padrões utilizados na cultura DevOps possuem sim processos de automação. Entre eles os mais comuns são Build, Deploy e Testes.&lt;/p>
&lt;p>Entretanto, DevOps vai muito além disso! Para conseguirmos implantar o conjunto de práticas de maneira eficiente devemos considerar entre outros, os itens descritos nesse post: &lt;a class="link" href="https://medium.com/@camargo.wes/o-que-%C3%A9-devops-56f9a7ece1f5" target="_blank" rel="noopener"
>O que é DevOps?&lt;/a>&lt;/p>
&lt;h4 id="então-não-devo-automatizar">Então não devo automatizar?
&lt;/h4>&lt;p>Sim, &lt;strong>você deve&lt;/strong> continuar automatizando tudo que for possível dentro do seu processo: build, release, testes, ambientes, pipelines, porém não deve considerar apenas isso como DevOps.&lt;/p>
&lt;p>Espero ter conseguido dar uma perspectiva um pouco diferente para que todos que tinham essa visão de que DevOps é apenas Automação, consigam explorar todo esse universo.&lt;/p>
&lt;p>Até a próxima!&lt;/p>
&lt;p>Referencias:&lt;/p>
&lt;p>&lt;a class="link" href="https://www.amazon.com.br/DevOps-Handbook-World-Class-Reliability-Organizations-ebook/dp/B01M9ASFQ3/ref=sr_1_2?adgrpid=61528803804&amp;amp;gclid=CjwKCAjwsMzzBRACEiwAx4lLG0XDW0RBvc710sIXI80OfSxf6_mkBhZn7MW-SQP5fUkNnnEY0pWj1xoCGDUQAvD_BwE&amp;amp;hvadid=326935150244&amp;amp;hvdev=c&amp;amp;hvlocphy=1001773&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=12684604304342698395&amp;amp;hvtargid=kwd-465145704369&amp;amp;hydadcr=5626_10696887&amp;amp;keywords=manual&amp;#43;de&amp;#43;devops&amp;amp;qid=1584669906&amp;amp;sr=8-2" target="_blank" rel="noopener"
>DevOps Handbook&lt;/a>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/devops-automaao-mitos-de-devops/0_YOTWkzlSypfHqo09.jpg"
loading="lazy"
alt="Image"
>&lt;/p></description></item><item><title>Como criar uma conta no Azure DevOps</title><link>http://www.wesleycamargo.com/p/como-criar-uma-conta-no-azure-devops/</link><pubDate>Mon, 27 Jan 2020 14:00:32 +0100</pubDate><guid>http://www.wesleycamargo.com/p/como-criar-uma-conta-no-azure-devops/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_zEidCQ--naWxnUjYattZ3A.png" alt="Featured image of post Como criar uma conta no Azure DevOps" />&lt;h3 id="como-criar-uma-conta-no-azuredevops">Como criar uma conta no Azure DevOps
&lt;/h3>&lt;p>Olá pessoal, irei ensinar a vocês como criar uma conta gratuita no Azure DevOps, vamos ao passo a passo:&lt;/p>
&lt;p>Acesse o site &lt;a class="link" href="https://dev.azure.com" target="_blank" rel="noopener"
>https://dev.azure.com&lt;/a> e clique no botão Start free:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_zEidCQ--naWxnUjYattZ3A.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Existem 3 opções principais:&lt;/p>
&lt;ul>
&lt;li>Acessar como uma conta Microsoft existente (email @outlook, @hotmail, etc)&lt;/li>
&lt;li>Criar uma nova conta&lt;/li>
&lt;li>Acessar com uma conta do GitHub&lt;/li>
&lt;/ul>
&lt;p>Vamos criar uma nova conta, mas caso você já possua uma conta no Github também poderá utilizar.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_oyShPMvn8Y7WQ5ZYMDF6Nw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Se você possuir uma conta Microsoft (outlook, hotmail, msn) poderá inserir aqui, caso não possua clique na opção para criar uma nova conta de email:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_6hWFOG0kO-yr2ndXQUDsfA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Insira um novo email que esteja disponível:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_7b1Irktv99Nl7prnysZoFQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Insira sua senha:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_UN6-SVfRJaLM2jNVyRqH0w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Em região escolha Brazil:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_N_iO-6UDYRVqYCWCyo4g3w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Nesse momento sua conta será criada, aguarde alguns instantes enquanto esse processo é realizado:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_sjQ3hXrGfbHnlrcdCWEZGQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Sua conta já está criada!&lt;/p>
&lt;p>Agora precisamos criar um Team Project. Ele pode ser o nome da sua equipe, seu produto, ou o que fizer mais sentido para o seu projeto. Aqui podemos nomea-lo como “Projetos”&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_hov9Q2jrWyu04XlPuMyhJw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora seu Azure DevOps está pronto para ser utilizado!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/como-criar-uma-conta-no-azure-devops/1_SkeetDjdL7XA_JAbfSf90w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Esse é o setup básico, como disse acima existem outras opções, mas ao final todas irão criar sua organização no Azure DevOps!&lt;/p></description></item><item><title>Conectando WebApps a redes existentes</title><link>http://www.wesleycamargo.com/p/conectando-webapps-a-redes-existentes/</link><pubDate>Sun, 05 Aug 2018 00:38:24 +0200</pubDate><guid>http://www.wesleycamargo.com/p/conectando-webapps-a-redes-existentes/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_ooxS-JBEtmGsvRK8CnOofQ.png" alt="Featured image of post Conectando WebApps a redes existentes" />&lt;h3 id="conectando-webapps-a-redes-existentes">Conectando WebApps a redes existentes
&lt;/h3>&lt;p>Em algumas situações quando utilizamos WebApps pode ser necessária a comunicação com algum recurso já existente em nossa rede, como por exemplo um banco de dados IaaS, uma API, ou até mesmo um outro WebApp.&lt;/p>
&lt;p>A maneira mais simples de realizar essa comunicação é através da internet, mas, apesar de ser mais fácil isso pode expor sua aplicação a vários riscos de segurança, como invasões, roubos de dados, etc.&lt;/p>
&lt;p>Para solucionar esse problema, o Microsoft Azure possui um recurso chamado VNet Integration, que permite a conexão de um WebApp a uma rede existente.&lt;/p>
&lt;p>Agora irei demonstrar como realizar a conexão:&lt;/p>
&lt;h3 id="criando-a-virtual-networkvnet">Criando a Virtual Network (VNet)
&lt;/h3>&lt;p>Se você já possuir uma VNet pode pular para a próxima etapa. Para a criação não existem muitos segredos, a VNet pode seguir as configurações padrão sugeridas:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_ooxS-JBEtmGsvRK8CnOofQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Após a criação da VNet, precisamos criar um VNet Gateway, que será utilizado para realizar uma conexão VPN Point to Site (P2S) do seu WebApp para a sua VNet, para isso é necessário adicionar uma subnet exclusiva para gateways. Vá em “Subnets” e clique em “Gateway subnet”:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_7g8AWHV9rkU0BHSXzeUylw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Repare que a subnet é nomeada automaticamente, isso acontece pois no momento da criação do VNet Gateway ele irá buscar por esse nome:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_VVxUnVXtCI7GtggN4N7tGw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_iEBQdhcwJHe9fHv6fQ7RHw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Com a subnet criada, vamos à criação do Gateway.&lt;/p>
&lt;h3 id="criando-o-virtual-networkgateway">Criando o Virtual Network Gateway
&lt;/h3>&lt;p>Em Gateway type selecione “VPN”, em VPN type “Route-based” e em Virtual network, escolha a VNet criada:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_OHq0fdZ5KgQz9u_uyw5Egg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Essa etapa pode ser um pouco demorada, no geral demora em torno de 30 minutos para a criação do gateway.&lt;/p>
&lt;p>Após criado vá em Point-to-site configuration, desabilite a opção IkeV2, e adicione a chave de um certificado do tipo CER. Este certificado será baixado automaticamente pelo WebApp para realizar a autenticação na VPN.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_qW_53OBwgcWL5X8-LnYeWA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Ao realizar a configuração do WebApp para a conexão do Gateway, você poderá receber a mensagem de erro abaixo dizendo que o protocolo IkeV2 não é compatível, certifique-se que a opção está desabilitada conforme a imagem acima.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_sFY7BaCwYIsmSA2p8p5sDQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;h3 id="conectando-owebapp">Conectando o WebApp
&lt;/h3>&lt;p>Assim como a VNet, caso já possua o WebApp vá para o próximo passo. Caso ainda não tenha, pode manter as configurações padrão.&lt;/p>
&lt;p>Vá em networking e em VNet Integration clique em Setup, e depois escolha a VNet que possui o VNet Gateway:&lt;/p>
&lt;h3 id="problemas-comuns">Problemas comuns
&lt;/h3>&lt;p>Outro problema muito comum, é o certificado estar fora de sincronia:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_1rF5SbrpU3k9CumNYthJog.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Para resolver isso, vá ao Service Plan do seu WebApp, e force o sincronismo:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_iKviBxXJs-5p_JRs0layHw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_WjGMewg60baKDTdT2CbVsw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Após esses passos seu WebApp será capaz de acessar os recursos da sua rede!&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/conectando-webapps-a-redes-existentes/1_vatVLsT-KnKJyuxXyfkHHQ.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Abraço!&lt;/p>
&lt;p>&lt;em>Originally published at &lt;em>&lt;a class="link" href="http://wesleycamargo.com.br/2018/08/04/conectando-webapps-a-redes-existentes/" target="_blank" rel="noopener"
>&lt;em>wesleycamargo.com.br&lt;/em>&lt;/a>&lt;/em> on August 18, 2018.&lt;/em>&lt;/p></description></item><item><title>Transformando configurações de XML e JSON com Web Apps</title><link>http://www.wesleycamargo.com/p/transformando-configura%C3%A7%C3%B5es-de-xml-e-json-com-web-apps/</link><pubDate>Sat, 31 Mar 2018 02:05:53 +0200</pubDate><guid>http://www.wesleycamargo.com/p/transformando-configura%C3%A7%C3%B5es-de-xml-e-json-com-web-apps/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_BD0EV8VzKpc9o7qG8R9XLg.png" alt="Featured image of post Transformando configurações de XML e JSON com Web Apps" />&lt;h3 id="transformando-configurações-de-xml-e-json-com-webapps">Transformando configurações de XML e JSON com Web Apps
&lt;/h3>&lt;p>Em um post anterior demonstrei como gerenciar configurações utilizando Azure Key Vault (&lt;a class="link" href="https://medium.com/@camargo.wes/gerenciando-transformacoes-de-configuracao-com-azure-key-vault-e-vsts-434bc1b26cd8" target="_blank" rel="noopener"
>clique aqui &lt;/a>para ver). 
Agora irei mostrar como podemos realizar a transformação de uma configuração utilizando as tasks de deploy de Web Apps de uma maneira simples e fácil.&lt;/p>
&lt;p>&lt;strong>Configurando meu Web App&lt;/strong>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_BD0EV8VzKpc9o7qG8R9XLg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Para a utilização do recurso, crie um release definition e adicione uma task de Web App.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_cfAK7r-6h5b_VROzPp8g2Q.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Na sessão “File Transforms &amp;amp; Variable Substitution Options” selecione “XML Variable Substitution”. Caso tenha arquivos .json que precisem ser alterados, especifique o caminho dos arquivos:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_cOXb7wzeKEAze9sSg6SKGw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Neste exemplo, irei alterar a uma chave de configuração no arquivo web.config:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_K26WD3Zy6VaAQRXXratqUA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Adicione uma variável com o mesmo nome da key, neste caso “configuracao”, e o valor desejado da substituição:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_Flc2Aaxh0kXA-O4SxCZhWg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>No caso de arquivos json, deverá ser especificado o nó no nome da chave:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_iBdcONMNd2DOZlqLuu3rRg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_e2FURP_OrQ-rMBar00W-Yg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>E após estes simples procedimentos basta salvar a release definition e iniciar um novo deploy e a transformação será realizada. Neste exemplo, a aplicação foi publicada em um Web App e o valor definido na variável foi transformado:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_a3g9L863Z2UvFFbFGJ1K-g.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Abaixo está um tooltip da própria task explicando em quais situações será possível utilizar este recurso:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/transformando-configuraes-de-xml-e-json-com-web-apps/1_TVK15wPOvrDrHIQM7GDc7Q.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;strong>Conclusão&lt;/strong>&lt;/p>
&lt;p>Antes da existência deste recurso, ou no caso de publicações que não utilizam WebApps, era necessário gerar um arquivo web.release.config, e alterar o valor para um token.&lt;/p>
&lt;p>Com este novo processo, esta etapa não é mais necessária, onde precisamos apenas adicionar uma variável com o mesmo nome da key, e a task irá substituir os valores automaticamente.&lt;/p>
&lt;p>Com isso o processo de gestão das configurações se torna muito mais rápido e eficiente!&lt;/p>
&lt;p>Abraço!&lt;/p></description></item><item><title>Gerenciando transformações de configuração com Azure Key Vault e VSTS</title><link>http://www.wesleycamargo.com/p/gerenciando-transforma%C3%A7%C3%B5es-de-configura%C3%A7%C3%A3o-com-azure-key-vault-e-vsts/</link><pubDate>Thu, 15 Feb 2018 16:21:22 +0100</pubDate><guid>http://www.wesleycamargo.com/p/gerenciando-transforma%C3%A7%C3%B5es-de-configura%C3%A7%C3%A3o-com-azure-key-vault-e-vsts/</guid><description>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/0_LZ9C3pXOV3xuvyWq.png" alt="Featured image of post Gerenciando transformações de configuração com Azure Key Vault e VSTS" />&lt;h3 id="gerenciando-transformações-de-configuração-com-azure-key-vault-evsts">Gerenciando transformações de configuração com Azure Key Vault e VSTS
&lt;/h3>&lt;p>Quem nunca teve dificuldade para fazer a gestão de arquivos de configuração que atire a primeira pedra!&lt;/p>
&lt;p>Com a automação dos processos de build e deploy, uma etapa muito importante do processo é alteração das chaves dos arquivos de configuração, pois em cada um de nossos ambientes, teremos também valores diferentes, como por exemplo a connection string de um banco de dados.&lt;/p>
&lt;p>Irei abordar uma maneira inteligente de realizar isso, através da transformação no momento do deploy utilizando o Azure Key Vault no momento de realização da Release no Visual Studio Team Services, então mãos a obra!&lt;/p>
&lt;p>Para demonstrar, irei utilizar uma aplicação web simples, que será compilada no VSTS e publicada em um Azure Web App (em outro post irei explicar como criar e configurar um :)).&lt;/p>
&lt;p>&lt;strong>O que é o Azure Key Vault?&lt;/strong>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/0_LZ9C3pXOV3xuvyWq.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>O Azure Key Vault é um recurso do Azure onde são armazenadas chaves e segredos para realizar a comunicação entre aplicações. Com ele podemos armazenar dados sensíveis(Segredos), Certificados .PFX, Key encription Keys (KEK) e também é possível utilizar sua API para realizar criptografia. Para mais informações à respeito, segue o link da documentação &lt;a class="link" href="https://azure.microsoft.com/en-us/services/key-vault/" target="_blank" rel="noopener"
>https://azure.microsoft.com/en-us/services/key-vault/&lt;/a>&lt;/p>
&lt;p>&lt;strong>Entre as vantagens de utilização destacam-se:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Gestão de forma centralizada&lt;/li>
&lt;li>Maior segurança na administração dos dados sensíveis&lt;/li>
&lt;li>Maior facilidade na administração, pois pode ser feita no Azure Portal&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Como implementar?&lt;/strong>&lt;/p>
&lt;p>O primeiro passo é criar um Azure Key Vault no Azure Portal:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_nx7lCO0MwgnJ13_U7ci9Aw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Selecione Add e na sequência preencha nome, Resource Group e Location. O restante das informações podem ser mantidas. Clique em Create:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_Db5ICSpI3_IdNssDLi69Lg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Após a criação, selecione “Secrets” e “Generate/Import”:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_ON1rL_yJBKq3Z5_Yk3hdlg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Na próxima etapa iremos realizar a criação da chave/secret. Em Upload Options selecione Manual, e adicione o nome da variável e o valor. Note que por ser um secret aparecem asteriscos quando o valor é digitado:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_yAMfpsvEpZ_8yiCJB8bjJA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora que temos nossa chave criada, vamos ao VSTS realizar a configuração de um Release Definition utilizando o Key Vault.&lt;/p>
&lt;p>Para isso iremos utilizar um Variable Group e nele iremos realizar o link com o Key Vault.&lt;/p>
&lt;p>Selecione a opção de Build/Release e em seguida Library. Após isso crie um novo Variable Group:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_1dzMMvFwmQE-hoCNKwat0w.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora devemos nomear o Variable Group e selecionar Link Secrets from an Azure Key Vault. Então selecione uma subscription e o Key Vault criado anteriormente. 
Após selecionar o Key Vault, será solicitada uma autorização para utilização, pode ser necessária uma permissão mais elevada no VSTS para relizar este passo:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_CR9CpspeIxahIV_rCKhmGA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Selecione as variáveis desejadas no grid que será habilitado e salve o Variable Group:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_ZKGYMXc8SRQX8e_UpfYoKA.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_QdieHNnS42PLsLQlw55Xvg.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Para utilizar na Release Definition, vá em Variables e selecione Variable Groups. Clique em Link variable group:&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_PCvfwJhmXK4uqO0R_YmFgw.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Agora selecione o Variable Group criado, e clique em Link.&lt;/p>
&lt;p>&lt;img src="http://www.wesleycamargo.com/img/gerenciando-transformaes-de-configuraao-com-azure-key-vault-e-vsts/1_Eh0EakNsTdVBmYLV3-r29g.png"
loading="lazy"
alt="Image"
>&lt;/p>
&lt;p>Pronto, agora as variáveis do Azure Key Vault podem ser utilizadas no processo de Release. Para utilizar, é o mesmo processo de utilização de uma variável criada durante a release, utilizando $(nomedavariavel) em algum script ou parâmetro.&lt;/p>
&lt;p>Espero que este artigo seja útil, ajudando no processo de transformações de arquivos tornando mais prático e seguro!&lt;/p>
&lt;p>Abraço!&lt;/p></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2018-02-15_gerenciando-transforma--es-de-configura--o-com-azure-key-vault-e-vsts-434bc1b26cd8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2018-02-15_gerenciando-transforma--es-de-configura--o-com-azure-key-vault-e-vsts-434bc1b26cd8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Gerenciando transformações de configuração com Azure Key Vault e VSTS&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Gerenciando transformações de configuração com Azure Key Vault e VSTS&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Quem nunca teve dificuldade para fazer a gestão de arquivos de configuração que atire a primeira pedra!
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="de23" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="a542" id="a542" class="graf graf--h3 graf--leading graf--title">Gerenciando transformações de configuração com Azure Key Vault e VSTS&lt;/h3>&lt;p name="e9cd" id="e9cd" class="graf graf--p graf-after--h3">Quem nunca teve dificuldade para fazer a gestão de arquivos de configuração que atire a primeira pedra!&lt;/p>&lt;p name="9aef" id="9aef" class="graf graf--p graf-after--p">Com a automação dos processos de build e deploy, uma etapa muito importante do processo é alteração das chaves dos arquivos de configuração, pois em cada um de nossos ambientes, teremos também valores diferentes, como por exemplo a connection string de um banco de dados.&lt;/p>&lt;p name="582e" id="582e" class="graf graf--p graf-after--p">Irei abordar uma maneira inteligente de realizar isso, através da transformação no momento do deploy utilizando o Azure Key Vault no momento de realização da Release no Visual Studio Team Services, então mãos a obra!&lt;/p>&lt;p name="72fe" id="72fe" class="graf graf--p graf-after--p">Para demonstrar, irei utilizar uma aplicação web simples, que será compilada no VSTS e publicada em um Azure Web App (em outro post irei explicar como criar e configurar um :)).&lt;/p>&lt;p name="3985" id="3985" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">O que é o Azure Key Vault?&lt;/strong>&lt;/p>&lt;figure name="96ca" id="96ca" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*LZ9C3pXOV3xuvyWq.png" data-width="230" data-height="160" src="https://cdn-images-1.medium.com/max/800/0*LZ9C3pXOV3xuvyWq.png">&lt;/figure>&lt;p name="8ca2" id="8ca2" class="graf graf--p graf-after--figure">O Azure Key Vault é um recurso do Azure onde são armazenadas chaves e segredos para realizar a comunicação entre aplicações. Com ele podemos armazenar dados sensíveis(Segredos), Certificados .PFX, Key encription Keys (KEK) e também é possível utilizar sua API para realizar criptografia. Para mais informações à respeito, segue o link da documentação &lt;a href="https://azure.microsoft.com/en-us/services/key-vault/" data-href="https://azure.microsoft.com/en-us/services/key-vault/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://azure.microsoft.com/en-us/services/key-vault/&lt;/a>&lt;/p>&lt;p name="de10" id="de10" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Entre as vantagens de utilização destacam-se:&lt;/strong>&lt;/p>&lt;ul class="postList">&lt;li name="2e4d" id="2e4d" class="graf graf--li graf-after--p">Gestão de forma centralizada&lt;/li>&lt;li name="e121" id="e121" class="graf graf--li graf-after--li">Maior segurança na administração dos dados sensíveis&lt;/li>&lt;li name="302c" id="302c" class="graf graf--li graf-after--li">Maior facilidade na administração, pois pode ser feita no Azure Portal&lt;/li>&lt;/ul>&lt;p name="4bae" id="4bae" class="graf graf--p graf-after--li">&lt;strong class="markup--strong markup--p-strong">Como implementar?&lt;/strong>&lt;/p>&lt;p name="382a" id="382a" class="graf graf--p graf-after--p">O primeiro passo é criar um Azure Key Vault no Azure Portal:&lt;/p>&lt;figure name="d9dc" id="d9dc" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*nx7lCO0MwgnJ13_U7ci9Aw.png" data-width="652" data-height="302" src="https://cdn-images-1.medium.com/max/800/1*nx7lCO0MwgnJ13_U7ci9Aw.png">&lt;/figure>&lt;p name="fa1d" id="fa1d" class="graf graf--p graf-after--figure">Selecione Add e na sequência preencha nome, Resource Group e Location. O restante das informações podem ser mantidas. Clique em Create:&lt;/p>&lt;figure name="ca54" id="ca54" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Db5ICSpI3_IdNssDLi69Lg.png" data-width="623" data-height="628" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*Db5ICSpI3_IdNssDLi69Lg.png">&lt;/figure>&lt;p name="587e" id="587e" class="graf graf--p graf-after--figure">Após a criação, selecione “Secrets” e “Generate/Import”:&lt;/p>&lt;figure name="6475" id="6475" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ON1rL_yJBKq3Z5_Yk3hdlg.png" data-width="573" data-height="416" src="https://cdn-images-1.medium.com/max/800/1*ON1rL_yJBKq3Z5_Yk3hdlg.png">&lt;/figure>&lt;p name="fc19" id="fc19" class="graf graf--p graf-after--figure">Na próxima etapa iremos realizar a criação da chave/secret. Em Upload Options selecione Manual, e adicione o nome da variável e o valor. Note que por ser um secret aparecem asteriscos quando o valor é digitado:&lt;/p>&lt;figure name="b950" id="b950" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*yAMfpsvEpZ_8yiCJB8bjJA.png" data-width="570" data-height="580" src="https://cdn-images-1.medium.com/max/800/1*yAMfpsvEpZ_8yiCJB8bjJA.png">&lt;/figure>&lt;p name="55e9" id="55e9" class="graf graf--p graf-after--figure">Agora que temos nossa chave criada, vamos ao VSTS realizar a configuração de um Release Definition utilizando o Key Vault.&lt;/p>&lt;p name="533f" id="533f" class="graf graf--p graf-after--p">Para isso iremos utilizar um Variable Group e nele iremos realizar o link com o Key Vault.&lt;/p>&lt;p name="76e5" id="76e5" class="graf graf--p graf-after--p">Selecione a opção de Build/Release e em seguida Library. Após isso crie um novo Variable Group:&lt;/p>&lt;figure name="e59d" id="e59d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*1dzMMvFwmQE-hoCNKwat0w.png" data-width="801" data-height="494" src="https://cdn-images-1.medium.com/max/800/1*1dzMMvFwmQE-hoCNKwat0w.png">&lt;/figure>&lt;p name="1d4b" id="1d4b" class="graf graf--p graf-after--figure">Agora devemos nomear o Variable Group e selecionar Link Secrets from an Azure Key Vault. Então selecione uma subscription e o Key Vault criado anteriormente. &lt;br>Após selecionar o Key Vault, será solicitada uma autorização para utilização, pode ser necessária uma permissão mais elevada no VSTS para relizar este passo:&lt;/p>&lt;figure name="538d" id="538d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*CR9CpspeIxahIV_rCKhmGA.png" data-width="796" data-height="495" src="https://cdn-images-1.medium.com/max/800/1*CR9CpspeIxahIV_rCKhmGA.png">&lt;/figure>&lt;p name="f96a" id="f96a" class="graf graf--p graf-after--figure">Selecione as variáveis desejadas no grid que será habilitado e salve o Variable Group:&lt;/p>&lt;figure name="f95e" id="f95e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ZKGYMXc8SRQX8e_UpfYoKA.png" data-width="785" data-height="168" src="https://cdn-images-1.medium.com/max/800/1*ZKGYMXc8SRQX8e_UpfYoKA.png">&lt;/figure>&lt;figure name="dc66" id="dc66" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*QdieHNnS42PLsLQlw55Xvg.png" data-width="787" data-height="250" src="https://cdn-images-1.medium.com/max/800/1*QdieHNnS42PLsLQlw55Xvg.png">&lt;/figure>&lt;p name="3dae" id="3dae" class="graf graf--p graf-after--figure">Para utilizar na Release Definition, vá em Variables e selecione Variable Groups. Clique em Link variable group:&lt;/p>&lt;figure name="cc87" id="cc87" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*PCvfwJhmXK4uqO0R_YmFgw.png" data-width="841" data-height="224" src="https://cdn-images-1.medium.com/max/800/1*PCvfwJhmXK4uqO0R_YmFgw.png">&lt;/figure>&lt;p name="974a" id="974a" class="graf graf--p graf-after--figure">Agora selecione o Variable Group criado, e clique em Link.&lt;/p>&lt;figure name="538b" id="538b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Eh0EakNsTdVBmYLV3-r29g.png" data-width="837" data-height="493" src="https://cdn-images-1.medium.com/max/800/1*Eh0EakNsTdVBmYLV3-r29g.png">&lt;/figure>&lt;p name="4864" id="4864" class="graf graf--p graf-after--figure">Pronto, agora as variáveis do Azure Key Vault podem ser utilizadas no processo de Release. Para utilizar, é o mesmo processo de utilização de uma variável criada durante a release, utilizando $(nomedavariavel) em algum script ou parâmetro.&lt;/p>&lt;p name="5716" id="5716" class="graf graf--p graf-after--p">Espero que este artigo seja útil, ajudando no processo de transformações de arquivos tornando mais prático e seguro!&lt;/p>&lt;p name="15ab" id="15ab" class="graf graf--p graf-after--p graf--trailing">Abraço!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/434bc1b26cd8">&lt;time class="dt-published" datetime="2018-02-15T15:21:22.519Z">February 15, 2018&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/gerenciando-transformacoes-de-configuracao-com-azure-key-vault-e-vsts-434bc1b26cd8" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2018-03-31_transformando-configura--es-de-xml-e-json-com-web-apps-ae4b5141d034/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2018-03-31_transformando-configura--es-de-xml-e-json-com-web-apps-ae4b5141d034/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Transformando configurações de XML e JSON com Web Apps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Transformando configurações de XML e JSON com Web Apps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Em um post anterior demonstrei como gerenciar configurações utilizando Azure Key Vault (clique aqui para ver).
Agora irei mostrar como…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="6672" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4fc3" id="4fc3" class="graf graf--h3 graf--leading graf--title">Transformando configurações de XML e JSON com Web Apps&lt;/h3>&lt;p name="5f3e" id="5f3e" class="graf graf--p graf-after--h3">Em um post anterior demonstrei como gerenciar configurações utilizando Azure Key Vault (&lt;a href="https://medium.com/@camargo.wes/gerenciando-transformacoes-de-configuracao-com-azure-key-vault-e-vsts-434bc1b26cd8" data-href="https://medium.com/@camargo.wes/gerenciando-transformacoes-de-configuracao-com-azure-key-vault-e-vsts-434bc1b26cd8" class="markup--anchor markup--p-anchor" target="_blank">clique aqui &lt;/a>para ver). &lt;br>Agora irei mostrar como podemos realizar a transformação de uma configuração utilizando as tasks de deploy de Web Apps de uma maneira simples e fácil.&lt;/p>&lt;p name="c656" id="c656" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Configurando meu Web App&lt;/strong>&lt;/p>&lt;figure name="7e67" id="7e67" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*BD0EV8VzKpc9o7qG8R9XLg.png" data-width="512" data-height="512" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*BD0EV8VzKpc9o7qG8R9XLg.png">&lt;/figure>&lt;p name="55df" id="55df" class="graf graf--p graf-after--figure">Para a utilização do recurso, crie um release definition e adicione uma task de Web App.&lt;/p>&lt;figure name="5dc6" id="5dc6" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cfAK7r-6h5b_VROzPp8g2Q.png" data-width="702" data-height="259" src="https://cdn-images-1.medium.com/max/800/1*cfAK7r-6h5b_VROzPp8g2Q.png">&lt;/figure>&lt;p name="c4e7" id="c4e7" class="graf graf--p graf-after--figure">Na sessão “File Transforms &amp;amp; Variable Substitution Options” selecione “XML Variable Substitution”. Caso tenha arquivos .json que precisem ser alterados, especifique o caminho dos arquivos:&lt;/p>&lt;figure name="8920" id="8920" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cOXb7wzeKEAze9sSg6SKGw.png" data-width="388" data-height="226" src="https://cdn-images-1.medium.com/max/800/1*cOXb7wzeKEAze9sSg6SKGw.png">&lt;/figure>&lt;p name="9b0f" id="9b0f" class="graf graf--p graf-after--figure">Neste exemplo, irei alterar a uma chave de configuração no arquivo web.config:&lt;/p>&lt;figure name="3dcd" id="3dcd" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*K26WD3Zy6VaAQRXXratqUA.png" data-width="470" data-height="152" src="https://cdn-images-1.medium.com/max/800/1*K26WD3Zy6VaAQRXXratqUA.png">&lt;/figure>&lt;p name="82bc" id="82bc" class="graf graf--p graf-after--figure">Adicione uma variável com o mesmo nome da key, neste caso “configuracao”, e o valor desejado da substituição:&lt;/p>&lt;figure name="1359" id="1359" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Flc2Aaxh0kXA-O4SxCZhWg.png" data-width="806" data-height="178" src="https://cdn-images-1.medium.com/max/800/1*Flc2Aaxh0kXA-O4SxCZhWg.png">&lt;/figure>&lt;p name="5340" id="5340" class="graf graf--p graf-after--figure">No caso de arquivos json, deverá ser especificado o nó no nome da chave:&lt;/p>&lt;figure name="3667" id="3667" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*iBdcONMNd2DOZlqLuu3rRg.png" data-width="440" data-height="178" src="https://cdn-images-1.medium.com/max/800/1*iBdcONMNd2DOZlqLuu3rRg.png">&lt;/figure>&lt;figure name="a9fd" id="a9fd" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*e2FURP_OrQ-rMBar00W-Yg.png" data-width="845" data-height="224" src="https://cdn-images-1.medium.com/max/800/1*e2FURP_OrQ-rMBar00W-Yg.png">&lt;/figure>&lt;p name="55e6" id="55e6" class="graf graf--p graf-after--figure">E após estes simples procedimentos basta salvar a release definition e iniciar um novo deploy e a transformação será realizada. Neste exemplo, a aplicação foi publicada em um Web App e o valor definido na variável foi transformado:&lt;/p>&lt;figure name="ec55" id="ec55" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*a3g9L863Z2UvFFbFGJ1K-g.png" data-width="569" data-height="217" src="https://cdn-images-1.medium.com/max/800/1*a3g9L863Z2UvFFbFGJ1K-g.png">&lt;/figure>&lt;p name="65e2" id="65e2" class="graf graf--p graf-after--figure">Abaixo está um tooltip da própria task explicando em quais situações será possível utilizar este recurso:&lt;/p>&lt;figure name="ab9e" id="ab9e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*TVK15wPOvrDrHIQM7GDc7Q.png" data-width="659" data-height="210" src="https://cdn-images-1.medium.com/max/800/1*TVK15wPOvrDrHIQM7GDc7Q.png">&lt;/figure>&lt;p name="4df6" id="4df6" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Conclusão&lt;/strong>&lt;/p>&lt;p name="7dd1" id="7dd1" class="graf graf--p graf-after--p">Antes da existência deste recurso, ou no caso de publicações que não utilizam WebApps, era necessário gerar um arquivo web.release.config, e alterar o valor para um token.&lt;/p>&lt;p name="6d89" id="6d89" class="graf graf--p graf-after--p">Com este novo processo, esta etapa não é mais necessária, onde precisamos apenas adicionar uma variável com o mesmo nome da key, e a task irá substituir os valores automaticamente.&lt;/p>&lt;p name="6faa" id="6faa" class="graf graf--p graf-after--p">Com isso o processo de gestão das configurações se torna muito mais rápido e eficiente!&lt;/p>&lt;p name="f2e6" id="f2e6" class="graf graf--p graf-after--p graf--trailing">Abraço!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/ae4b5141d034">&lt;time class="dt-published" datetime="2018-03-31T00:05:53.558Z">March 31, 2018&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/transformando-configura%C3%A7%C3%B5es-de-xml-e-json-com-web-apps-ae4b5141d034" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2018-08-04_conectando-webapps-a-redes-existentes-942db03f0cc5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2018-08-04_conectando-webapps-a-redes-existentes-942db03f0cc5/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Conectando WebApps a redes existentes&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Conectando WebApps a redes existentes&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Em algumas situações quando utilizamos WebApps pode ser necessária a comunicação com algum recurso já existente em nossa rede, como por…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="938c" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="57ba" id="57ba" class="graf graf--h3 graf--leading graf--title">Conectando WebApps a redes existentes&lt;/h3>&lt;p name="4472" id="4472" class="graf graf--p graf-after--h3">Em algumas situações quando utilizamos WebApps pode ser necessária a comunicação com algum recurso já existente em nossa rede, como por exemplo um banco de dados IaaS, uma API, ou até mesmo um outro WebApp.&lt;/p>&lt;p name="59db" id="59db" class="graf graf--p graf-after--p">A maneira mais simples de realizar essa comunicação é através da internet, mas, apesar de ser mais fácil isso pode expor sua aplicação a vários riscos de segurança, como invasões, roubos de dados, etc.&lt;/p>&lt;p name="7431" id="7431" class="graf graf--p graf-after--p">Para solucionar esse problema, o Microsoft Azure possui um recurso chamado VNet Integration, que permite a conexão de um WebApp a uma rede existente.&lt;/p>&lt;p name="4ef2" id="4ef2" class="graf graf--p graf-after--p">Agora irei demonstrar como realizar a conexão:&lt;/p>&lt;h3 name="d6bf" id="d6bf" class="graf graf--h3 graf-after--p">Criando a Virtual Network (VNet)&lt;/h3>&lt;p name="238e" id="238e" class="graf graf--p graf-after--h3">Se você já possuir uma VNet pode pular para a próxima etapa. Para a criação não existem muitos segredos, a VNet pode seguir as configurações padrão sugeridas:&lt;/p>&lt;figure name="4913" id="4913" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ooxS-JBEtmGsvRK8CnOofQ.png" src="https://cdn-images-1.medium.com/max/800/1*ooxS-JBEtmGsvRK8CnOofQ.png">&lt;/figure>&lt;p name="085b" id="085b" class="graf graf--p graf-after--figure">Após a criação da VNet, precisamos criar um VNet Gateway, que será utilizado para realizar uma conexão VPN Point to Site (P2S) do seu WebApp para a sua VNet, para isso é necessário adicionar uma subnet exclusiva para gateways. Vá em “Subnets” e clique em “Gateway subnet”:&lt;/p>&lt;figure name="8346" id="8346" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*7g8AWHV9rkU0BHSXzeUylw.png" src="https://cdn-images-1.medium.com/max/800/1*7g8AWHV9rkU0BHSXzeUylw.png">&lt;/figure>&lt;p name="5e49" id="5e49" class="graf graf--p graf-after--figure">Repare que a subnet é nomeada automaticamente, isso acontece pois no momento da criação do VNet Gateway ele irá buscar por esse nome:&lt;/p>&lt;figure name="1196" id="1196" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*VVxUnVXtCI7GtggN4N7tGw.png" src="https://cdn-images-1.medium.com/max/800/1*VVxUnVXtCI7GtggN4N7tGw.png">&lt;/figure>&lt;figure name="43f1" id="43f1" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*iEBQdhcwJHe9fHv6fQ7RHw.png" src="https://cdn-images-1.medium.com/max/800/1*iEBQdhcwJHe9fHv6fQ7RHw.png">&lt;/figure>&lt;p name="daea" id="daea" class="graf graf--p graf-after--figure">Com a subnet criada, vamos à criação do Gateway.&lt;/p>&lt;h3 name="264b" id="264b" class="graf graf--h3 graf-after--p">Criando o Virtual Network Gateway&lt;/h3>&lt;p name="9bce" id="9bce" class="graf graf--p graf-after--h3">Em Gateway type selecione “VPN”, em VPN type “Route-based” e em Virtual network, escolha a VNet criada:&lt;/p>&lt;figure name="d1ce" id="d1ce" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*OHq0fdZ5KgQz9u_uyw5Egg.png" src="https://cdn-images-1.medium.com/max/800/1*OHq0fdZ5KgQz9u_uyw5Egg.png">&lt;/figure>&lt;p name="ffdc" id="ffdc" class="graf graf--p graf-after--figure">Essa etapa pode ser um pouco demorada, no geral demora em torno de 30 minutos para a criação do gateway.&lt;/p>&lt;p name="528c" id="528c" class="graf graf--p graf-after--p">Após criado vá em Point-to-site configuration, desabilite a opção IkeV2, e adicione a chave de um certificado do tipo CER. Este certificado será baixado automaticamente pelo WebApp para realizar a autenticação na VPN.&lt;/p>&lt;figure name="f264" id="f264" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*qW_53OBwgcWL5X8-LnYeWA.png" src="https://cdn-images-1.medium.com/max/800/1*qW_53OBwgcWL5X8-LnYeWA.png">&lt;/figure>&lt;p name="54d4" id="54d4" class="graf graf--p graf-after--figure">Ao realizar a configuração do WebApp para a conexão do Gateway, você poderá receber a mensagem de erro abaixo dizendo que o protocolo IkeV2 não é compatível, certifique-se que a opção está desabilitada conforme a imagem acima.&lt;/p>&lt;figure name="656e" id="656e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sFY7BaCwYIsmSA2p8p5sDQ.png" src="https://cdn-images-1.medium.com/max/800/1*sFY7BaCwYIsmSA2p8p5sDQ.png">&lt;/figure>&lt;h3 name="0832" id="0832" class="graf graf--h3 graf-after--figure">Conectando o WebApp&lt;/h3>&lt;p name="f701" id="f701" class="graf graf--p graf-after--h3">Assim como a VNet, caso já possua o WebApp vá para o próximo passo. Caso ainda não tenha, pode manter as configurações padrão.&lt;/p>&lt;p name="d7f8" id="d7f8" class="graf graf--p graf-after--p">Vá em networking e em VNet Integration clique em Setup, e depois escolha a VNet que possui o VNet Gateway:&lt;/p>&lt;h3 name="90c1" id="90c1" class="graf graf--h3 graf-after--p">Problemas comuns&lt;/h3>&lt;p name="ffcc" id="ffcc" class="graf graf--p graf-after--h3">Outro problema muito comum, é o certificado estar fora de sincronia:&lt;/p>&lt;figure name="a852" id="a852" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*1rF5SbrpU3k9CumNYthJog.png" src="https://cdn-images-1.medium.com/max/800/1*1rF5SbrpU3k9CumNYthJog.png">&lt;/figure>&lt;p name="a579" id="a579" class="graf graf--p graf-after--figure">Para resolver isso, vá ao Service Plan do seu WebApp, e force o sincronismo:&lt;/p>&lt;figure name="bc76" id="bc76" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*iKviBxXJs-5p_JRs0layHw.png" src="https://cdn-images-1.medium.com/max/800/1*iKviBxXJs-5p_JRs0layHw.png">&lt;/figure>&lt;figure name="7b24" id="7b24" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*WjGMewg60baKDTdT2CbVsw.png" src="https://cdn-images-1.medium.com/max/800/1*WjGMewg60baKDTdT2CbVsw.png">&lt;/figure>&lt;p name="b1c8" id="b1c8" class="graf graf--p graf-after--figure">Após esses passos seu WebApp será capaz de acessar os recursos da sua rede!&lt;/p>&lt;figure name="026f" id="026f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*vatVLsT-KnKJyuxXyfkHHQ.png" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*vatVLsT-KnKJyuxXyfkHHQ.png">&lt;/figure>&lt;p name="e929" id="e929" class="graf graf--p graf-after--figure">Abraço!&lt;/p>&lt;p name="d4f3" id="d4f3" class="graf graf--p graf-after--p graf--trailing">&lt;em class="markup--em markup--p-em">Originally published at &lt;/em>&lt;a href="http://wesleycamargo.com.br/2018/08/04/conectando-webapps-a-redes-existentes/" data-href="http://wesleycamargo.com.br/2018/08/04/conectando-webapps-a-redes-existentes/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;em class="markup--em markup--p-em">wesleycamargo.com.br&lt;/em>&lt;/a>&lt;em class="markup--em markup--p-em"> on August 18, 2018.&lt;/em>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/942db03f0cc5">&lt;time class="dt-published" datetime="2018-08-04T22:38:24.513Z">August 4, 2018&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/conectando-webapps-a-redes-existentes-942db03f0cc5" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-01-27_como-criar-uma-conta-no-azure-devops-4300626ac679/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-01-27_como-criar-uma-conta-no-azure-devops-4300626ac679/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Como criar uma conta no Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Como criar uma conta no Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Olá pessoal, irei ensinar a vocês como criar uma conta gratuita no Azure DevOps, vamos ao passo a passo:
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e1de" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="d8c9" id="d8c9" class="graf graf--h3 graf--leading graf--title">Como criar uma conta no Azure DevOps&lt;/h3>&lt;p name="2d44" id="2d44" class="graf graf--p graf-after--h3">Olá pessoal, irei ensinar a vocês como criar uma conta gratuita no Azure DevOps, vamos ao passo a passo:&lt;/p>&lt;p name="f524" id="f524" class="graf graf--p graf-after--p">Acesse o site &lt;a href="https://dev.azure.com" data-href="https://dev.azure.com" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://dev.azure.com&lt;/a> e clique no botão Start free:&lt;/p>&lt;figure name="8911" id="8911" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*zEidCQ--naWxnUjYattZ3A.png" data-width="775" data-height="550" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*zEidCQ--naWxnUjYattZ3A.png">&lt;/figure>&lt;p name="3c19" id="3c19" class="graf graf--p graf-after--figure">Existem 3 opções principais:&lt;/p>&lt;ul class="postList">&lt;li name="23f8" id="23f8" class="graf graf--li graf-after--p">Acessar como uma conta Microsoft existente (email @outlook, @hotmail, etc)&lt;/li>&lt;li name="2a3e" id="2a3e" class="graf graf--li graf-after--li">Criar uma nova conta&lt;/li>&lt;li name="58db" id="58db" class="graf graf--li graf-after--li">Acessar com uma conta do GitHub&lt;/li>&lt;/ul>&lt;p name="9fec" id="9fec" class="graf graf--p graf-after--li">Vamos criar uma nova conta, mas caso você já possua uma conta no Github também poderá utilizar.&lt;/p>&lt;figure name="de11" id="de11" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*oyShPMvn8Y7WQ5ZYMDF6Nw.png" data-width="1198" data-height="776" src="https://cdn-images-1.medium.com/max/800/1*oyShPMvn8Y7WQ5ZYMDF6Nw.png">&lt;/figure>&lt;p name="f3d6" id="f3d6" class="graf graf--p graf-after--figure">Se você possuir uma conta Microsoft (outlook, hotmail, msn) poderá inserir aqui, caso não possua clique na opção para criar uma nova conta de email:&lt;/p>&lt;figure name="139b" id="139b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*6hWFOG0kO-yr2ndXQUDsfA.png" data-width="935" data-height="696" src="https://cdn-images-1.medium.com/max/800/1*6hWFOG0kO-yr2ndXQUDsfA.png">&lt;/figure>&lt;p name="be56" id="be56" class="graf graf--p graf-after--figure">Insira um novo email que esteja disponível:&lt;/p>&lt;figure name="7157" id="7157" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*7b1Irktv99Nl7prnysZoFQ.png" data-width="597" data-height="471" src="https://cdn-images-1.medium.com/max/800/1*7b1Irktv99Nl7prnysZoFQ.png">&lt;/figure>&lt;p name="f108" id="f108" class="graf graf--p graf-after--figure">Insira sua senha:&lt;/p>&lt;figure name="6892" id="6892" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*UN6-SVfRJaLM2jNVyRqH0w.png" data-width="572" data-height="649" src="https://cdn-images-1.medium.com/max/800/1*UN6-SVfRJaLM2jNVyRqH0w.png">&lt;/figure>&lt;p name="5206" id="5206" class="graf graf--p graf-after--figure">Em região escolha Brazil:&lt;/p>&lt;figure name="a787" id="a787" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*N_iO-6UDYRVqYCWCyo4g3w.png" data-width="604" data-height="607" src="https://cdn-images-1.medium.com/max/800/1*N_iO-6UDYRVqYCWCyo4g3w.png">&lt;/figure>&lt;p name="708b" id="708b" class="graf graf--p graf-after--figure">Nesse momento sua conta será criada, aguarde alguns instantes enquanto esse processo é realizado:&lt;/p>&lt;figure name="68fa" id="68fa" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sjQ3hXrGfbHnlrcdCWEZGQ.png" data-width="597" data-height="382" src="https://cdn-images-1.medium.com/max/800/1*sjQ3hXrGfbHnlrcdCWEZGQ.png">&lt;/figure>&lt;p name="8ea7" id="8ea7" class="graf graf--p graf-after--figure">Sua conta já está criada!&lt;/p>&lt;p name="9fb8" id="9fb8" class="graf graf--p graf-after--p">Agora precisamos criar um Team Project. Ele pode ser o nome da sua equipe, seu produto, ou o que fizer mais sentido para o seu projeto. Aqui podemos nomea-lo como “Projetos”&lt;/p>&lt;figure name="9896" id="9896" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*hov9Q2jrWyu04XlPuMyhJw.png" data-width="1843" data-height="847" src="https://cdn-images-1.medium.com/max/800/1*hov9Q2jrWyu04XlPuMyhJw.png">&lt;/figure>&lt;p name="8424" id="8424" class="graf graf--p graf-after--figure">Agora seu Azure DevOps está pronto para ser utilizado!&lt;/p>&lt;figure name="ef18" id="ef18" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*SkeetDjdL7XA_JAbfSf90w.png" data-width="1830" data-height="862" src="https://cdn-images-1.medium.com/max/800/1*SkeetDjdL7XA_JAbfSf90w.png">&lt;/figure>&lt;p name="1f96" id="1f96" class="graf graf--p graf-after--figure graf--trailing">Esse é o setup básico, como disse acima existem outras opções, mas ao final todas irão criar sua organização no Azure DevOps!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/4300626ac679">&lt;time class="dt-published" datetime="2020-01-27T13:00:32.634Z">January 27, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/como-criar-uma-conta-no-azure-devops-4300626ac679" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-03-20_devops---automa--o---mitos-de-devops-5063e0aa8ff9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-03-20_devops---automa--o---mitos-de-devops-5063e0aa8ff9/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DevOps é Automação - Mitos de DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DevOps é Automação - Mitos de DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Existem muitos benefícios de realizar as automações das etapas de nosso processo, como por exemplo, a redução do tempo de implantação uma…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5221" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="abcd" id="abcd" class="graf graf--h3 graf--leading graf--title">DevOps é Automação - Mitos de DevOps&lt;/h3>&lt;p name="6f6a" id="6f6a" class="graf graf--p graf-after--h3">Existem muitos benefícios de realizar as automações das etapas de nosso processo, como por exemplo, a redução do tempo de implantação uma release de 1 hora para 5 minutos. Conseguimos &lt;strong class="markup--strong markup--p-strong">economizar 55 minutos de tempo de deploy!&lt;/strong>&lt;/p>&lt;figure name="e943" id="e943" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*EI0H1iSfOK-JoTJJc5cE1w.png" data-width="332" data-height="461" src="https://cdn-images-1.medium.com/max/800/1*EI0H1iSfOK-JoTJJc5cE1w.png">&lt;/figure>&lt;p name="b0c8" id="b0c8" class="graf graf--p graf-after--figure">Mas pode ser que seu processo tenha um gargalo e seu software fique &lt;strong class="markup--strong markup--p-strong">1 semana aguardando uma aprovação&lt;/strong>.&lt;/p>&lt;figure name="400e" id="400e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*wpk0Cna1maqtuK4Q5e0s_w.png" data-width="336" data-height="464" src="https://cdn-images-1.medium.com/max/800/1*wpk0Cna1maqtuK4Q5e0s_w.png">&lt;/figure>&lt;p name="b16d" id="b16d" class="graf graf--p graf-after--figure">Infelizmente, esses 55 minutos economizados, &lt;strong class="markup--strong markup--p-strong">se tornam praticamente irrelevantes se comparados à 1 semana aguardando aprovação&lt;/strong>. Seria mais eficiente entender o motivo de uma aprovação demorar dias ou semanas e então trabalhar para reduzir esse tempo.&lt;/p>&lt;p name="9fe7" id="9fe7" class="graf graf--p graf-after--p">No livro “DevOps Handbook”, os autores chegam a uma conclusão em que sou obrigado a concordar com eles: Uma quantidade significativa dos problemas das empresas são os mesmos, e as soluções provavelmente também são as mesmas!&lt;/p>&lt;p name="3f64" id="3f64" class="graf graf--p graf-after--p">Mas se as soluções para os problemas são conhecidos, por que não as utilizamos?&lt;/p>&lt;p name="97ef" id="97ef" class="graf graf--p graf-after--p">Nessa série de artigos baseados no livro, irei descrever alguns mitos que fazem com que essas soluções sejam ignoradas, e os problemas continuem lá, esperando para serem resolvidos.&lt;/p>&lt;h3 name="e09f" id="e09f" class="graf graf--h3 graf-after--p">DevOps é apenas Automação?&lt;/h3>&lt;p name="9853" id="9853" class="graf graf--p graf-after--h3">Quem nunca ouviu em alguma empresa ou cliente as pessoas dizerem: “Temos DevOps, fazemos todo o deploy de nosso sistemas de forma automática!” ?&lt;/p>&lt;p name="9e22" id="9e22" class="graf graf--p graf-after--p">É verdade que muitas práticas e padrões utilizados na cultura DevOps possuem sim processos de automação. Entre eles os mais comuns são Build, Deploy e Testes.&lt;/p>&lt;p name="a4e9" id="a4e9" class="graf graf--p graf-after--p">Entretanto, DevOps vai muito além disso! Para conseguirmos implantar o conjunto de práticas de maneira eficiente devemos considerar entre outros, os itens descritos nesse post: &lt;a href="https://medium.com/@camargo.wes/o-que-%C3%A9-devops-56f9a7ece1f5" data-href="https://medium.com/@camargo.wes/o-que-%C3%A9-devops-56f9a7ece1f5" class="markup--anchor markup--p-anchor" target="_blank">O que é DevOps?&lt;/a>&lt;/p>&lt;h4 name="7ad1" id="7ad1" class="graf graf--h4 graf-after--p">Então não devo automatizar?&lt;/h4>&lt;p name="e271" id="e271" class="graf graf--p graf-after--h4">Sim, &lt;strong class="markup--strong markup--p-strong">você deve&lt;/strong> continuar automatizando tudo que for possível dentro do seu processo: build, release, testes, ambientes, pipelines, porém não deve considerar apenas isso como DevOps.&lt;/p>&lt;p name="b450" id="b450" class="graf graf--p graf-after--p">Espero ter conseguido dar uma perspectiva um pouco diferente para que todos que tinham essa visão de que DevOps é apenas Automação, consigam explorar todo esse universo.&lt;/p>&lt;p name="d341" id="d341" class="graf graf--p graf-after--p">Até a próxima!&lt;/p>&lt;p name="264f" id="264f" class="graf graf--p graf-after--p">Referencias:&lt;/p>&lt;p name="57a6" id="57a6" class="graf graf--p graf-after--p">&lt;a href="https://www.amazon.com.br/DevOps-Handbook-World-Class-Reliability-Organizations-ebook/dp/B01M9ASFQ3/ref=sr_1_2?adgrpid=61528803804&amp;amp;gclid=CjwKCAjwsMzzBRACEiwAx4lLG0XDW0RBvc710sIXI80OfSxf6_mkBhZn7MW-SQP5fUkNnnEY0pWj1xoCGDUQAvD_BwE&amp;amp;hvadid=326935150244&amp;amp;hvdev=c&amp;amp;hvlocphy=1001773&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=12684604304342698395&amp;amp;hvtargid=kwd-465145704369&amp;amp;hydadcr=5626_10696887&amp;amp;keywords=manual+de+devops&amp;amp;qid=1584669906&amp;amp;sr=8-2" data-href="https://www.amazon.com.br/DevOps-Handbook-World-Class-Reliability-Organizations-ebook/dp/B01M9ASFQ3/ref=sr_1_2?adgrpid=61528803804&amp;amp;gclid=CjwKCAjwsMzzBRACEiwAx4lLG0XDW0RBvc710sIXI80OfSxf6_mkBhZn7MW-SQP5fUkNnnEY0pWj1xoCGDUQAvD_BwE&amp;amp;hvadid=326935150244&amp;amp;hvdev=c&amp;amp;hvlocphy=1001773&amp;amp;hvnetw=g&amp;amp;hvqmt=e&amp;amp;hvrand=12684604304342698395&amp;amp;hvtargid=kwd-465145704369&amp;amp;hydadcr=5626_10696887&amp;amp;keywords=manual+de+devops&amp;amp;qid=1584669906&amp;amp;sr=8-2" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">DevOps Handbook&lt;/a>&lt;/p>&lt;figure name="1cdb" id="1cdb" class="graf graf--figure graf-after--p graf--trailing">&lt;img class="graf-image" data-image-id="0*YOTWkzlSypfHqo09.jpg" data-width="326" data-height="500" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*YOTWkzlSypfHqo09.jpg">&lt;/figure>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/5063e0aa8ff9">&lt;time class="dt-published" datetime="2020-03-20T02:32:22.787Z">March 20, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops-5063e0aa8ff9" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-03-22_devops-substitui-os-m-todos--geis---mitos-de-devops-be70288488cd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-03-22_devops-substitui-os-m-todos--geis---mitos-de-devops-be70288488cd/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DevOps substitui os métodos Ágeis - Mitos de DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DevOps substitui os métodos Ágeis - Mitos de DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Tanto DevOps quanto desenvolvimento ágil se aplicam ao desenvolvimento de software visando melhorar a qualidade e velocidade de entrega de…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e274" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="46ff" id="46ff" class="graf graf--h3 graf--leading graf--title">DevOps substitui os métodos Ágeis - Mitos de DevOps&lt;/h3>&lt;p name="989b" id="989b" class="graf graf--p graf-after--h3">Tanto DevOps quanto desenvolvimento ágil se aplicam ao desenvolvimento de software visando melhorar a qualidade e velocidade de entrega de software, ou valor, para o usuário final, apesar disso, possuem maneiras de atuação diferentes.&lt;/p>&lt;p name="7db3" id="7db3" class="graf graf--p graf-after--p">Todo mundo que trabalha na área de TI já deve ter ouvido sobre o famoso manifesto ágil. De maneira resumida, nos início dos anos 2000, um grupo de desenvolvedores se reuniu em Utah nos Estados Unidos, cada um já adotando algum método de desenvolvimento, mas em comum todos esses métodos compartilhavam dos mesmos fundamentos.&lt;/p>&lt;figure name="0176" id="0176" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*b2a6QQ43p1DsN-jz.png" data-width="1218" data-height="640" src="https://cdn-images-1.medium.com/max/800/0*b2a6QQ43p1DsN-jz.png">&lt;/figure>&lt;p name="4329" id="4329" class="graf graf--p graf-after--figure">Na minha opinião, a melhor definição de DevOps é uma cultura que combina &lt;strong class="markup--strong markup--p-strong">ferramentas&lt;/strong>, &lt;strong class="markup--strong markup--p-strong">pessoas&lt;/strong> e &lt;strong class="markup--strong markup--p-strong">processos&lt;/strong>, para aumentar a velocidade de entrega de valor, não necessáriamente software, para o cliente. Enquanto Ágil é considerado uma metodologia de desenvolvimento onde devemos ter feedback o mais cedo possível para que possamos melhorar continuamente, portanto, poderia se enquadrar como parte do &lt;strong class="markup--strong markup--p-strong">processo&lt;/strong> de DevOps.&lt;/p>&lt;p name="6f38" id="6f38" class="graf graf--p graf-after--p">É muito comum vermos nas empresas a combinação de ambos para que alcancem seus objetivos, pois eles se complementam. Isso pode ser feito com uma combinação de desenvolvimento ágil com outras práticas como versionamento de código, automação de build e releases, aprovações de releases automatizadas, etc (apesar de DevOps não ser apenas automação, já falei sobre isso &lt;a href="https://medium.com/@camargo.wes/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops-5063e0aa8ff9" data-href="https://medium.com/@camargo.wes/devops-%C3%A9-automa%C3%A7%C3%A3o-mitos-de-devops-5063e0aa8ff9" class="markup--anchor markup--p-anchor" target="_blank">nesse artigo&lt;/a>). Inclusive as práticas de DevOps ajudam a fornecer esse feedback rápido para o desenvolvedor, como a utilização de validações de integração de código com builds automatizadas, por exemplo.&lt;/p>&lt;figure name="4bd0" id="4bd0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*jIeajBIHkQlA2OHiCFZMzw.jpeg" data-width="732" data-height="419" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*jIeajBIHkQlA2OHiCFZMzw.jpeg">&lt;/figure>&lt;h4 name="0c09" id="0c09" class="graf graf--h4 graf-after--figure">Mas não consigo realizar as entregas só com ágil?&lt;/h4>&lt;p name="4302" id="4302" class="graf graf--p graf-after--h4">Um dos princípios do manifesto ágil, é a entrega de software potencialmente “entregável”. Mas potencialmente entregável, não quer dizer implantado em produção… 🤔&lt;/p>&lt;p name="f887" id="f887" class="graf graf--p graf-after--p graf--trailing">A utilização de DevOps seria o complemento para que o valor gerado pelo desenvolvimento ágil chegue até o usuário final de uma maneira mais rápida e confiável, promovendo a integração das equipes, pois se as boas práticas forem seguidas, seu software já pode ser publicado em um ambiente real desde o início, evitando surpresas e retrabalhos ao final de uma iteração. Pode até mesmo ser considerado o fim da famosa frase “Na minha máquina funciona!”&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/be70288488cd">&lt;time class="dt-published" datetime="2020-03-22T16:29:00.048Z">March 22, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/devops-substitui-os-m%C3%A9todos-%C3%A1geis-mitos-de-devops-be70288488cd" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-04-24_criando-um-dsc-b-sico-9b0a694b8e12/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-04-24_criando-um-dsc-b-sico-9b0a694b8e12/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Criando um DSC básico&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Criando um DSC básico&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Garantir que exista uma pasta simples:
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5a62" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="fa62" id="fa62" class="graf graf--h3 graf--leading graf--title">Continuous Configuration Automation— Criando um arquivo DSC básico&lt;/h3>&lt;p name="ca9c" id="ca9c" class="graf graf--p graf-after--h3">Estou apoiando na implementação de Powershell DSC em um cliente, e sempre preciso de alguma referência para executar algumas operações.&lt;/p>&lt;p name="9d10" id="9d10" class="graf graf--p graf-after--p">Nesse primeiro post está um arquivo bem básico para ser utilizado como referência:&lt;/p>&lt;figure name="0cfa" id="0cfa" class="graf graf--figure graf--iframe graf-after--p graf--trailing">&lt;script src="https://gist.github.com/wesleycamargo/e1dfd880e44c42f9377d45c6481946cc.js">&lt;/script>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/9b0a694b8e12">&lt;time class="dt-published" datetime="2020-04-24T20:54:25.693Z">April 24, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/criando-um-dsc-b%C3%A1sico-9b0a694b8e12" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-04-25_o-que---automa--o-de-configura--o-e-por-que-devo-utilizar-816301604c0f/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-04-25_o-que---automa--o-de-configura--o-e-por-que-devo-utilizar-816301604c0f/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>O que é Automação de Configuração e por que devo utilizar&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">O que é Automação de Configuração e por que devo utilizar&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Se acidentalmente alguém destruir seu ambiente de produção agora, quanto tempo você gastaria para deixar tudo funcionando novamente?
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="989a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="047e" id="047e" class="graf graf--h3 graf--leading graf--title">O que é Automação de Configuração e por que devo utilizar&lt;/h3>&lt;h4 name="9796" id="9796" class="graf graf--h4 graf-after--h3 graf--subtitle">Se acidentalmente alguém destruir seu ambiente de produção agora, quanto tempo você gastaria para deixar tudo funcionando novamente?&lt;/h4>&lt;p name="7d1e" id="7d1e" class="graf graf--p graf-after--h4">Automação de configuração ou Continuous Configuration Automation (CCA) é um tipo de ferramenta de IaC que após o provisionamento dos recursos irão garantir que todas as configurações necessárias para que a aplicação funcione estão instaladas e configuradas corretamente no nosso ambiente.&lt;/p>&lt;figure name="c419" id="c419" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*9pQikZFibQWVP6-zugbKWg.png" data-width="424" data-height="611" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*9pQikZFibQWVP6-zugbKWg.png">&lt;/figure>&lt;p name="86dc" id="86dc" class="graf graf--p graf-after--figure">No mundo de DevOps é muito comum ouvirmos falar sobre Infraestrutura como código (IaC), que nada mais é que provisionar a infraestrutura de nossas aplicações através de arquivos que são tratados da mesma forma que o código fonte.&lt;/p>&lt;p name="6cab" id="6cab" class="graf graf--p graf-after--p">Basicamente Infra as Code possui 2 tipos de ferramentas:&lt;/p>&lt;ol class="postList">&lt;li name="07ed" id="07ed" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Provisionamento de recursos &lt;/strong>- nessa categoria estão ferramentas que criam os recursos de infraestrutura que serão utilizados por nossas aplicações. &lt;br>Entre as ferramentas mais conhecidas estão: &lt;strong class="markup--strong markup--li-strong">AWS Cloud Formation&lt;/strong>, &lt;strong class="markup--strong markup--li-strong">ARM Templates&lt;/strong> e talvez a mais conhecida de todos, o &lt;strong class="markup--strong markup--li-strong">Terraform&lt;/strong>.&lt;/li>&lt;li name="ba84" id="ba84" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Continuous Configuration Automation (CCA) ou Configuração de ambientes&lt;/strong> - aqui estão ferramentas, como mencionado acima, que após a criação dos recursos irão garantir que todas as configurações necessárias para que a aplicação funcionem estejam de acordo com o especificado. Exemplos dessas configurações são, garantir que portas de firewall estejam liberadas, outros softwares que minha aplicação tenha dependência estejam instalados, servidores de aplicação onde minha aplicação irá rodar esteja com a versão correta do framework utilizado, permissões de acesso, entre todas as outras configurações necessárias para nosso ambiente.&lt;br>Aqui estão alguns exemplos dessas ferramentas: &lt;strong class="markup--strong markup--li-strong">Chef&lt;/strong>, &lt;strong class="markup--strong markup--li-strong">Puppet&lt;/strong>, &lt;strong class="markup--strong markup--li-strong">Powershell DSC&lt;/strong>, &lt;strong class="markup--strong markup--li-strong">Ansible&lt;/strong> entre vários outros. Aqui neste artigo demonstro a utilização básica do &lt;a href="https://medium.com/@camargo.wes/criando-um-dsc-b%C3%A1sico-9b0a694b8e12" data-href="https://medium.com/@camargo.wes/criando-um-dsc-b%C3%A1sico-9b0a694b8e12" class="markup--anchor markup--li-anchor" target="_blank">Powershell DSC&lt;/a>.&lt;/li>&lt;/ol>&lt;p name="ab6b" id="ab6b" class="graf graf--p graf-after--li">Em algumas ferramentas é possível realizar as duas tarefas sendo assim você pode utilizar apenas uma, porém, sempre haverá especialização em uma das duas categorias (provisionamento ou configuração), o que pode dar um pouco mais de trabalho para a implementação na categoria menos especializada. Nesse caso deve ser avaliado o custo benefício de implementação vs valores gastos com licenças, por exemplo.&lt;/p>&lt;h3 name="509b" id="509b" class="graf graf--h3 graf-after--p">Mas por que eu preciso disso?&lt;/h3>&lt;p name="dbc9" id="dbc9" class="graf graf--p graf-after--h3">Acredito que hoje, 99% das as empresas devem utilizar algum tipo de controle de versão para manter seu software (se não está utilizando é melhor pensar nisso imediatamente!), entretanto, em grande parte esses sistemas são utilizados apenas para versionamento de código fonte, quando deveria englobar todos os artefatos necessários para recriar seus binários e ambientes.&lt;/p>&lt;h4 name="f188" id="f188" class="graf graf--h4 graf-after--p">&lt;strong class="markup--strong markup--h4-strong">Criar o ambiente da aplicação à qualquer momento&lt;/strong>&lt;/h4>&lt;p name="5aae" id="5aae" class="graf graf--p graf-after--h4">Para que em uma emergência seja possível recriar nosso ambiente com o mínimo de esforço, um dos princípios de DevOps é que devemos manter absolutamente &lt;strong class="markup--strong markup--p-strong">TUDO&lt;/strong> que seja necessário para criarmos uma versão de nossa aplicação do zero em um sistema de &lt;strong class="markup--strong markup--p-strong">Controle de Versão&lt;/strong>&lt;/p>&lt;p name="5f25" id="5f25" class="graf graf--p graf-after--p">Eu já presenciei essa experiência por duas vezes (não foi minha culpa heheh), e em ambas boa parte dos recursos estavam sim versionados, mas alguns como configurações de aplicação, regras de DNS, e alguns outros itens infelizmente não. A maior parte foi configurada razoavelmente rápido, mas por algumas semanas fomos descobrindo alguns itens de configuração que faltavam ou estavam incorretos.&lt;/p>&lt;h4 name="5752" id="5752" class="graf graf--h4 graf-after--p">Ambientes de desenvolvimentos padronizados&lt;/h4>&lt;p name="9ce1" id="9ce1" class="graf graf--p graf-after--h4">Acredito que todos na área de TI já ouviram a famosa frase &lt;strong class="markup--strong markup--p-strong">“Na minha máquina funciona”&lt;/strong>.&lt;/p>&lt;p name="db54" id="db54" class="graf graf--p graf-after--p">Outra vantagem será garantir que &lt;strong class="markup--strong markup--p-strong">todos os desenvolvedores utilizam um ambiente idêntico&lt;/strong>, com todas as dependências instaladas e configurações realizadas. Caso isso não seja implementado, poderá causar problemas como por exemplo, desenvolvedores utilizando versões diferentes de um framework, e ao juntar suas alterações ocorrerem conflitos que precisarão ser corrigidos, ou até mesmo alguma dependência de software que existe apenas no ambiente do desenvolvedor.&lt;/p>&lt;h4 name="8fe8" id="8fe8" class="graf graf--h4 graf-after--p">Controle das alterações realizadas nos ambientes&lt;/h4>&lt;p name="3e7f" id="3e7f" class="graf graf--p graf-after--h4 graf--trailing">Com o versionamento das definições de configurações dos ambientes em arquivos armazenados em um &lt;strong class="markup--strong markup--p-strong">Sistemas de Controle de Versão &lt;/strong>todas as alterações podem ser iniciadas através de alterações nos arquivos e enviadas ao SCV, o que nos fornece um &lt;strong class="markup--strong markup--p-strong">registro de todas as mudanças realizadas no ambiente&lt;/strong> e remove a necessidade de acessar algum servidor para realizar alterações, já que todo o processo será realizado de forma automática, garantindo padronização dos ambientes.&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/816301604c0f">&lt;time class="dt-published" datetime="2020-04-25T21:14:58.605Z">April 25, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/o-que-%C3%A9-automa%C3%A7%C3%A3o-de-configura%C3%A7%C3%A3o-e-por-que-devo-utilizar-816301604c0f" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-02_criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-02_criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Criando um pipeline de CI/CD usando GitHub Actions&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Criando um pipeline de CI/CD usando GitHub Actions&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Nesse post vou demonstrar como criar uma aplicação DotNet core, versionar no GitHub, criar um workflow usando Actions e realizar deploy no…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="1edc" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="6d6f" id="6d6f" class="graf graf--h3 graf--leading graf--title">Criando um pipeline de CI/CD usando GitHub Actions&lt;/h3>&lt;p name="890b" id="890b" class="graf graf--p graf-after--h3">Nesse post vou demonstrar como criar uma aplicação DotNet core, versionar no GitHub, criar um workflow usando Actions e realizar deploy no Azure.&lt;/p>&lt;p name="c4f7" id="c4f7" class="graf graf--p graf-after--p">Para acompanhar esse tutorial, você vai precisar de:&lt;/p>&lt;ul class="postList">&lt;li name="3e99" id="3e99" class="graf graf--li graf-after--p">Visual Studio Code - Pode ser baixado &lt;a href="https://code.visualstudio.com/download" data-href="https://code.visualstudio.com/download" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">aqui&lt;/a>&lt;/li>&lt;li name="0c65" id="0c65" class="graf graf--li graf-after--li">DotNet Core SDK - Pode ser baixado &lt;a href="https://dotnet.microsoft.com/download" data-href="https://dotnet.microsoft.com/download" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">aqui&lt;/a>&lt;/li>&lt;li name="1430" id="1430" class="graf graf--li graf-after--li">Uma conta no GitHub&lt;/li>&lt;li name="a8ee" id="a8ee" class="graf graf--li graf-after--li">Uma conta no Azure&lt;/li>&lt;/ul>&lt;p name="6c36" id="6c36" class="graf graf--p graf-after--li">Todos os comandos realizados localmente estão no arquivo abaixo, mas irei explica-los um a um no decorrer do post&lt;/p>&lt;figure name="81fd" id="81fd" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/c02bf76623181b788e452c2c7fbd52e6.js">&lt;/script>&lt;/figure>&lt;h3 name="9745" id="9745" class="graf graf--h3 graf-after--figure">Criando a aplicação&lt;/h3>&lt;p name="17c0" id="17c0" class="graf graf--p graf-after--h3">Após cumpridos os pré reqs, abra o VS Code, vá em Open folder e selecione uma pasta vazia para criarmos o projeto:&lt;/p>&lt;figure name="b6b4" id="b6b4" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ui0WEO_7OKSGgN2M9PbE4A.png" data-width="373" data-height="256" src="https://cdn-images-1.medium.com/max/800/1*ui0WEO_7OKSGgN2M9PbE4A.png">&lt;/figure>&lt;p name="7a94" id="7a94" class="graf graf--p graf-after--figure">Agora vá no menu superior vá em &lt;strong class="markup--strong markup--p-strong">Terminal &lt;/strong>-&amp;gt; &lt;strong class="markup--strong markup--p-strong">New Terminal &lt;/strong>ou pressione &lt;em class="markup--em markup--p-em">ctrl + ‘,isso irá abrir um terminal na parte inferior da tela. Para verificar a versão do sdk instalada clique nele e digite:&lt;/em>&lt;/p>&lt;pre name="33ac" id="33ac" class="graf graf--pre graf-after--p">dotnet --version&lt;/pre>&lt;p name="99f2" id="99f2" class="graf graf--p graf-after--pre">&lt;em class="markup--em markup--p-em">No meu caso estou utilizando a versão 3.1.201, caso tenha algum problema durante a execução do tutorial e esteja utilizando uma versão diferente, utilizar essa versão pode te ajudar.&lt;/em>&lt;/p>&lt;figure name="c171" id="c171" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*_AAY-oPkIg9HbrwnsizM1A.png" data-width="443" data-height="127" src="https://cdn-images-1.medium.com/max/800/1*_AAY-oPkIg9HbrwnsizM1A.png">&lt;/figure>&lt;p name="edb9" id="edb9" class="graf graf--p graf-after--figure">Agora para criarmos o projeto digite&lt;/p>&lt;pre name="9111" id="9111" class="graf graf--pre graf-after--p">dotnet new webapp&lt;/pre>&lt;p name="df3c" id="df3c" class="graf graf--p graf-after--pre">Esse comando irá criar a estrutura da nossa aplicação que nada mais é que um site web baseado em MVC:&lt;/p>&lt;figure name="c9d9" id="c9d9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*WsYhHE1qwFyFqYPkK4QQbA.png" data-width="691" data-height="202" src="https://cdn-images-1.medium.com/max/800/1*WsYhHE1qwFyFqYPkK4QQbA.png">&lt;/figure>&lt;p name="7172" id="7172" class="graf graf--p graf-after--figure">Repare que serão criados alguns arquivos na pasta que selecionamos no início. Eles podem ser vistos no menu Explorer ao lado esquerdo da tela&lt;/p>&lt;figure name="7791" id="7791" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*7qaqJxH-XhLcJ7imGQjFnQ.png" data-width="371" data-height="324" src="https://cdn-images-1.medium.com/max/800/1*7qaqJxH-XhLcJ7imGQjFnQ.png">&lt;/figure>&lt;p name="182e" id="182e" class="graf graf--p graf-after--figure">Para verificar se tudo está ok com a aplicação, digite no terminal&lt;/p>&lt;pre name="d7d9" id="d7d9" class="graf graf--pre graf-after--p">dotnet run&lt;/pre>&lt;p name="e842" id="e842" class="graf graf--p graf-after--pre">Isso irá compilar e iniciar a aplicação. Aqui também pode ser verificado em qual porta está rodando e acessar para testar&lt;/p>&lt;figure name="8a9b" id="8a9b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*KRkXlY-zDc8Y3KFVqLac2A.png" data-width="472" data-height="250" src="https://cdn-images-1.medium.com/max/800/1*KRkXlY-zDc8Y3KFVqLac2A.png">&lt;/figure>&lt;figure name="e3a4" id="e3a4" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*Yoclb52yTys4elRfRX_NpA.png" data-width="572" data-height="295" src="https://cdn-images-1.medium.com/max/800/1*Yoclb52yTys4elRfRX_NpA.png">&lt;/figure>&lt;p name="0c17" id="0c17" class="graf graf--p graf-after--figure">Agora que temos uma aplicação rodando, podemos seguir para a etapa de versionamento.&lt;/p>&lt;p name="b666" id="b666" class="graf graf--p graf-after--p">Para mais informações sobre comandos do dotnet core veja o conteúdo deste link &lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" data-href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://docs.microsoft.com/pt-br/dotnet/core/tools/&lt;/a>&lt;/p>&lt;h3 name="daf0" id="daf0" class="graf graf--h3 graf-after--p">Adicionando ao GitHub / controle de versão&lt;/h3>&lt;p name="733f" id="733f" class="graf graf--p graf-after--h3">Antes de enviar nosso código ao GitHub, primeiro precisamos versionar localmente. Antes de realizar esse versionamento, vamos criar um arquivo chamado &lt;em class="markup--em markup--p-em">.gitignore&lt;/em>, onde iremos informar ao git, quais arquivos não queremos que sejam enviados, como binários por exemplo. O próprio dotnet Core possui um template pronto, onde automaticamente são adicionados os arquivos que não queremos versionar. No terminal digite:&lt;/p>&lt;pre name="153c" id="153c" class="graf graf--pre graf-after--p">dotnet new gitignore&lt;/pre>&lt;figure name="727f" id="727f" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*890wNaAHuUov2HuWgO-GMA.png" data-width="469" data-height="71" src="https://cdn-images-1.medium.com/max/800/1*890wNaAHuUov2HuWgO-GMA.png">&lt;/figure>&lt;figure name="9db3" id="9db3" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*MZv9nGPc9QVfguqERWvPHg.png" data-width="1094" data-height="738" src="https://cdn-images-1.medium.com/max/800/1*MZv9nGPc9QVfguqERWvPHg.png">&lt;/figure>&lt;p name="a9f2" id="a9f2" class="graf graf--p graf-after--figure">1. Inicializando nosso repositório e adicionando todos os nossos arquivos para a área de staging.&lt;/p>&lt;pre name="bdfc" id="bdfc" class="graf graf--pre graf-after--p">git init&lt;/pre>&lt;pre name="281b" id="281b" class="graf graf--pre graf-after--pre">git add .&lt;br>git status&lt;/pre>&lt;figure name="d247" id="d247" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*3pibD-rKZP1PS1xljNecaQ.png" data-width="589" data-height="71" src="https://cdn-images-1.medium.com/max/800/1*3pibD-rKZP1PS1xljNecaQ.png">&lt;/figure>&lt;figure name="be01" id="be01" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*cRNA_rHAGGtS7UaFS_no9g.png" data-width="525" data-height="391" src="https://cdn-images-1.medium.com/max/800/1*cRNA_rHAGGtS7UaFS_no9g.png">&lt;/figure>&lt;p name="07f7" id="07f7" class="graf graf--p graf-after--figure">Realizando commit das alterações&lt;/p>&lt;pre name="90f7" id="90f7" class="graf graf--pre graf-after--p">git commit -m &amp;quot;commit inicial&amp;quot;&lt;/pre>&lt;figure name="9b11" id="9b11" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*HVKSn9IVa6DSs-r3BaU0Sw.png" data-width="546" data-height="383" src="https://cdn-images-1.medium.com/max/800/1*HVKSn9IVa6DSs-r3BaU0Sw.png">&lt;/figure>&lt;p name="d37b" id="d37b" class="graf graf--p graf-after--figure">Até agora todas as operações que realizamos foram locais. Para enviarmos o código para o GitHub, primeiro precisamos criar um repositório. Acesse sua conta no GitHub e siga os passos abaixo:&lt;/p>&lt;figure name="b6a1" id="b6a1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*HIljyNTqWb0jVrH3qQrgfg.png" data-width="1276" data-height="317" src="https://cdn-images-1.medium.com/max/800/1*HIljyNTqWb0jVrH3qQrgfg.png">&lt;/figure>&lt;figure name="e927" id="e927" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*K4JZxUpaEpX6datV035Taw.png" data-width="763" data-height="773" src="https://cdn-images-1.medium.com/max/800/1*K4JZxUpaEpX6datV035Taw.png">&lt;/figure>&lt;p name="867b" id="867b" class="graf graf--p graf-after--figure">Como já temos um repositório criado, copie o código da opção abaixo, cole e execute no terminal:&lt;/p>&lt;figure name="9a0b" id="9a0b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*t746pMFDe4DWlKE1faIoGQ.png" data-width="1014" data-height="832" src="https://cdn-images-1.medium.com/max/800/1*t746pMFDe4DWlKE1faIoGQ.png">&lt;/figure>&lt;pre name="3ed7" id="3ed7" class="graf graf--pre graf-after--figure">git remote add origin &lt;a href="https://github.com/wesleycamargo/Pipeline-CICD.git" data-href="https://github.com/wesleycamargo/Pipeline-CICD.git" class="markup--anchor markup--pre-anchor" rel="nofollow noopener" target="_blank">https://github.com/wesleycamargo/Pipeline-CICD.git&lt;/a>&lt;br>git push -u origin master&lt;/pre>&lt;figure name="2ea1" id="2ea1" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*Y3JwSEl19oSZZ-lM3OvteA.png" data-width="822" data-height="265" src="https://cdn-images-1.medium.com/max/800/1*Y3JwSEl19oSZZ-lM3OvteA.png">&lt;/figure>&lt;p name="696d" id="696d" class="graf graf--p graf-after--figure">Ao atualizar a página do repositório nosso código já estará lá&lt;/p>&lt;figure name="a17b" id="a17b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*5efmdYAQl8YQiFN28POzoA.png" data-width="1028" data-height="774" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*5efmdYAQl8YQiFN28POzoA.png">&lt;/figure>&lt;h3 name="0023" id="0023" class="graf graf--h3 graf-after--figure">Criando Action de CI&lt;/h3>&lt;p name="3504" id="3504" class="graf graf--p graf-after--h3">Na tela anterior clique em Actions, o GitHub deverá identificar que o código da aplicação foi escrito em .NET Core e irá sugerir um template de workflow. Pode selecioná-lo:&lt;/p>&lt;figure name="0a72" id="0a72" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ywXMxJH3-1_g0QjONb_dRg.png" data-width="907" data-height="603" src="https://cdn-images-1.medium.com/max/800/1*ywXMxJH3-1_g0QjONb_dRg.png">&lt;/figure>&lt;p name="55b4" id="55b4" class="graf graf--p graf-after--figure">Na tela seguinte será apresentado um arquivo .yml. Nesse momento vamos mante-lo assim, realizando o commit na branch master:&lt;/p>&lt;figure name="5ab7" id="5ab7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*knrDZXqVK36ev1z3G0tZNQ.png" data-width="678" data-height="782" src="https://cdn-images-1.medium.com/max/800/1*knrDZXqVK36ev1z3G0tZNQ.png">&lt;/figure>&lt;figure name="ade5" id="ade5" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*4gjYy7uBYpbqgLzEyz1q7Q.png" data-width="386" data-height="340" src="https://cdn-images-1.medium.com/max/800/1*4gjYy7uBYpbqgLzEyz1q7Q.png">&lt;/figure>&lt;p name="5d92" id="5d92" class="graf graf--p graf-after--figure">Será criada uma pasta .github/workflows no seu repositório, nela será adicionado um arquivo com o conteúdo abaixo:&lt;/p>&lt;figure name="b8de" id="b8de" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/5f5b40f41a201f3e8bf8ef95d8e94a43.js">&lt;/script>&lt;/figure>&lt;p name="a365" id="a365" class="graf graf--p graf-after--figure">Agora você será redirecionado para a parte de código. Clique novamente em Actions e você irá notar que foi criado um workflow e ele já foi iniciado automaticamente. Clique no evento que foi acionado e no build conforme as imagens:&lt;/p>&lt;figure name="665e" id="665e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*dz7AYBXgKaNs4oFZNTcjlA.png" data-width="1127" data-height="436" src="https://cdn-images-1.medium.com/max/800/1*dz7AYBXgKaNs4oFZNTcjlA.png">&lt;/figure>&lt;figure name="b58b" id="b58b" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*3U66s-lKGpwX3IhBfTWk4g.png" data-width="1160" data-height="751" src="https://cdn-images-1.medium.com/max/800/1*3U66s-lKGpwX3IhBfTWk4g.png">&lt;/figure>&lt;p name="d36f" id="d36f" class="graf graf--p graf-after--figure">Observe que é possível visualizar o log da execução do build.&lt;/p>&lt;p name="8e62" id="8e62" class="graf graf--p graf-after--p">Já temos um build realizando a Continuous Integration(CI) de nossa aplicação.&lt;/p>&lt;h3 name="169a" id="169a" class="graf graf--h3 graf-after--p">Adicionando Azure Web App Publish Profile ao GitHub&lt;/h3>&lt;p name="0ec7" id="0ec7" class="graf graf--p graf-after--h3">Vá a um Web App já existente no portal do Azure e clique em Get publish profile.&lt;/p>&lt;figure name="f547" id="f547" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*3majHLs0wenSKihXcJz1_g.png" data-width="984" data-height="266" src="https://cdn-images-1.medium.com/max/800/1*3majHLs0wenSKihXcJz1_g.png">&lt;/figure>&lt;p name="45cb" id="45cb" class="graf graf--p graf-after--figure">Será realizado o download de um arquivo com a extensão .PublishSettings. Copie o conteúdo dele.&lt;/p>&lt;p name="fad9" id="fad9" class="graf graf--p graf-after--p">No GitHub, vá às configurações para adicionar como Secret:&lt;/p>&lt;figure name="227b" id="227b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*NcJ8M45gPkf_Gri9_b6xCA.png" data-width="1035" data-height="487" src="https://cdn-images-1.medium.com/max/800/1*NcJ8M45gPkf_Gri9_b6xCA.png">&lt;/figure>&lt;p name="be8c" id="be8c" class="graf graf--p graf-after--figure">Nomeie como AZURE_WEBAPP_PUBLISH_PROFILE e em value adicione o conteúdo do arquivo .PublishSettings&lt;/p>&lt;figure name="f395" id="f395" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*4F2kuZv5VPXAyrfKlY5PLA.png" data-width="758" data-height="327" src="https://cdn-images-1.medium.com/max/800/1*4F2kuZv5VPXAyrfKlY5PLA.png">&lt;/figure>&lt;h3 name="bc4c" id="bc4c" class="graf graf--h3 graf-after--figure">Publicando a aplicação no Azure&lt;/h3>&lt;p name="74db" id="74db" class="graf graf--p graf-after--h3">Para configurar o Continuous Delivery(CD) vamos realizar algumas alterações no arquivo yml. Eu acho um pouco difícil editar pela página web, então vou realizar um pull do meu repositório local e editar no VS Code, mas você pode fazer onde for melhor para você =).&lt;/p>&lt;p name="e9ed" id="e9ed" class="graf graf--p graf-after--p">Primeiro vamos substituir o código anterior por um código mais enxuto e com uma nova função: &lt;em class="markup--em markup--p-em">publish. &lt;/em>Vamos adicionar também uma task para realizar o upload dos artefatos gerados:&lt;/p>&lt;figure name="3005" id="3005" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b563fc5a123b4d779d743caba523ba46.js">&lt;/script>&lt;/figure>&lt;p name="1486" id="1486" class="graf graf--p graf-after--figure">Aqui também adicionamos variáveis de ambiente para nossa aplicação. Altere os valores de WebApp_Name e DotNet_Version para os valores de acordo com seu ambiente:&lt;/p>&lt;pre name="87b8" id="87b8" class="graf graf--pre graf-after--p">env:&lt;br>AZURE_WEBAPP_NAME: webAppAction-wes&lt;br>AZURE_WEBAPP_PACKAGE_PATH: &amp;#39;.&amp;#39;&lt;br>DOTNET_VERSION: &amp;#39;3.1.201&amp;#39;&lt;/pre>&lt;p name="fb10" id="fb10" class="graf graf--p graf-after--pre">Com a task para realizar o upload dos artefatos, podemos notar que após executar o build podemos baixá-los:&lt;/p>&lt;figure name="d41a" id="d41a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*8yVX7O0LWDqV-I0JkRPl_w.png" data-width="638" data-height="493" src="https://cdn-images-1.medium.com/max/800/1*8yVX7O0LWDqV-I0JkRPl_w.png">&lt;/figure>&lt;p name="8d18" id="8d18" class="graf graf--p graf-after--figure">Ao final sua aplicação estará publicada em seu WebApp:&lt;/p>&lt;figure name="2cab" id="2cab" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*qNyToH28zHlXZfy3uUravA.png" data-width="766" data-height="312" src="https://cdn-images-1.medium.com/max/800/1*qNyToH28zHlXZfy3uUravA.png">&lt;/figure>&lt;p name="a608" id="a608" class="graf graf--p graf-after--figure">Vou deixar aqui o link do repositório caso queiram visualizar: &lt;a href="https://github.com/wesleycamargo/Pipeline-CICD" data-href="https://github.com/wesleycamargo/Pipeline-CICD" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://github.com/wesleycamargo/Pipeline-CICD&lt;/a>&lt;/p>&lt;p name="7f02" id="7f02" class="graf graf--p graf-after--p graf--trailing">Valeu!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/645a5199f650">&lt;time class="dt-published" datetime="2020-05-02T00:02:18.302Z">May 2, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-05_pessoas---a-parte-mais-complexa-do-devops-cc454d47a517/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-05_pessoas---a-parte-mais-complexa-do-devops-cc454d47a517/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Pessoas - A parte mais complexa do DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Pessoas - A parte mais complexa do DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Pessoas é um dos três pilares do DevOps e frequentemente é o que apresenta maior dificuldade para que o resultado seja alcançado dentro…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="adce" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="4a5a" id="4a5a" class="graf graf--h4 graf--leading graf--kicker">Como tornar sua equipe mais eficiente&lt;/h4>&lt;h3 name="52c5" id="52c5" class="graf graf--h3 graf-after--h4 graf--title">Por que pessoas são a parte mais complexa do DevOps?&lt;/h3>&lt;p name="494a" id="494a" class="graf graf--p graf-after--h3">Pessoas é&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>um dos três pilares do DevOps e frequentemente é o que apresenta maior dificuldade para que o resultado seja alcançado dentro das empresas. Mas por que isso ocorre e o que não adotar de DevOps pode causar?&lt;/p>&lt;h4 name="3935" id="3935" class="graf graf--h4 graf-after--p">Equipes separadas, objetivos diferentes&lt;/h4>&lt;p name="3da7" id="3da7" class="graf graf--p graf-after--h4">Quem já trabalhou em empresas que ainda não implementam DevOps, já deve ter presenciado algumas situação em que as equipes de desenvolvimento e infraestrutura se comportam como rivais. Isso acontece pois as equipes estão divididas em &lt;strong class="markup--strong markup--p-strong">Silos&lt;/strong>, e cada um desses silos possuem objetivos diferentes:&lt;/p>&lt;ul class="postList">&lt;li name="03d1" id="03d1" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Desenvolvimento &lt;/strong>normalmente é cobrada por entregar software cada vez mais rápido para atender as demandas de mercado.&lt;/li>&lt;li name="fb69" id="fb69" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Infraestrutura &lt;/strong>tem a responsabilidade de manter a casa em ordem, com todas as aplicações estáveis, confiáveis e seguras para o cliente.&lt;/li>&lt;/ul>&lt;figure name="0431" id="0431" class="graf graf--figure graf-after--li">&lt;img class="graf-image" data-image-id="0*Taa63z60tEhceJBY.png" data-width="465" data-height="325" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*Taa63z60tEhceJBY.png">&lt;/figure>&lt;p name="0f6b" id="0f6b" class="graf graf--p graf-after--figure">Com silos possuindo objetivos opostos, cada equipe irá trabalhar para cumprir seu objetivo, o que ajuda a explicar o sentimento de rivalidade entre as equipes.&lt;/p>&lt;p name="a073" id="a073" class="graf graf--p graf-after--p">Essa rivalidade é maléfica para o time. As pessoas em ambos os lados se sentem &lt;strong class="markup--strong markup--p-strong">desmotivadas&lt;/strong>, &lt;strong class="markup--strong markup--p-strong">sem o controle de seus próprios resultados&lt;/strong>, pois seu objetivo nunca pode ser cumprido sem ter que entrar em algum conflito com uma área que possui um objetivo diferente. Esse desgaste e desmotivação a longo prazo, faz os profissionais procurem ambientes mais sadios e com melhores condições, fazendo com que as empresas &lt;strong class="markup--strong markup--p-strong">percam os melhores profissionais&lt;/strong>.&lt;/p>&lt;p name="dec2" id="dec2" class="graf graf--p graf-after--p">Além dos resultados ruins com as pessoas, a empresa também perde. Começam a aparecer os famosos “jeitinhos” para não depender da outra área, não são respeitados processos e etapas essenciais são menosprezadas. Esse tipo de comportamento pode causar falhas de comunicação, testes inadequados e culminar com maior quantidade de erros e redução na velocidade de entrega, o que &lt;strong class="markup--strong markup--p-strong">ironicamente&lt;/strong> &lt;strong class="markup--strong markup--p-strong">compromete o objetivo de ambas as áreas.&lt;/strong>&lt;/p>&lt;p name="d136" id="d136" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">Não implementar&lt;/strong> novas versões mantém o ambiente estável, porém, &lt;strong class="markup--strong markup--p-strong">a&lt;/strong> &lt;strong class="markup--strong markup--p-strong">rapidez o que o mercado exige não é alcançada.&lt;/strong>&lt;br>Por outro lado, implementar com mais frequência, significa &lt;strong class="markup--strong markup--p-strong">mais código sendo entregue&lt;/strong>, o que também significa que &lt;strong class="markup--strong markup--p-strong">mais comportamentos inesperados podem aparecer em produção &lt;/strong>devido a proporção ser maior.&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="cebc" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="3912" id="3912" class="graf graf--h4 graf--leading">Objetivos únicos levam a uma única direção&lt;/h4>&lt;p name="010d" id="010d" class="graf graf--p graf-after--h4">Quando implementamos DevOps a &lt;strong class="markup--strong markup--p-strong">união das pessoas &lt;/strong>significa que as mais diversas áreas da empresa não apenas desenvolvimento e infraestrutura, mas também QA, negócios, segurança, produtos, e qualquer outra área que seja necessária, devem possuir &lt;strong class="markup--strong markup--p-strong">um objetivo em comum, &lt;/strong>como por exemplo, &lt;strong class="markup--strong markup--p-strong">código estável de qualidade rapidamente em produção&lt;/strong>, e trabalhar em conjunto para alcançá-lo.&lt;/p>&lt;p name="0d39" id="0d39" class="graf graf--p graf-after--p">Com isso é possível criar um &lt;strong class="markup--strong markup--p-strong">fluxo rápido e contínuo &lt;/strong>do trabalho planejado &lt;strong class="markup--strong markup--p-strong">até produção&lt;/strong> e, ao mesmo tempo, &lt;strong class="markup--strong markup--p-strong">obter qualidade, estabilidade, disponibilidade e segurança.&lt;/strong>&lt;/p>&lt;figure name="60ba" id="60ba" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*HkzmpgHf2CngCvgD.jpg" data-width="626" data-height="626" src="https://cdn-images-1.medium.com/max/800/0*HkzmpgHf2CngCvgD.jpg">&lt;/figure>&lt;p name="3c46" id="3c46" class="graf graf--p graf-after--figure">Assim são formadas&lt;strong class="markup--strong markup--p-strong"> equipes multidisciplinares&lt;/strong>, e utilizando as práticas de DevOps como, integração e entrega contínua, automação de testes, feedback contínuo, e monitoramento das aplicações e ambientes, serão responsáveis por todas as etapas da entrega (podendo ser software, ou qualquer outra forma de valor), e podem cumprir &lt;strong class="markup--strong markup--p-strong">um objetivo único de desenvolver, testar e entregar software de forma independente, com segurança e confiabilidade&lt;/strong>, se preocupando com que a implantação de recursos ocorra de forma tranquila sem causar caos ou interrupções nas operações ou aplicações.&lt;/p>&lt;p name="9f68" id="9f68" class="graf graf--p graf-after--p">Existem outras aspectos que podem dificultar a implementação de DevOps, mas baseado na minha experiência, resolver esses conflitos e unificar os objetivos podem ajudar no sucesso da sua empresa!&lt;/p>&lt;p name="b5c6" id="b5c6" class="graf graf--p graf-after--p">E sua empresa, trabalha em conjunto para alcançar seus objetivos?&lt;/p>&lt;p name="50da" id="50da" class="graf graf--p graf-after--p graf--trailing">Até mais!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/cc454d47a517">&lt;time class="dt-published" datetime="2020-05-05T17:11:47.512Z">May 5, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/pessoas-a-parte-mais-complexa-do-devops-cc454d47a517" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-07_enviando-pacotes-nuget--net-core-para-o-azure-artifacts-574819d2c20f/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-07_enviando-pacotes-nuget--net-core-para-o-azure-artifacts-574819d2c20f/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Enviando pacotes Nuget .Net Core para o Azure Artifacts&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Enviando pacotes Nuget .Net Core para o Azure Artifacts&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Aprenda como publicar packages nuget no Azure Artifacts!
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b343" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="8a26" id="8a26" class="graf graf--h3 graf--leading graf--title">Enviando pacotes Nuget .Net Core para o Azure Artifacts&lt;/h3>&lt;p name="fb6c" id="fb6c" class="graf graf--p graf-after--h3">Aprenda como publicar packages nuget no Azure Artifacts!&lt;/p>&lt;p name="a5db" id="a5db" class="graf graf--p graf-after--p">Para podermos ter maior reusabilidade dentro de nossa empresa, é interessante a utilização de pacotes compartilhados. No caso do .net, tanto core como standart utilizam o Nuget como Gerenciador de pacotes.&lt;/p>&lt;p name="80e1" id="80e1" class="graf graf--p graf-after--p">Nesse post irei ensinar passo a passo para realizar a publicação manual de um pacote nuget.&lt;/p>&lt;p name="07da" id="07da" class="graf graf--p graf-after--p">Ao longo do post irei detalhar cada um deles, mas abaixo estão todos os comandos executados no terminal:&lt;/p>&lt;figure name="a255" id="a255" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/abcb0e5f1857d01f80aaeaabf33e382e.js">&lt;/script>&lt;/figure>&lt;p name="b7ce" id="b7ce" class="graf graf--p graf-after--figure">Agora vamos botar a mão na massa!&lt;/p>&lt;h4 name="ac27" id="ac27" class="graf graf--h4 graf-after--p">Criando e configurando a aplicação&lt;/h4>&lt;p name="eeae" id="eeae" class="graf graf--p graf-after--h4">Vamos iniciar criando uma aplicação do tipo class library no .net core. Para isso digite no terminal (se você não tem familiaridade com o .net core &lt;a href="https://medium.com/@camargo.wes/criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650" data-href="https://medium.com/@camargo.wes/criando-um-pipeline-de-ci-cd-usando-github-actions-645a5199f650" class="markup--anchor markup--p-anchor" target="_blank">nesse post&lt;/a> ensino como criar uma aplicação web no VS Code):&lt;/p>&lt;pre name="d8fa" id="d8fa" class="graf graf--pre graf-after--p">dotnet new classlib&lt;/pre>&lt;p name="f1ab" id="f1ab" class="graf graf--p graf-after--pre">O projeto criado é bem básico, possuindo apenas um .csproj e uma classe. Renomeie a classe para Math e adicione o código abaixo:&lt;/p>&lt;figure name="589d" id="589d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/53b8a53c35e53398dbb4a4b6b1006acd.js">&lt;/script>&lt;/figure>&lt;p name="0540" id="0540" class="graf graf--p graf-after--figure">Vamos empacotar o projeto em um nuget package executando o comando:&lt;/p>&lt;pre name="2f53" id="2f53" class="graf graf--pre graf-after--p">dotnet pack&lt;/pre>&lt;p name="cf73" id="cf73" class="graf graf--p graf-after--pre">Será criado um arquivo nupkg na pasta bin. Usaremos ele mais tarde.&lt;/p>&lt;figure name="d7a8" id="d7a8" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*IBa82AI5wwkn7GyNuVf4lw.png" data-width="237" data-height="73" src="https://cdn-images-1.medium.com/max/800/1*IBa82AI5wwkn7GyNuVf4lw.png">&lt;/figure>&lt;p name="77cb" id="77cb" class="graf graf--p graf-after--figure">Para enviar novos pacotes precisamos realizar a conexão da nossa aplicação com o feed que vamos criar. Vamos então adicionar um arquivo nuget.config em nosso projeto. No terminal digite:&lt;/p>&lt;pre name="7805" id="7805" class="graf graf--pre graf-after--p">dotnet new nugetconfig&lt;/pre>&lt;p name="738a" id="738a" class="graf graf--p graf-after--pre">Será criado um arquivo em nosso projeto como este:&lt;/p>&lt;figure name="0474" id="0474" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*WmvMZY1rk6UHFa3sTIp-dQ.png" data-width="728" data-height="205" src="https://cdn-images-1.medium.com/max/800/1*WmvMZY1rk6UHFa3sTIp-dQ.png">&lt;/figure>&lt;p name="992d" id="992d" class="graf graf--p graf-after--figure">O feed configurado é o padrão, para adicionar as configurações do nosso feed, vamos criá-lo e obter as conexões.&lt;/p>&lt;h4 name="64a7" id="64a7" class="graf graf--h4 graf-after--p">Criando o feed de artefatos no Azure Artifacts&lt;/h4>&lt;p name="44ee" id="44ee" class="graf graf--p graf-after--h4">Acesse sua conta do Azure DevOps e siga os passos abaixo:&lt;/p>&lt;figure name="ce0f" id="ce0f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*pqzB4BtIR_fJZXV3Guv6BA.png" data-width="968" data-height="394" src="https://cdn-images-1.medium.com/max/800/1*pqzB4BtIR_fJZXV3Guv6BA.png">&lt;/figure>&lt;figure name="400d" id="400d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*FDgHA8bxqbOuQvbLXAIOOg.png" data-width="517" data-height="685" src="https://cdn-images-1.medium.com/max/800/1*FDgHA8bxqbOuQvbLXAIOOg.png">&lt;/figure>&lt;p name="6a35" id="6a35" class="graf graf--p graf-after--figure">Na tela que irá aparecer clique em Connect to feed:&lt;/p>&lt;figure name="4fc7" id="4fc7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*59mH-OrThLhu6a8MZe3SDQ.png" data-width="482" data-height="515" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*59mH-OrThLhu6a8MZe3SDQ.png">&lt;/figure>&lt;figure name="083d" id="083d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*srWBBdJZy5XlebE27MuQyA.png" data-width="1093" data-height="460" src="https://cdn-images-1.medium.com/max/800/1*srWBBdJZy5XlebE27MuQyA.png">&lt;/figure>&lt;p name="b862" id="b862" class="graf graf--p graf-after--figure">Aqui estão as informações de conexão que iremos utilizar. Copie o conteúdo de Project setup e substitua o valor do arquivo nuget.config que criamos.&lt;/p>&lt;figure name="c935" id="c935" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*dQIXu0zg95Qtpn2EfuEMyA.png" data-width="1245" data-height="773" src="https://cdn-images-1.medium.com/max/800/1*dQIXu0zg95Qtpn2EfuEMyA.png">&lt;/figure>&lt;h4 name="14b4" id="14b4" class="graf graf--h4 graf-after--figure">Conectando ao feed&lt;/h4>&lt;p name="04e9" id="04e9" class="graf graf--p graf-after--h4">Para realizar a conexão, precisamos baixar um provider. Para isso abre uma nova janela no VS Code e copie o conteúdo do arquivo abaixo salvando como CredentialProvider.ps1 e execute:&lt;/p>&lt;figure name="5a21" id="5a21" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/ca8ab9967a225b43d1de662192fe477b.js">&lt;/script>&lt;/figure>&lt;p name="5769" id="5769" class="graf graf--p graf-after--figure">Agora que foi instalado o Credential Provider vamos conseguir autenticar no Azure DevOps. Na seção anterior em Publish packages é disponibilizado um comando copie ele e não se esqueça de adicionar o parâmetro &lt;strong class="markup--strong markup--p-strong">interactive&lt;/strong>. Ele serve para iniciar uma sessão no browser e realizar a autenticação. Sem ele o comando não irá funcionar.&lt;/p>&lt;pre name="3aec" id="3aec" class="graf graf--pre graf-after--p">dotnet nuget push .\bin\Debug\NugetPackage.1.0.0.nupkg --source &amp;quot;MeuFeed&amp;quot; --api-key teste --interactive&lt;/pre>&lt;p name="27ca" id="27ca" class="graf graf--p graf-after--pre">Copie e abra no browser a URL que será fornecida e copie o código:&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="177c" id="177c" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*nZ-uu3X4tRspNGuU_x3Aeg.png" data-width="1308" data-height="172" src="https://cdn-images-1.medium.com/max/1200/1*nZ-uu3X4tRspNGuU_x3Aeg.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="4e39" id="4e39" class="graf graf--p graf-after--figure">Na URL irá aparecer a tela abaixo:&lt;/p>&lt;figure name="154d" id="154d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*waFQwYmsPFODO7lThwLdXg.png" data-width="474" data-height="361" src="https://cdn-images-1.medium.com/max/800/1*waFQwYmsPFODO7lThwLdXg.png">&lt;/figure>&lt;figure name="442a" id="442a" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*3WEsxlu7Z17i8B5HAA8gNQ.png" data-width="476" data-height="370" src="https://cdn-images-1.medium.com/max/800/1*3WEsxlu7Z17i8B5HAA8gNQ.png">&lt;/figure>&lt;p name="b865" id="b865" class="graf graf--p graf-after--figure">Se tudo ocorrer bem seu pacote aparecerá no seu feed:&lt;/p>&lt;figure name="37a7" id="37a7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sPIzp0K9jNEOLF--4mzyTw.png" data-width="963" data-height="388" src="https://cdn-images-1.medium.com/max/800/1*sPIzp0K9jNEOLF--4mzyTw.png">&lt;/figure>&lt;p name="05a9" id="05a9" class="graf graf--p graf-after--figure">Pronto! No próximo post da série irei ensinar como consumir os pacotes publicados no Azure Artifacts em uma aplicação .net core!&lt;/p>&lt;p name="fcae" id="fcae" class="graf graf--p graf-after--p graf--trailing">Valeu!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/574819d2c20f">&lt;time class="dt-published" datetime="2020-05-07T22:40:29.675Z">May 7, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/enviando-pacotes-nuget-net-core-para-o-azure-artifacts-574819d2c20f" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-09_how-to-send--net-core-nuget-packages-to-azure-artifacts-238fa08db6b5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-09_how-to-send--net-core-nuget-packages-to-azure-artifacts-238fa08db6b5/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to send .Net Core NuGet packages to Azure Artifacts&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to send .Net Core NuGet packages to Azure Artifacts&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Learn how you can send .net core NuGet packages to Azure Artifacts.
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="6b6b" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f59c" id="f59c" class="graf graf--h3 graf--leading graf--title">How to send .Net Core NuGet packages to Azure Artifacts&lt;/h3>&lt;p name="14d1" id="14d1" class="graf graf--p graf-after--h3">Learn how you can send .net core NuGet packages to Azure Artifacts.&lt;/p>&lt;p name="6a10" id="6a10" class="graf graf--p graf-after--p">To increase reusability in our company, an interesting thing that we can consider is to share our packages. Using .net, both core or standard, you can consider NuGet as a package manager. The Azure DevOps has an implementation for a &lt;strong class="markup--strong markup--p-strong">NuGet as a Service&lt;/strong> named &lt;strong class="markup--strong markup--p-strong">Azure Artifacts&lt;/strong>.&lt;/p>&lt;p name="026a" id="026a" class="graf graf--p graf-after--p">In this post, I’ll show you how to deploy manually a NuGet package step by step.&lt;/p>&lt;p name="1872" id="1872" class="graf graf--p graf-after--p">Below are all commands used in this tutorial, but I’ll explain each one.&lt;/p>&lt;p name="2d90" id="2d90" class="graf graf--p graf-after--p">Let’s get the hands dirty!&lt;/p>&lt;h4 name="3f60" id="3f60" class="graf graf--h4 graf-after--p">Creating and configuring an application&lt;/h4>&lt;p name="4822" id="4822" class="graf graf--p graf-after--h4">To start, we need a .net core class library application. To do this, type on terminal:&lt;/p>&lt;pre name="60e4" id="60e4" class="graf graf--pre graf-after--p">dotnet new classlib&lt;/pre>&lt;p name="4895" id="4895" class="graf graf--p graf-after--pre">It will create a basic project with a .csproj and one class. Rename the class to Math and put the code below on this:&lt;/p>&lt;p name="3e37" id="3e37" class="graf graf--p graf-after--p">To send new packages, first, we need to configure a connection between our app and the feed that will be created. For now, we’ll add a nuget.config file in our project. On terminal type:&lt;/p>&lt;pre name="87d8" id="87d8" class="graf graf--pre graf-after--p">dotnet new nugetconfig&lt;/pre>&lt;p name="2095" id="2095" class="graf graf--p graf-after--pre">A file like this will be created:&lt;/p>&lt;figure name="9a5c" id="9a5c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*oywzs4eXdLxxWk5u.png" data-width="728" data-height="205" src="https://cdn-images-1.medium.com/max/800/0*oywzs4eXdLxxWk5u.png">&lt;/figure>&lt;p name="1554" id="1554" class="graf graf--p graf-after--figure">This is the standard NuGet feed, after create ours we will update this file.&lt;/p>&lt;p name="d918" id="d918" class="graf graf--p graf-after--p">Now let’s package the project in a NuGet package using this command:&lt;/p>&lt;pre name="b2fe" id="b2fe" class="graf graf--pre graf-after--p">dotnet pack&lt;/pre>&lt;p name="8e9c" id="8e9c" class="graf graf--p graf-after--pre">It will create a nupkg file in the bin directory. We’ll use this later.&lt;/p>&lt;figure name="10d9" id="10d9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*83XEvUyH0uDKcUWR.png" data-width="237" data-height="73" src="https://cdn-images-1.medium.com/max/800/0*83XEvUyH0uDKcUWR.png">&lt;/figure>&lt;p name="bc3e" id="bc3e" class="graf graf--p graf-after--figure">The project it’s done, now let’s create the feed.&lt;/p>&lt;h4 name="baf8" id="baf8" class="graf graf--h4 graf-after--p">Creating a new artifact feed with Azure Artifacts&lt;/h4>&lt;p name="830b" id="830b" class="graf graf--p graf-after--h4">Access your Azure DevOps account and follow the steps:&lt;/p>&lt;figure name="2621" id="2621" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*EXzq8-qaE0Ac_ts2.png" data-width="968" data-height="394" src="https://cdn-images-1.medium.com/max/800/0*EXzq8-qaE0Ac_ts2.png">&lt;/figure>&lt;figure name="f08d" id="f08d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*vkeAqTVvYmVduEBd.png" data-width="517" data-height="685" src="https://cdn-images-1.medium.com/max/800/0*vkeAqTVvYmVduEBd.png">&lt;/figure>&lt;p name="a016" id="a016" class="graf graf--p graf-after--figure">On the next screen click on Connect to feed:&lt;/p>&lt;figure name="9c75" id="9c75" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*9izcpWYFJoem9d1H.png" data-width="482" data-height="515" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*9izcpWYFJoem9d1H.png">&lt;/figure>&lt;figure name="a130" id="a130" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*v8PKHzfxVPp0xt3g.png" data-width="1093" data-height="460" src="https://cdn-images-1.medium.com/max/800/0*v8PKHzfxVPp0xt3g.png">&lt;/figure>&lt;p name="a336" id="a336" class="graf graf--p graf-after--figure">Here is the connection information necessary to connect our app with the feed. Copy the Project setup content and update the value of the nuget.config created before.&lt;/p>&lt;figure name="4d11" id="4d11" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*egn74caQQW8ObuXS.png" data-width="1245" data-height="773" src="https://cdn-images-1.medium.com/max/800/0*egn74caQQW8ObuXS.png">&lt;/figure>&lt;h4 name="8493" id="8493" class="graf graf--h4 graf-after--figure">Connecting to feed&lt;/h4>&lt;p name="e98e" id="e98e" class="graf graf--p graf-after--h4">To make the connection, we need to download and install a connection provider. Save the content below in a file and run:&lt;/p>&lt;p name="367c" id="367c" class="graf graf--p graf-after--p">After installing the credential provider, we can authenticate with Azure DevOps. In the previous section in Publish packages, it’s given to you command with your connection information, add the parameter &lt;strong class="markup--strong markup--p-strong">interactive&lt;/strong>. It will be used to start a new browser session and do the authentication. Without this parameter, the command won’t work.&lt;/p>&lt;pre name="9642" id="9642" class="graf graf--pre graf-after--p">dotnet nuget push .\bin\Debug\NugetPackage.1.0.0.nupkg --source &amp;quot;MeuFeed&amp;quot; --api-key teste --interactive&lt;/pre>&lt;p name="793c" id="793c" class="graf graf--p graf-after--pre">It will be provided a URL and code, open the URL in the browser, and paste the code there.&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="538a" id="538a" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="0*DC1Oainm4u0YpwQC.png" data-width="1308" data-height="172" src="https://cdn-images-1.medium.com/max/1200/0*DC1Oainm4u0YpwQC.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="fd34" id="fd34" class="graf graf--p graf-after--figure">In this URL you can see this box for type the code:&lt;/p>&lt;figure name="76ad" id="76ad" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*q8RfzFfE7anWXrz9.png" data-width="474" data-height="361" src="https://cdn-images-1.medium.com/max/800/0*q8RfzFfE7anWXrz9.png">&lt;/figure>&lt;figure name="6196" id="6196" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*JEORr3AdezyN7cv2.png" data-width="476" data-height="370" src="https://cdn-images-1.medium.com/max/800/0*JEORr3AdezyN7cv2.png">&lt;/figure>&lt;p name="198f" id="198f" class="graf graf--p graf-after--figure">Finally, if everything will be ok you can see your package on the feed:&lt;/p>&lt;figure name="a185" id="a185" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*0qw1XP1aw4MN8R6B.png" data-width="963" data-height="388" src="https://cdn-images-1.medium.com/max/800/0*0qw1XP1aw4MN8R6B.png">&lt;/figure>&lt;p name="c44b" id="c44b" class="graf graf--p graf-after--figure">Done! In the next post, I’ll show how to consume this package in a .net core application.&lt;/p>&lt;p name="e416" id="e416" class="graf graf--p graf-after--p graf--trailing">See you!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/238fa08db6b5">&lt;time class="dt-published" datetime="2020-05-09T02:49:34.943Z">May 9, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-send-net-core-nuget-packages-to-azure-artifacts-238fa08db6b5" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-21_maratona-azure-devops--aprendendo-na-pr-tica-bdfd542e091e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-21_maratona-azure-devops--aprendendo-na-pr-tica-bdfd542e091e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Maratona Azure DevOps -Aprendendo na prática&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Maratona Azure DevOps -Aprendendo na prática&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Quer aprender como utilizar o Azure DevOps na prática? Então assista a Maratona Azure DevOps com mais de 12 horas de vídeos GRATUITOS.
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="df16" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="bde3" id="bde3" class="graf graf--h3 graf--leading graf--title">Maratona Azure DevOps -Aprendendo na prática&lt;/h3>&lt;p name="be48" id="be48" class="graf graf--p graf-after--h3">Quer aprender como utilizar o Azure DevOps na prática? Então assista a Maratona Azure DevOps com mais de 12 horas de vídeos GRATUITOS.&lt;/p>&lt;p name="ae35" id="ae35" class="graf graf--p graf-after--p">Ontem eu e a &lt;a href="https://medium.com/u/5f3c9bcfc939" data-href="https://medium.com/u/5f3c9bcfc939" data-anchor-type="2" data-user-id="5f3c9bcfc939" data-action-value="5f3c9bcfc939" data-action="show-user-card" data-action-type="hover" class="markup--user markup--p-user" target="_blank">Jaqueline Ramos&lt;/a> finalizamos a segunda edição da Maratona Azure DevOps, foram 3 vídeos com aproximadamente 2 horas de conteúdo cada onde abordamos conceitos de DevOps e como aplicar na prática utilizando a ferramenta.&lt;/p>&lt;figure name="4d5e" id="4d5e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*hZ6lf-gqj9UPNDzGQwW-Dg.png" data-width="1919" data-height="1079" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*hZ6lf-gqj9UPNDzGQwW-Dg.png">&lt;/figure>&lt;p name="24e8" id="24e8" class="graf graf--p graf-after--figure">A idéia da segunda edição foi de complementar o conteúdo da primeira, onde mostramos novidades como Pipelines YAML, importações de repositório e itens que não tivemos tempo de exibir na primeira.&lt;/p>&lt;p name="c05b" id="c05b" class="graf graf--p graf-after--p">Abaixo estão os links para os vídeos da primeira e segunda edição, vou adicionar os vídeos da segunda edição na frente pois estão mais atualizados, espero que gostem!&lt;/p>&lt;h3 name="3f5f" id="3f5f" class="graf graf--h3 graf-after--p">Segunda Edição&lt;/h3>&lt;h4 name="f2b5" id="f2b5" class="graf graf--h4 graf-after--h3">Primeiro episódio:&lt;/h4>&lt;p name="714e" id="714e" class="graf graf--p graf-after--h4">No primeiro dia da segunda edição da Maratona Azure DevOps tivemos uma abordagem mais conceitual falando sobre:&lt;/p>&lt;ul class="postList">&lt;li name="6894" id="6894" class="graf graf--li graf-after--p">Introdução a DevOps: Cultura e Práticas relacionadas&lt;/li>&lt;li name="0833" id="0833" class="graf graf--li graf-after--li">Carreira em DevOps&lt;/li>&lt;li name="eab5" id="eab5" class="graf graf--li graf-after--li">Ferramentas de colaboração&lt;/li>&lt;/ul>&lt;figure name="0941" id="0941" class="graf graf--figure graf--iframe graf-after--li">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj9-H3voHHXDuZKYyoI4CJDct" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="779e" id="779e" class="graf graf--h4 graf-after--figure">Segundo episódio:&lt;/h4>&lt;p name="a74a" id="a74a" class="graf graf--p graf-after--h4">No segundo dia da segunda edição da maratona apresentamos alguns itens que não foram cobertos na primeira edição em:&lt;/p>&lt;ul class="postList">&lt;li name="de3c" id="de3c" class="graf graf--li graf-after--p">Azure Boards - Como gerenciar times, criar Dashboards, alterar templates de processos&lt;/li>&lt;li name="e530" id="e530" class="graf graf--li graf-after--li">Azure Repos-Importando repositórios, utilizando Az CLI para alterações nos repositórios, criando um repositório local e enviando para o Azure DevOps, boas práticas para criação de repositórios&lt;/li>&lt;li name="565a" id="565a" class="graf graf--li graf-after--li">Azure Pipelines - Criando Pipelines YAML&lt;/li>&lt;li name="084c" id="084c" class="graf graf--li graf-after--li">Azure Artifacts - Criando um feed e enviando pacotes NuGet para o Azure Artifacts&lt;/li>&lt;/ul>&lt;figure name="1f01" id="1f01" class="graf graf--figure graf--iframe graf-after--li">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj9-H3voHHXDuZKYyoI4CJDct" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="66ff" id="66ff" class="graf graf--h4 graf-after--figure">Terceiro episódio:&lt;/h4>&lt;p name="409b" id="409b" class="graf graf--p graf-after--h4">No terceiro dia da maratona apresentamos:&lt;/p>&lt;ul class="postList">&lt;li name="db9d" id="db9d" class="graf graf--li graf-after--p">Azure Test Plans - Conheça como você pode gerenciar seus testes com o Azure Devops através de Work Items e automações de teste&lt;/li>&lt;li name="7ab6" id="7ab6" class="graf graf--li graf-after--li">Azure DevOps e Integrações -Já utiliza Jenkins, SonarCloud, AWS ou outras ferramentas em seus projetos? Saiba como integra-las ao Azure DevOps e obter o melhor para sua empresa&lt;/li>&lt;li name="a90b" id="a90b" class="graf graf--li graf-after--li">Preços - Entenda como são feitas as cobranças do Azure DevOps, e COMO UTILIZAR OS RECURSOS GRATUÍTOS!&lt;/li>&lt;/ul>&lt;figure name="878e" id="878e" class="graf graf--figure graf--iframe graf-after--li">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj9-H3voHHXDuZKYyoI4CJDct" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h3 name="e6af" id="e6af" class="graf graf--h3 graf-after--figure">Primeira Edição&lt;/h3>&lt;h4 name="840e" id="840e" class="graf graf--h4 graf-after--h3">Primeiro episódio:&lt;/h4>&lt;p name="c676" id="c676" class="graf graf--p graf-after--h4">Azure DevOps: Introdução (Como começar, administração, custos, etc) Azure Boards: Trabalhando com WorkItens e Processo de desenvolvimento&lt;/p>&lt;figure name="79f8" id="79f8" class="graf graf--figure graf--iframe graf-after--p">&lt;iframe src="https://www.youtube.com/embed/ECiDluCSut0?feature=oembed" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="e3d3" id="e3d3" class="graf graf--h4 graf-after--figure">Segundo episódio:&lt;/h4>&lt;p name="3c13" id="3c13" class="graf graf--p graf-after--h4">Utilizando Azure Repos: Controle de versão&lt;/p>&lt;figure name="6ca4" id="6ca4" class="graf graf--figure graf--iframe graf-after--p">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj999IgfpBN6gmgfd0zqfezfw" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="0cd1" id="0cd1" class="graf graf--h4 graf-after--figure">Terceiro episódio:&lt;/h4>&lt;p name="250d" id="250d" class="graf graf--p graf-after--h4">Azure Pipelines: Criando seu primeiro pipeline de entrega&lt;/p>&lt;figure name="feab" id="feab" class="graf graf--figure graf--iframe graf-after--p">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj999IgfpBN6gmgfd0zqfezfw" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="ba7a" id="ba7a" class="graf graf--h4 graf-after--figure">Quarto episódio:&lt;/h4>&lt;p name="cf43" id="cf43" class="graf graf--p graf-after--h4">Azure Test Plans: Testes integrados ao seu pipeline &lt;br>Azure Boards: Dashboards&lt;/p>&lt;figure name="1b87" id="1b87" class="graf graf--figure graf--iframe graf-after--p graf--trailing">&lt;iframe src="https://www.youtube.com/embed/videoseries?list=PLkzPm5uaOj999IgfpBN6gmgfd0zqfezfw" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/bdfd542e091e">&lt;time class="dt-published" datetime="2020-05-21T17:26:41.348Z">May 21, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/maratona-azure-devops-aprendendo-na-pr%C3%A1tica-bdfd542e091e" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-05-22_pushing-your-code-to-github-and-azure-repos-at-the-same-time-22c115dde3a9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-05-22_pushing-your-code-to-github-and-azure-repos-at-the-same-time-22c115dde3a9/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Pushing your code to GitHub and Azure Repos at the same time&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Pushing your code to GitHub and Azure Repos at the same time&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you have an existing repository hosted by an Azure Repos or in GitHub, you can add new remotes easily. Let’s see how we can do it!
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7840" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9c1d" id="9c1d" class="graf graf--h3 graf--leading graf--title">Pushing your code to GitHub and Azure Repos at the same time&lt;/h3>&lt;p name="86f2" id="86f2" class="graf graf--p graf-after--h3">If you have an existing repository hosted by an Azure Repos or in GitHub, you can add new remotes easily. Let’s see how we can do it!&lt;/p>&lt;h4 name="8440" id="8440" class="graf graf--h4 graf-after--p">Creating and versioning a local project&lt;/h4>&lt;p name="c2fa" id="c2fa" class="graf graf--p graf-after--h4">Let’s create our project. In an empty directory type the CLI commands below:&lt;/p>&lt;figure name="b894" id="b894" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/c8fd3e406efb58b4c4285ccfb552b74c.js">&lt;/script>&lt;/figure>&lt;p name="6ac4" id="6ac4" class="graf graf--p graf-after--figure">It will create a new .net core web application, with a gitignore file and versioned in a local git.&lt;/p>&lt;figure name="68e2" id="68e2" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*T1XtTzfeztcxintWQDAMyA.png" data-width="1179" data-height="885" src="https://cdn-images-1.medium.com/max/800/1*T1XtTzfeztcxintWQDAMyA.png">&lt;/figure>&lt;h4 name="995a" id="995a" class="graf graf--h4 graf-after--figure">Creating an Azure Repos repository and pushing your code&lt;/h4>&lt;p name="28eb" id="28eb" class="graf graf--p graf-after--h4">In your Azure DevOps account, follow these steps:&lt;/p>&lt;figure name="dd4d" id="dd4d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*2-w6QFXI1BKNjpfsFA4j6A.png" data-width="1047" data-height="393" src="https://cdn-images-1.medium.com/max/800/1*2-w6QFXI1BKNjpfsFA4j6A.png">&lt;/figure>&lt;p name="f4d3" id="f4d3" class="graf graf--p graf-after--figure">In the next screen disable the ‘Add a README’ option and enter your repo name:&lt;/p>&lt;figure name="a9b4" id="a9b4" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*6Ac2s4pAuPtWqdJ83iZEFQ.png" data-width="955" data-height="589" src="https://cdn-images-1.medium.com/max/800/1*6Ac2s4pAuPtWqdJ83iZEFQ.png">&lt;/figure>&lt;p name="2533" id="2533" class="graf graf--p graf-after--figure">In the empty repository created you have some options to push your code, we’ll push from an existing repository, so copy the command as the figure:&lt;/p>&lt;figure name="6092" id="6092" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*-o92AzdgasXkufQXiH8yBA.png" data-width="955" data-height="656" src="https://cdn-images-1.medium.com/max/800/1*-o92AzdgasXkufQXiH8yBA.png">&lt;/figure>&lt;p name="730d" id="730d" class="graf graf--p graf-after--figure">In your terminal paste the command, remember to check if you’re in your project directory. The highlighted log will confirm if your push was successful:&lt;/p>&lt;figure name="2546" id="2546" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*uCQXpknv5LfF8haIA44_Vg.png" data-width="1179" data-height="725" src="https://cdn-images-1.medium.com/max/800/1*uCQXpknv5LfF8haIA44_Vg.png">&lt;/figure>&lt;p name="57c2" id="57c2" class="graf graf--p graf-after--figure">Refresh your Azure Repos page and your code was pushed!&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="6d6e" id="6d6e" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*xF-xtwKHVfxRnZ8Q5QBUCA.png" data-width="1297" data-height="656" src="https://cdn-images-1.medium.com/max/1200/1*xF-xtwKHVfxRnZ8Q5QBUCA.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="29e1" id="29e1" class="graf graf--h4 graf-after--figure">Creating a GitHub Repository and adding as a second remote&lt;/h4>&lt;p name="531b" id="531b" class="graf graf--p graf-after--h4">In your GitHub repository page, click on New:&lt;/p>&lt;figure name="1a5f" id="1a5f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*3VLyUdbPXVmNi_aCoR-V-Q.png" data-width="1164" data-height="656" src="https://cdn-images-1.medium.com/max/800/1*3VLyUdbPXVmNi_aCoR-V-Q.png">&lt;/figure>&lt;p name="44b7" id="44b7" class="graf graf--p graf-after--figure">Enter your repository name and click in Create repository:&lt;/p>&lt;figure name="3bc1" id="3bc1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*eIt_59kKeag1bj2nVDHX0A.png" data-width="1164" data-height="942" src="https://cdn-images-1.medium.com/max/800/1*eIt_59kKeag1bj2nVDHX0A.png">&lt;/figure>&lt;p name="56a6" id="56a6" class="graf graf--p graf-after--figure">As previously in Azure Repos, it will give you some options to push your code. Again we’ll use the push from an existing repository option, so again copy the code:&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="c143" id="c143" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*_2knbBVcw3hg4PttoKNHLQ.png" data-width="1392" data-height="942" data-is-featured="true" src="https://cdn-images-1.medium.com/max/1200/1*_2knbBVcw3hg4PttoKNHLQ.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="1b5e" id="1b5e" class="graf graf--p graf-after--figure">When we paste the code, we need to change your origin name. It’s necessary because we added an ‘origin’ before to another remote. I’ll rename it to gh-origin, but you can give whatever you want. Once again, if you see the highlighted message it means that you pushed your code:&lt;/p>&lt;figure name="faa9" id="faa9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*nAwZXde6v6QEoE1ZG_1vSQ.png" data-width="1179" data-height="725" src="https://cdn-images-1.medium.com/max/800/1*nAwZXde6v6QEoE1ZG_1vSQ.png">&lt;/figure>&lt;p name="624e" id="624e" class="graf graf--p graf-after--figure">Go back to your GitHub repo and refresh your page, and now you have two remotes to your repository!&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="3111" id="3111" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*9P1aIeKYRSrD9PIc4yX6uw.png" data-width="1392" data-height="942" src="https://cdn-images-1.medium.com/max/1200/1*9P1aIeKYRSrD9PIc4yX6uw.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="598e" id="598e" class="graf graf--h4 graf-after--figure">Working with your remotes&lt;/h4>&lt;p name="40bd" id="40bd" class="graf graf--p graf-after--h4">The command used in the next session are these:&lt;/p>&lt;figure name="848e" id="848e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/dca72f6bdcc480046e732ec20fda0696.js">&lt;/script>&lt;/figure>&lt;p name="fae8" id="fae8" class="graf graf--p graf-after--figure">We can visualize all remotes added to our repo:&lt;/p>&lt;figure name="cec0" id="cec0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*pcY2vOv1mNmuk5ZBcCO1HQ.png" data-width="544" data-height="176" src="https://cdn-images-1.medium.com/max/800/1*pcY2vOv1mNmuk5ZBcCO1HQ.png">&lt;/figure>&lt;p name="8b29" id="8b29" class="graf graf--p graf-after--figure">The secret here it’s in your origin, the standard it’s name this as ‘origin’. To send to Azure Repos, in our example we are using the standard. To push to GitHub we have to change to ‘gh-origin’.&lt;/p>&lt;figure name="efe5" id="efe5" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*h62gh4LgNa7tGb1BtoN0AA.png" data-width="589" data-height="221" src="https://cdn-images-1.medium.com/max/800/1*h62gh4LgNa7tGb1BtoN0AA.png">&lt;/figure>&lt;p name="1448" id="1448" class="graf graf--p graf-after--figure graf--trailing">I hope that it can be useful to you!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/22c115dde3a9">&lt;time class="dt-published" datetime="2020-05-22T04:33:08.554Z">May 22, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/creating-a-net-core-application-and-pushing-to-github-or-azure-repos-22c115dde3a9" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-06-05_make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops---classic-editor-18db179d3452/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-06-05_make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops---classic-editor-18db179d3452/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
One of the most regular works in clients or companies that I faced, is to improve your existing CI/CD pipelines, reducing errors or the…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5e55" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="8bb5" id="8bb5" class="graf graf--h3 graf--leading graf--title">Make your deployment faster parallelizing your jobs in Azure DevOps - Classic Editor&lt;/h3>&lt;p name="57fa" id="57fa" class="graf graf--p graf-after--h3">One of the most regular works in clients or companies that I faced, is to improve your existing CI/CD pipelines, reducing errors or the time run. In this post, I’ll show how to configure your jobs using multi-configuration.&lt;/p>&lt;h4 name="b248" id="b248" class="graf graf--h4 graf-after--p">When do I have to use this?&lt;/h4>&lt;p name="1e30" id="1e30" class="graf graf--p graf-after--h4">I’ll use as a didactic example an application with two projects: an API and a Web Site. This maybe can be a simple example, but you can find a better use for this approach in your day-to-day activities, ideally with tasks that take a long time to execute, as creating resources like Virtual Machines, Web Apps, or any other operations. &lt;strong class="markup--strong markup--p-strong">The greater advantage is that if you have one job or ten, it will take just the time for one execution.&lt;/strong>&lt;/p>&lt;p name="3485" id="3485" class="graf graf--p graf-after--p">Below you can see a representation of the process. Notice that we have two Web App deployments serialized. However maybe you can have many processes, and if you have to wait for all of them, it can have a long time-consuming.&lt;/p>&lt;figure name="0028" id="0028" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*3cUlED971rCD_21ltjnMcQ.png" data-width="482" data-height="402" data-focus-x="49" data-focus-y="79" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*3cUlED971rCD_21ltjnMcQ.png">&lt;/figure>&lt;p name="b034" id="b034" class="graf graf--p graf-after--figure">Otherwise, create a parallel activity approach, as you can see in the next image, you can save a lot of time just doing a simple configuration.&lt;/p>&lt;figure name="bc54" id="bc54" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*oGXCq1fM6O8MzJ5jPqUq8A.png" data-width="652" data-height="282" src="https://cdn-images-1.medium.com/max/800/1*oGXCq1fM6O8MzJ5jPqUq8A.png">&lt;/figure>&lt;h4 name="fe63" id="fe63" class="graf graf--h4 graf-after--figure">Configuring the CD pipeline&lt;/h4>&lt;p name="5b47" id="5b47" class="graf graf--p graf-after--h4">I’ll use an existing build with two outputs: an API and a WebApp. The names used in the artifacts are important, we will use this later to define our application name. &lt;a href="https://medium.com/@camargo.wes/creating-a-net-core-application-and-pushing-to-github-or-azure-repos-22c115dde3a9" data-href="https://medium.com/@camargo.wes/creating-a-net-core-application-and-pushing-to-github-or-azure-repos-22c115dde3a9" class="markup--anchor markup--p-anchor" target="_blank">Here&lt;/a>, I’ll show you how to create an application and send it to Azure DevOps.&lt;/p>&lt;figure name="12e1" id="12e1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sTwA07LJk9zKklF2u59tXQ.png" data-width="519" data-height="341" src="https://cdn-images-1.medium.com/max/800/1*sTwA07LJk9zKklF2u59tXQ.png">&lt;/figure>&lt;p name="b509" id="b509" class="graf graf--p graf-after--figure">Create a classic CD pipeline for WebApp:&lt;/p>&lt;figure name="4c61" id="4c61" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*u0NLg8-CMJhc2SRj7HGAUw.png" data-width="1356" data-height="942" src="https://cdn-images-1.medium.com/max/800/1*u0NLg8-CMJhc2SRj7HGAUw.png">&lt;/figure>&lt;p name="188f" id="188f" class="graf graf--p graf-after--figure">After creation, open the variables tab and create a new var named &lt;strong class="markup--strong markup--p-strong">application&lt;/strong>.&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>In the value enter the name of your artifacts split by a comma:&lt;/p>&lt;figure name="1d7a" id="1d7a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*88PWuEkqzUz6zjGM0NIM2Q.png" data-width="1022" data-height="384" src="https://cdn-images-1.medium.com/max/800/1*88PWuEkqzUz6zjGM0NIM2Q.png">&lt;/figure>&lt;p name="46e6" id="46e6" class="graf graf--p graf-after--figure">Go back to the Tasks tab and open the agent options. In item 3, notice that it has the same variable that we created before. Item 4 it’s how many parallel jobs you would like to run.&lt;/p>&lt;figure name="248e" id="248e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*_FvRmjyzQnPX3iz5EdlPWg.png" data-width="1237" data-height="464" src="https://cdn-images-1.medium.com/max/800/1*_FvRmjyzQnPX3iz5EdlPWg.png">&lt;/figure>&lt;p name="217b" id="217b" class="graf graf--p graf-after--figure">To use the multi-configuration, your WebApps names need some pattern. Here, I created a suffix and the end of the name will be the artifact name (or the split variable):&lt;/p>&lt;figure name="d5bd" id="d5bd" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*aDFsdhjmSy2kkwLAydJ0WA.png" data-width="408" data-height="289" src="https://cdn-images-1.medium.com/max/800/1*aDFsdhjmSy2kkwLAydJ0WA.png">&lt;/figure>&lt;p name="f509" id="f509" class="graf graf--p graf-after--figure">Now let’s configure the WebApp options. This is easy, just configure according to your pattern using the variable name:&lt;/p>&lt;figure name="e733" id="e733" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sgqtmxbEd72BvLqnyvdKGw.png" data-width="857" data-height="704" src="https://cdn-images-1.medium.com/max/800/1*sgqtmxbEd72BvLqnyvdKGw.png">&lt;/figure>&lt;p name="60b9" id="60b9" class="graf graf--p graf-after--figure">Now, check if you have enough parallel jobs available in your account. The default’s it’s one parallel job for self-hosted and one Microsoft hosted agents, but if you have users with MSDN in their accounts, each one increases plus one parallel job. If you don’t have, you need to buy new parallel agents.&lt;/p>&lt;figure name="302a" id="302a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*AoqHHoWjq_HnTFCWD3MYag.png" data-width="857" data-height="942" src="https://cdn-images-1.medium.com/max/800/1*AoqHHoWjq_HnTFCWD3MYag.png">&lt;/figure>&lt;h4 name="79d5" id="79d5" class="graf graf--h4 graf-after--figure">Running and testing :)&lt;/h4>&lt;p name="1588" id="1588" class="graf graf--p graf-after--h4">After running our pipeline, we can see it’s working running in two parallel agents:&lt;/p>&lt;figure name="9970" id="9970" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*gg0HhZVjPrZkWtOHQVOokg.png" data-width="975" data-height="571" src="https://cdn-images-1.medium.com/max/800/1*gg0HhZVjPrZkWtOHQVOokg.png">&lt;/figure>&lt;p name="1034" id="1034" class="graf graf--p graf-after--figure">After all, processes finished, we can see that’s done!&lt;/p>&lt;figure name="637e" id="637e" class="graf graf--figure graf-after--p graf--trailing">&lt;img class="graf-image" data-image-id="1*-Ari24iWsvnvWoF2hC6iuw.png" data-width="1042" data-height="431" src="https://cdn-images-1.medium.com/max/800/1*-Ari24iWsvnvWoF2hC6iuw.png">&lt;/figure>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/18db179d3452">&lt;time class="dt-published" datetime="2020-06-05T20:27:53.765Z">June 5, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/make-your-deployment-faster-parallelizing-your-jobs-in-azure-devops-classic-editor-18db179d3452" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-08-01_save-money-with-azure--handling-your-resources-with-azure-functions-98adc1351eb8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-08-01_save-money-with-azure--handling-your-resources-with-azure-functions-98adc1351eb8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Save Money with Azure: Handling your resources with Azure Functions&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Save Money with Azure: Handling your resources with Azure Functions&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In fact, when a VM is created, there is an option for shutdown within the scheduled time, but it’s a bit limited, due to nonexistence of…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="c82d" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="5de4" id="5de4" class="graf graf--h4 graf--leading graf--kicker">ONE OF THE INCESSANT THINGS WHEN WE USE CLOUD PROVIDERS, IT’S HOW TO HAVE THE BIGGEST EFFICIENCY WITH OUR RESOURCES. IF YOU HAVE AZURE VIRTUAL MACHINES, FOR EXAMPLE, REDUCE THE TIME OF NON-PRODUCTION ENVIRONMENTS STAYS TURNED ON TO 12 HOURS AT WEEKDAYS CAN REDUCE YOUR BILL BY 67%.&lt;/h4>&lt;h3 name="0f9d" id="0f9d" class="graf graf--h3 graf-after--h4 graf--title">Save Money with Azure: Handling your resources with Azure Functions&lt;/h3>&lt;p name="5385" id="5385" class="graf graf--p graf-after--h3">In fact, when a VM is created, there is an option for shutdown within the scheduled time, but it’s a bit limited, due to nonexistence of an option to startup the VMs, nor the option to do this for dependent VMs as a Domain Controller that should be online when the other VMs start.&lt;/p>&lt;p name="0260" id="0260" class="graf graf--p graf-after--p">A good, simple, and cheaper solution for this, is to use an Azure Function to startup and shutdown the Virtual Machines. So let’s see how we can do it!&lt;/p>&lt;h3 name="bd0b" id="bd0b" class="graf graf--h3 graf-after--p">What you will need:&lt;/h3>&lt;ul class="postList">&lt;li name="d4e9" id="d4e9" class="graf graf--li graf-after--h3">Azure Account&lt;/li>&lt;li name="245d" id="245d" class="graf graf--li graf-after--li">Visual Studio Code&lt;/li>&lt;li name="9674" id="9674" class="graf graf--li graf-after--li">VS Code — Azure Functions Plugin&lt;/li>&lt;li name="5e34" id="5e34" class="graf graf--li graf-after--li">An Azure Virtual Machine&lt;/li>&lt;/ul>&lt;h3 name="fa17" id="fa17" class="graf graf--h3 graf-after--li">Preparing the Virtual Machine&lt;/h3>&lt;p name="cbf2" id="cbf2" class="graf graf--p graf-after--h3">Now we need to create a beacon in the VMs that we need to shutdown/startup. For this function, we’ll use a tag &lt;code class="markup--code markup--p-code">shutdownDaily&lt;/code> with the value &lt;code class="markup--code markup--p-code">true.&lt;/code> Later we will filter the VMs with this tag and shut it down in the function script.&lt;/p>&lt;figure name="d2b6" id="d2b6" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*VMDq41L7qXNa_uWH.png" data-width="914" data-height="483" src="https://cdn-images-1.medium.com/max/800/0*VMDq41L7qXNa_uWH.png">&lt;/figure>&lt;h3 name="7a72" id="7a72" class="graf graf--h3 graf-after--figure">Creating the shutdown function.&lt;/h3>&lt;p name="266f" id="266f" class="graf graf--p graf-after--h3">Open the Visual Studio Code, and create a new Powershell Function:&lt;/p>&lt;figure name="a4c1" id="a4c1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*x3FsmyoMMUNj0q89.png" data-width="1430" data-height="710" src="https://cdn-images-1.medium.com/max/800/0*x3FsmyoMMUNj0q89.png">&lt;/figure>&lt;p name="1f87" id="1f87" class="graf graf--p graf-after--figure">Select the Timer Function option and give a name to the function:&lt;/p>&lt;figure name="a692" id="a692" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*P6mXyablY5cs1Jfv.png" data-width="1430" data-height="710" src="https://cdn-images-1.medium.com/max/800/0*P6mXyablY5cs1Jfv.png">&lt;/figure>&lt;p name="0f9a" id="0f9a" class="graf graf--p graf-after--figure">Now we need to define how often the function will be executed. Here we will execute every day at 7 PM.&lt;/p>&lt;p name="47e6" id="47e6" class="graf graf--p graf-after--p">The Azure Functions use cron expression to define the frequency. (&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=csharp" data-href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer?tabs=csharp" class="markup--anchor markup--p-anchor" rel="noopener nofollow noopener" target="_blank">You can have more information here&lt;/a>)&lt;/p>&lt;figure name="2e74" id="2e74" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*n0gQs-THU0idujzR.png" data-width="1430" data-height="710" src="https://cdn-images-1.medium.com/max/800/0*n0gQs-THU0idujzR.png">&lt;/figure>&lt;p name="1c31" id="1c31" class="graf graf--p graf-after--figure">It will create a basic function based on a template. We just need to keep the parameter &lt;code class="markup--code markup--p-code">$Timer.&lt;/code>&lt;/p>&lt;figure name="d37a" id="d37a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*oLUB3JIPcB0ma_tU.png" data-width="1218" data-height="710" src="https://cdn-images-1.medium.com/max/800/0*oLUB3JIPcB0ma_tU.png">&lt;/figure>&lt;p name="72fc" id="72fc" class="graf graf--p graf-after--figure">For ease, you can replace all code with the block below:&lt;/p>&lt;figure name="9a3d" id="9a3d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/3da8e497fc124cacab67bc0989bc7585#file-function-shutdownvms-ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="ffa5" id="ffa5" class="graf graf--h3 graf-after--figure">Publishing the function on Azure&lt;/h3>&lt;p name="baac" id="baac" class="graf graf--p graf-after--h3">Now let’s publish the function on Azure Account.&lt;/p>&lt;p name="dee0" id="dee0" class="graf graf--p graf-after--p">First Sign in to Azure. It will redirect you to a Microsoft Login Screen in your browser. Enter your credentials and go back to Visual Studio Code.&lt;/p>&lt;figure name="bd57" id="bd57" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*WmwVA4gnSHHC2RDf.png" data-width="435" data-height="272" src="https://cdn-images-1.medium.com/max/800/0*WmwVA4gnSHHC2RDf.png">&lt;/figure>&lt;p name="f3c2" id="f3c2" class="graf graf--p graf-after--figure">Click in the Upload Icon, and select the desired subscription to deploy:&lt;/p>&lt;figure name="341e" id="341e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*BYBgma7b7A8X1kAG.png" data-width="873" data-height="513" src="https://cdn-images-1.medium.com/max/800/0*BYBgma7b7A8X1kAG.png">&lt;/figure>&lt;p name="0862" id="0862" class="graf graf--p graf-after--figure">Now create a new function, give a name, and select the region. It will create all resources with this name. If you need to change something, use the advanced mode. After creation it will deploy the code automatically:&lt;/p>&lt;figure name="c643" id="c643" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*YgzrA2wK4fkZ1byd.png" data-width="739" data-height="440" src="https://cdn-images-1.medium.com/max/800/0*YgzrA2wK4fkZ1byd.png">&lt;/figure>&lt;h3 name="5998" id="5998" class="graf graf--h3 graf-after--figure">Given permissions to the function&lt;/h3>&lt;p name="3c9a" id="3c9a" class="graf graf--p graf-after--h3">After creating the function, we need to authorize it to manipulate Azure Resources. On function Settings, open Identity menu and change the status to On and save this.&lt;/p>&lt;figure name="e740" id="e740" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*vvKuP65ge7TiWRdW.png" data-width="900" data-height="613" src="https://cdn-images-1.medium.com/max/800/0*vvKuP65ge7TiWRdW.png">&lt;/figure>&lt;p name="4457" id="4457" class="graf graf--p graf-after--figure">It will enable Azure role assignments button, touch this, and Add role assignment. Here I’ll create permission as a contributor int the subscription, but use the best approach to your environment:&lt;/p>&lt;figure name="5974" id="5974" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*0nDFGluJUhFbx2pj.png" data-width="895" data-height="643" src="https://cdn-images-1.medium.com/max/800/0*0nDFGluJUhFbx2pj.png">&lt;/figure>&lt;figure name="c2f4" id="c2f4" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*5TpXmm0HWeY8kJtp.png" data-width="1447" data-height="672" src="https://cdn-images-1.medium.com/max/800/0*5TpXmm0HWeY8kJtp.png">&lt;/figure>&lt;figure name="a68a" id="a68a" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*agTsn3G0E0Ym6ChC.png" data-width="978" data-height="490" src="https://cdn-images-1.medium.com/max/800/0*agTsn3G0E0Ym6ChC.png">&lt;/figure>&lt;h3 name="621f" id="621f" class="graf graf--h3 graf-after--figure">Testing the function&lt;/h3>&lt;p name="91cb" id="91cb" class="graf graf--p graf-after--h3">To test the function open it and run:&lt;/p>&lt;figure name="134f" id="134f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*TTBxoeKG68JZL3hk.png" data-width="1083" data-height="454" src="https://cdn-images-1.medium.com/max/800/0*TTBxoeKG68JZL3hk.png">&lt;/figure>&lt;figure name="04f8" id="04f8" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*vub82xMTqcUO97ji.png" data-width="1831" data-height="992" src="https://cdn-images-1.medium.com/max/800/0*vub82xMTqcUO97ji.png">&lt;/figure>&lt;p name="c242" id="c242" class="graf graf--p graf-after--figure">Expand the Logs menu, and check if everything is ok :)&lt;/p>&lt;figure name="7ded" id="7ded" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*ZIaRcU6mg_3awEce.png" data-width="1831" data-height="992" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*ZIaRcU6mg_3awEce.png">&lt;/figure>&lt;h3 name="84aa" id="84aa" class="graf graf--h3 graf-after--figure">Creating a startup function.&lt;/h3>&lt;p name="61aa" id="61aa" class="graf graf--p graf-after--h3">For the startup function, create a new function and in the step to replace the auto-generated code, use the code below:&lt;/p>&lt;figure name="b72d" id="b72d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/f355bffb2cb7c87c16d28144a28e6523#file-function-startupvms-ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="756c" id="756c" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="7d7a" id="7d7a" class="graf graf--p graf-after--h3">Thi’s a simple use with one Virtual Machine, but you can expand this, with more complex environments as dependent resources and uses for other resources.&lt;/p>&lt;p name="42d8" id="42d8" class="graf graf--p graf-after--p graf--trailing">I hope that it can be helpful to you!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/98adc1351eb8">&lt;time class="dt-published" datetime="2020-08-01T20:30:15.024Z">August 1, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/save-money-with-azure-handling-your-resources-with-azure-functions-98adc1351eb8" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2020-12-20_az-devops-yaml-pipelines---creating-a-multi-source-pipeline-with-github-repositories-ede6a22e74b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2020-12-20_az-devops-yaml-pipelines---creating-a-multi-source-pipeline-with-github-repositories-ede6a22e74b/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Az DevOps YAML Pipelines — Creating a Multi Source pipeline with GitHub Repositories&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Az DevOps YAML Pipelines — Creating a Multi Source pipeline with GitHub Repositories&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Sometimes can be necessary to use more than one repository in our deployment pipelines. Maybe you are deploying resources from different…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="c852" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="3cba" id="3cba" class="graf graf--h3 graf--leading graf--title">Az DevOps YAML Pipelines — Creating a Multi Source pipeline with GitHub Repositories&lt;/h3>&lt;p name="89d2" id="89d2" class="graf graf--p graf-after--h3">Sometimes should be necessary to use more than one repository in our deployment pipelines. Maybe you are deploying resources from different repositories together, or maybe you have a script repo with some reusable tools.&lt;/p>&lt;p name="f20c" id="f20c" class="graf graf--p graf-after--p">But when we create a YAML pipeline, by default it just checkout the repo on what our YAML is versioned, so it´s necessary to add a second repo, and below we will see how to do it =).&lt;/p>&lt;p name="4170" id="4170" class="graf graf--p graf-after--p">If you don´t know how to create a basic YAML pipeline, you can learn this here: &lt;a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/create-first-pipeline?view=azure-devops&amp;amp;tabs=net%2Ctfs-2018-2%2Cbrowser" data-href="https://docs.microsoft.com/en-us/azure/devops/pipelines/create-first-pipeline?view=azure-devops&amp;amp;tabs=net%2Ctfs-2018-2%2Cbrowser" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Create your first pipeline — Azure Pipelines | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="e38e" id="e38e" class="graf graf--p graf-after--p">In this example, I´ll use two GitHub repositories, the first one has my App Code and the YAML pipeline, and the second one has some PowerShell scripts.&lt;/p>&lt;p name="99cd" id="99cd" class="graf graf--p graf-after--p">We can see the initial build YAML below:&lt;/p>&lt;figure name="ad95" id="ad95" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/0bee70028a0532db9e476559e889d382.js">&lt;/script>&lt;/figure>&lt;p name="a0ce" id="a0ce" class="graf graf--p graf-after--figure">During the build execution of this pipeline, we can see that we have an “auto checkout”, that is not required any additional configuration.&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="6330" id="6330" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*cn0ZWr-vbna32fTu_Z671g.png" data-width="1225" data-height="610" src="https://cdn-images-1.medium.com/max/1200/1*cn0ZWr-vbna32fTu_Z671g.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="21a7" id="21a7" class="graf graf--p graf-after--figure">However, to checkout the second repository, we should create some additional steps:&lt;/p>&lt;p name="2bcf" id="2bcf" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Resources section &lt;/strong>- We need to add an additional section to reference the second repository. This section should be added to the root level of YAML file.&lt;/p>&lt;figure name="1a47" id="1a47" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*kO7XVZota5IWv9z9Eqgrgw.png" data-width="553" data-height="169" src="https://cdn-images-1.medium.com/max/800/1*kO7XVZota5IWv9z9Eqgrgw.png">&lt;/figure>&lt;ol class="postList">&lt;li name="6418" id="6418" class="graf graf--li graf-after--figure">&lt;strong class="markup--strong markup--li-strong">repository&lt;/strong> - The alias that we will use in the next steps inside the pipeline&lt;/li>&lt;li name="968b" id="968b" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">type &lt;/strong>- The kind of repo (GitHub, git, Bitbucket, etc)&lt;/li>&lt;li name="16a8" id="16a8" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">endpoint &lt;/strong>-&lt;strong class="markup--strong markup--li-strong"> &lt;/strong>Your GitHub Service Connection&lt;/li>&lt;li name="342e" id="342e" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">name &lt;/strong>- Name of&lt;strong class="markup--strong markup--li-strong"> &lt;/strong>your repo in GitHub&lt;/li>&lt;/ol>&lt;p name="5931" id="5931" class="graf graf--p graf-after--li">&lt;strong class="markup--strong markup--p-strong">Checkout section &lt;/strong>-&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>By default in the &lt;em class="markup--em markup--p-em">steps&lt;/em> section, we have an implicit checkout of the self repository. It means that we don´t need to add any additional step to download the repo that the YAML files is part of.&lt;/p>&lt;p name="9015" id="9015" class="graf graf--p graf-after--p">But as we need to checkout our second repo, we need to add these steps explicitly, including the self repo.&lt;/p>&lt;figure name="54c6" id="54c6" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*LFsYHtZ5TzMXKwUSnUIW2g.png" data-width="375" data-height="199" src="https://cdn-images-1.medium.com/max/800/1*LFsYHtZ5TzMXKwUSnUIW2g.png">&lt;/figure>&lt;ol class="postList">&lt;li name="e7f1" id="e7f1" class="graf graf--li graf-after--figure">&lt;strong class="markup--strong markup--li-strong">Self repository &lt;/strong>- The main repo containing the YAML file.&lt;/li>&lt;li name="2cff" id="2cff" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">DevOpsTools&lt;/strong> - Name gave to your repo in the &lt;em class="markup--em markup--li-em">repositories section&lt;/em>&lt;/li>&lt;/ol>&lt;p name="737f" id="737f" class="graf graf--p graf-after--li">In the end, our YAML Pipeline should look like the one below:&lt;/p>&lt;figure name="acd1" id="acd1" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b92099cb7105986ebc3926132fb1d21c.js">&lt;/script>&lt;/figure>&lt;p name="3fe9" id="3fe9" class="graf graf--p graf-after--figure">After to save the file, if we check the pipeline definition we can see that now we have our two sources:&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="50ac" id="50ac" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*gwpJRINpYdJpa9tBpe8UiQ.png" data-width="1337" data-height="850" data-is-featured="true" src="https://cdn-images-1.medium.com/max/1200/1*gwpJRINpYdJpa9tBpe8UiQ.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="caec" id="caec" class="graf graf--p graf-after--figure">And finally, when we run it, we can see our two checkout activities and the checkout of our second repository:&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="6868" id="6868" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*gUKKjSjXeZnSvInlJZnUwg.png" data-width="1446" data-height="834" src="https://cdn-images-1.medium.com/max/1200/1*gUKKjSjXeZnSvInlJZnUwg.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="b8b3" id="b8b3" class="graf graf--p graf-after--figure">Both artifacts will be downloaded in the build artifacts directory. To consume it you can use the environment variable $(Build.ArtifactStagingDirectory).&lt;/p>&lt;p name="a6cd" id="a6cd" class="graf graf--p graf-after--p graf--trailing">I wish that it can be useful, and see you in the next post! =D&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/ede6a22e74b">&lt;time class="dt-published" datetime="2020-12-20T00:21:03.006Z">December 20, 2020&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/az-devops-yaml-pipelines-creating-a-multi-source-pipeline-with-github-repositories-ede6a22e74b" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-01-03_how-to-collect-business-information-in-application-insights-8effd0bb0dd2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-01-03_how-to-collect-business-information-in-application-insights-8effd0bb0dd2/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to collect Business Information in Application Insights&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to collect Business Information in Application Insights&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Sometimes you have business requirements to know how many times something happened. An easy way to do that is by using Application…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="3c68" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="3095" id="3095" class="graf graf--h3 graf--leading graf--title">Monitoring - How to collect Business Information in Application Insights&lt;/h3>&lt;p name="f0aa" id="f0aa" class="graf graf--p graf-after--h3">Sometimes you have business requirements to know how many times something happened. An easy way to do that is by using Application Insights Telemetry. In this post, we will see how to do this configuration.&lt;/p>&lt;h4 name="1f58" id="1f58" class="graf graf--h4 graf-after--p">Creating the Azure Application Insights&lt;/h4>&lt;p name="7eb6" id="7eb6" class="graf graf--p graf-after--h4">Create a new Application Insights in your Azure account. You can create with the ARM Template below:&lt;/p>&lt;figure name="d739" id="d739" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/0cd38b66b3475fa80c2d6ad5bf062b64.js">&lt;/script>&lt;/figure>&lt;p name="f11b" id="f11b" class="graf graf--p graf-after--figure">To run the ARM Template with Az CLI, you can use these commands:&lt;/p>&lt;pre name="76ef" id="76ef" class="graf graf--pre graf-after--p">az group create -n RG-Samples -l northeurope&lt;br>az deployment group create -g RG-Samples — template-file .\appInsights.json&lt;/pre>&lt;p name="fde4" id="fde4" class="graf graf--p graf-after--pre">It will return an Instrumentation Key as output, save this value to use later.&lt;/p>&lt;figure name="8a3e" id="8a3e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Q236l-ogEMAxUQUTxLoV6A.png" data-width="603" data-height="204" src="https://cdn-images-1.medium.com/max/800/1*Q236l-ogEMAxUQUTxLoV6A.png">&lt;/figure>&lt;h4 name="b4f6" id="b4f6" class="graf graf--h4 graf-after--figure">Creating the Asp Net Project&lt;/h4>&lt;p name="b813" id="b813" class="graf graf--p graf-after--h4">Create a new MVC application and add the package Microsoft.ApplicationInsights.AspNetCore:&lt;/p>&lt;pre name="a822" id="a822" class="graf graf--pre graf-after--p">dotnet new mvc&lt;br>dotnet add package Microsoft.ApplicationInsights.AspNetCore&lt;/pre>&lt;p name="0e20" id="0e20" class="graf graf--p graf-after--pre">Now in the Startup.cs file, we need to configure the Application Insights Telemetry.&lt;/p>&lt;p name="6e8d" id="6e8d" class="graf graf--p graf-after--p">Go to the method ConfigureServices and add the line `services.AddApplicationInsightsTelemetry();`&lt;/p>&lt;figure name="33bf" id="33bf" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/33a97c3dfb104b80939eed6e6155e02d.js">&lt;/script>&lt;/figure>&lt;p name="f62d" id="f62d" class="graf graf--p graf-after--figure">At the end of the file Views/Home/Index.cshtml add a button to call the event:&lt;/p>&lt;figure name="c6d3" id="c6d3" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/ec7bd961eed853325aeadb883d30de5a.js">&lt;/script>&lt;/figure>&lt;p name="c4cc" id="c4cc" class="graf graf--p graf-after--figure">In the HomeController.cs, add a private variable with the type `&lt;em class="markup--em markup--p-em">TelemetryClient` and &lt;/em>add to the constructor a variable to assign it. Also, add a new method to call your Event Button.&lt;/p>&lt;figure name="e86f" id="e86f" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/c87de2603f90421beb19262f74184177.js">&lt;/script>&lt;/figure>&lt;p name="259e" id="259e" class="graf graf--p graf-after--figure">In the appSettings.json, replace the content as below and substituting the Instrumentation Key with the value collected in the steps above:&lt;/p>&lt;figure name="50e4" id="50e4" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b6163e2b333267af9672f96985e87e35.js">&lt;/script>&lt;/figure>&lt;h4 name="8eec" id="8eec" class="graf graf--h4 graf-after--figure">Collecting and searching data in Application Insights&lt;/h4>&lt;p name="ba2f" id="ba2f" class="graf graf--p graf-after--h4">Run the application with the command `dotnet run` and open &lt;a href="https://localhost:5001" data-href="https://localhost:5001" class="markup--anchor markup--p-anchor" rel="nofollow" target="_blank">https://localhost:5001&lt;/a> in your browser. Now click some times in Hello to generate data in the application insights:&lt;/p>&lt;figure name="1b5a" id="1b5a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*QEhqjDvoeaFCDf-j5tnvGg.png" data-width="895" data-height="712" src="https://cdn-images-1.medium.com/max/800/1*QEhqjDvoeaFCDf-j5tnvGg.png">&lt;/figure>&lt;figure name="47ae" id="47ae" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*mLBIN--h0OCAHSrlEhiPSg.png" data-width="895" data-height="712" src="https://cdn-images-1.medium.com/max/800/1*mLBIN--h0OCAHSrlEhiPSg.png">&lt;/figure>&lt;p name="0400" id="0400" class="graf graf--p graf-after--figure">In Azure Portal, open the Application Insights created, and click in search:&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="74f9" id="74f9" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*ThDAkmcOrFnIWAzexYXxvg.png" data-width="1822" data-height="952" src="https://cdn-images-1.medium.com/max/1200/1*ThDAkmcOrFnIWAzexYXxvg.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="38d5" id="38d5" class="graf graf--p graf-after--figure">In Event types uncheck the box for `All` and check the `Custom Event`, now you can see your custom events collected =):&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="61b1" id="61b1" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*uczTLHBWaYLOlQDGg2Jwuw.png" data-width="1465" data-height="707" data-is-featured="true" src="https://cdn-images-1.medium.com/max/1200/1*uczTLHBWaYLOlQDGg2Jwuw.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="6666" id="6666" class="graf graf--p graf-after--figure">To see the full code, you can click &lt;a href="https://github.com/wesleycamargo/Samples/tree/master/Application-Insights-Telemetry" data-href="https://github.com/wesleycamargo/Samples/tree/master/Application-Insights-Telemetry" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>.&lt;/p>&lt;p name="bfe8" id="bfe8" class="graf graf--p graf-after--p graf--trailing">I hope it can be useful, and see you in the next post! =D&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/8effd0bb0dd2">&lt;time class="dt-published" datetime="2021-01-03T15:06:38.947Z">January 3, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-collect-business-information-in-application-insights-8effd0bb0dd2" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-01-07_deploying-a-dotnet-core-app-in-azure-web-app-by-command-line-cede4f021951/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-01-07_deploying-a-dotnet-core-app-in-azure-web-app-by-command-line-cede4f021951/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Deploying a DotNet Core app in Azure Web App by command line&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Deploying a DotNet Core app in Azure Web App by command line&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you need to fast deploy your dotnet core App in Azure, but don’t want to configure an entire CI/CD Pipeline, check in this post on how…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="19a5" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="cbb5" id="cbb5" class="graf graf--h3 graf--leading graf--title">Deploying a DotNet Core app in Azure Web App by command line&lt;/h3>&lt;p name="ab7e" id="ab7e" class="graf graf--p graf-after--h3">If you need to fast deploy your dotnet core App in Azure, but don’t want to configure an entire CI/CD Pipeline, check in this post on how to deploy it!&lt;/p>&lt;p name="2076" id="2076" class="graf graf--p graf-after--p">To deploy the web app we will use a simple DotNet Core MVC application.&lt;/p>&lt;p name="cdc6" id="cdc6" class="graf graf--p graf-after--p">First of all, let´s create some parameters to prepare our resources. We are using a random id to avoid create the resources with some existing name:&lt;/p>&lt;figure name="7d99" id="7d99" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cbb5ba882ddc6910a5366a06a55a0ef8?file=AzureDeploymentGuide-DeployWebApp-AzCLI-Parametrization.ps1.js">&lt;/script>&lt;/figure>&lt;p name="6230" id="6230" class="graf graf--p graf-after--figure">To create the app, we will use an MVC Sample in the dotnet core templates. If you already have an existing project to deploy, skip the first line. We will prepare the publishing package with the dotnet core publish command and then zip it in a file:&lt;/p>&lt;figure name="ad24" id="ad24" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cbb5ba882ddc6910a5366a06a55a0ef8?file=AzureDeploymentGuide-DeployWebApp-AzCLI-CreateApp.ps1.js">&lt;/script>&lt;/figure>&lt;p name="5cbd" id="5cbd" class="graf graf--p graf-after--figure">In Azure, we will create a resource group and an app service plan, that are pre reqs to run a WebApp.&lt;/p>&lt;figure name="1a1a" id="1a1a" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cbb5ba882ddc6910a5366a06a55a0ef8?file=AzureDeploymentGuide-DeployWebApp-AzCLI-AzureResources.ps1.js">&lt;/script>&lt;/figure>&lt;p name="36cd" id="36cd" class="graf graf--p graf-after--figure">And finally, execute the deployment in the WebApp created above.&lt;/p>&lt;figure name="1b96" id="1b96" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cbb5ba882ddc6910a5366a06a55a0ef8?file=AzureDeploymentGuide-DeployWebApp-AzCLI-Deployment.ps1.js">&lt;/script>&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="05d0" id="05d0" class="graf graf--figure graf--layoutOutsetCenter graf-after--figure">&lt;img class="graf-image" data-image-id="1*LGnt_avJ0RbzxUxvWWKv4A.png" data-width="1237" data-height="624" data-is-featured="true" src="https://cdn-images-1.medium.com/max/1200/1*LGnt_avJ0RbzxUxvWWKv4A.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="0fef" id="0fef" class="graf graf--p graf-after--figure">To make it easier below is a full version of the script:&lt;/p>&lt;figure name="154f" id="154f" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cbb5ba882ddc6910a5366a06a55a0ef8?file=AzureDeploymentGuide-DeployWebApp-AzCLI.ps1.js">&lt;/script>&lt;/figure>&lt;p name="b263" id="b263" class="graf graf--p graf-after--figure graf--trailing">See you in the next post!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/cede4f021951">&lt;time class="dt-published" datetime="2021-01-07T08:01:16.495Z">January 7, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/deploying-a-dotnet-core-app-in-azure-web-app-by-command-line-cede4f021951" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-04-28_azure-reports--exporting-azure-resources-with-powershell-and-azure-cli-f0afb3c29122/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-04-28_azure-reports--exporting-azure-resources-with-powershell-and-azure-cli-f0afb3c29122/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure Reports: Exporting Azure resources with Powershell and Azure CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure Reports: Exporting Azure resources with Powershell and Azure CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
A common scenario when we work with DevOps and cloud is the need to export information about your resources. In this post, I’ll show the…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="4998" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="16b0" id="16b0" class="graf graf--h3 graf--leading graf--title">Azure Reports: Exporting Azure resources with Powershell and Azure CLI&lt;/h3>&lt;p name="dd65" id="dd65" class="graf graf--p graf-after--h3">A common scenario when we work with DevOps and cloud is the need to export information about your resources. In this post, I’ll show the simplest way to extract that with the command line.&lt;/p>&lt;figure name="6c2c" id="6c2c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*ItDdV0YdZCjm5u5T" data-width="1200" data-height="672" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*ItDdV0YdZCjm5u5T">&lt;/figure>&lt;p name="d444" id="d444" class="graf graf--p graf-after--figure">The idea of this post is to show the mechanism behind the extraction, I’ll run a simple command to recover the resources and choose some columns to export to a CSV file. You can use this as a base of more complex reports to handle properties, cross with other information, etc.&lt;/p>&lt;p name="ff27" id="ff27" class="graf graf--p graf-after--p">The first step is to connect in our Azure Account using Azure CLI (you can also do it using Azure Powershell), and recover all resources in our subscription:&lt;/p>&lt;figure name="a5b1" id="a5b1" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4d8dadeef36dd26a5a88192a8384be82.js?file=List-AzureResources-RecoveringResources.ps1.js">&lt;/script>&lt;/figure>&lt;p name="8f8b" id="8f8b" class="graf graf--p graf-after--figure">Then we create an Array List to populate, iterate on the resources recovered above, and add the needed fields on the array:&lt;/p>&lt;figure name="839b" id="839b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4d8dadeef36dd26a5a88192a8384be82.js?file=List-AzureResources-PopulatingList.ps1.js">&lt;/script>&lt;/figure>&lt;p name="2bc2" id="2bc2" class="graf graf--p graf-after--figure">Now we create a file name based on date and time to export the populated array. In my case I’m using the Delimiter “;”, as in my favorite regionalization this is the default pattern for CSV files. If this is not your case, you can remove that parameter.&lt;/p>&lt;figure name="c20c" id="c20c" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4d8dadeef36dd26a5a88192a8384be82.js?file=List-AzureResources-Exporting.ps1.js">&lt;/script>&lt;/figure>&lt;p name="0967" id="0967" class="graf graf--p graf-after--figure">This is the complete script, including the outputPath parameter:&lt;/p>&lt;figure name="e8a3" id="e8a3" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4d8dadeef36dd26a5a88192a8384be82.js?file=List-AzureResources.ps1.js">&lt;/script>&lt;/figure>&lt;p name="0388" id="0388" class="graf graf--p graf-after--figure">And this is the file exported:&lt;/p>&lt;figure name="06c9" id="06c9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*s2J6kTWmfhRKG0O86hqaHg.png" data-width="1320" data-height="721" src="https://cdn-images-1.medium.com/max/800/1*s2J6kTWmfhRKG0O86hqaHg.png">&lt;/figure>&lt;p name="4e57" id="4e57" class="graf graf--p graf-after--figure">This is the link for my GitHub repository, and the intention is to fill it with more complex reports :)&lt;/p>&lt;p name="1998" id="1998" class="graf graf--p graf-after--p">&lt;a href="https://github.com/wesleycamargo/AzureReports" data-href="https://github.com/wesleycamargo/AzureReports" class="markup--anchor markup--p-anchor" rel="nofollow noopener" target="_blank">https://github.com/wesleycamargo/AzureReports&lt;/a>&lt;/p>&lt;p name="be14" id="be14" class="graf graf--p graf-after--p graf--trailing">See you in the next post!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/f0afb3c29122">&lt;time class="dt-published" datetime="2021-04-28T15:31:36.873Z">April 28, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/azure-reports-exporting-azure-resources-with-powershell-and-azure-cli-f0afb3c29122" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-05-01_creating-a-pretty-git-log-61f312f45201/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-05-01_creating-a-pretty-git-log-61f312f45201/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating a pretty git log&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating a pretty git log&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Do you know git lg command? Git log command is very helpful, but sometimes, it can be a bit tricky to have a good view of your history…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="6dfc" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9bfe" id="9bfe" class="graf graf--h3 graf--leading graf--title">Creating a pretty git log&lt;/h3>&lt;p name="ed4e" id="ed4e" class="graf graf--p graf-after--h3">Do you know git lg command? Git log command is very helpful, but sometimes, it can be a bit tricky to have a good view of your history tree. I’ll show with simple commands how to improve that and create your customized log message :).&lt;/p>&lt;p name="5678" id="5678" class="graf graf--p graf-after--p">The default git log command brings a lot of useful information, as we can see in the picture below. But when you need to know which branch your commit was originally created, it didn’t give you a good tree view of that.&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="957f" id="957f" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="1*Plrw8Q_Ccx3CNgC3rHI20g.png" data-width="1522" data-height="841" src="https://cdn-images-1.medium.com/max/1200/1*Plrw8Q_Ccx3CNgC3rHI20g.png">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="7676" id="7676" class="graf graf--h3 graf-after--figure">Using git pretty formats&lt;/h3>&lt;p name="ba56" id="ba56" class="graf graf--p graf-after--h3">To solve that you can increment the git log command with pretty formats. The following formats are how I like to use, but you can check more options in the documentation: &lt;a href="https://git-scm.com/docs/pretty-formats" data-href="https://git-scm.com/docs/pretty-formats" class="markup--anchor markup--p-anchor" rel="nofollow noopener noopener" target="_blank">https://git-scm.com/docs/pretty-formats&lt;/a>.&lt;/p>&lt;figure name="1a53" id="1a53" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/062a35933acb91109db50c4f0dabbb2f?file=PrettyGitLog.ps1.js">&lt;/script>&lt;/figure>&lt;p name="3cc9" id="3cc9" class="graf graf--p graf-after--figure">And this is how it looks like:&lt;/p>&lt;figure name="a78b" id="a78b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*nCIM78R8xIR9lM1nkejF8Q.png" data-width="1345" data-height="1008" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*nCIM78R8xIR9lM1nkejF8Q.png">&lt;/figure>&lt;h3 name="ef4f" id="ef4f" class="graf graf--h3 graf-after--figure">Creating git alias&lt;/h3>&lt;p name="68ba" id="68ba" class="graf graf--p graf-after--h3">Type this command every time can be a bit complicated, but no one needs to memorize that :). We can create an alias with the command below:&lt;/p>&lt;figure name="9d14" id="9d14" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/062a35933acb91109db50c4f0dabbb2f?file=PrettyGitLog-Alias.ps1.js">&lt;/script>&lt;/figure>&lt;p name="ab75" id="ab75" class="graf graf--p graf-after--figure">Behind the scenes, the alias will change your git configurations adding a line to your &lt;code class="markup--code markup--p-code">~/.gitconfig&lt;/code> file. To check which are your current configuration you can execute the command&lt;code class="markup--code markup--p-code">git config — list&lt;/code> . It will list all your configurations, to see only alias type &lt;code class="markup--code markup--p-code">git config — get-regexp alias&lt;/code> .&lt;/p>&lt;p name="c989" id="c989" class="graf graf--p graf-after--p">So finally we can call the alias created with the &lt;code class="markup--code markup--p-code">git lg&lt;/code> command :)&lt;/p>&lt;p name="1592" id="1592" class="graf graf--p graf-after--p">I hope it can be useful, and see you in the next post!&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--fullWidth">&lt;figure name="af48" id="af48" class="graf graf--figure graf--layoutFillWidth graf-after--p">&lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*t_MOgMTr_f1N4qHN_R7KVA.png" data-width="1500" data-height="50" src="https://cdn-images-1.medium.com/max/2560/1*t_MOgMTr_f1N4qHN_R7KVA.png">&lt;/a>&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/61f312f45201">&lt;time class="dt-published" datetime="2021-05-01T10:33:52.008Z">May 1, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/creating-a-pretty-git-log-61f312f45201" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-05-29_dataops-automation---accessing-databricks-api-with-aad-service-principal-name-2904ec9ef7f8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-05-29_dataops-automation---accessing-databricks-api-with-aad-service-principal-name-2904ec9ef7f8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DataOps Automation — Accessing Databricks API with AAD Service Principal Name&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DataOps Automation — Accessing Databricks API with AAD Service Principal Name&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="dc0a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2b39" id="2b39" class="graf graf--h3 graf--leading graf--title">DataOps Automation — Accessing Databricks API with AAD Service Principal Name&lt;/h3>&lt;p name="6f43" id="6f43" class="graf graf--p graf-after--h3">Databricks is an Apache Spark tool for data engineering used to process and transform large amounts of data and explore running machine learning models.&lt;/p>&lt;p name="74f2" id="74f2" class="graf graf--p graf-after--p">In this post I’ll show how to call databricks API’s, an important resource to automate the deployment and resources creation.&lt;/p>&lt;figure name="a176" id="a176" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*r4Rwmx79PqTVP7A3ZlN8LA.png" data-width="1126" data-height="648" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*r4Rwmx79PqTVP7A3ZlN8LA.png">&lt;/figure>&lt;h3 name="bb19" id="bb19" class="graf graf--h3 graf-after--figure">Preparing Tokens&lt;/h3>&lt;p name="da42" id="da42" class="graf graf--p graf-after--h3">Yes, you read it right token&lt;strong class="markup--strong markup--p-strong">s&lt;/strong> in the plural, we need more than one token to perform authentication.&lt;/p>&lt;p name="e507" id="e507" class="graf graf--p graf-after--p">Actually, if your SPN is a user in your databricks workspace only the AAD token should be enough, but I believe that in most situations if you want to automate from scratch your workspace it will not be the case.&lt;/p>&lt;h4 name="2347" id="2347" class="graf graf--h4 graf-after--p">Creating AAD token&lt;/h4>&lt;p name="02c3" id="02c3" class="graf graf--p graf-after--h4">To create an AAD token it´s necessary the tenant Id of your subscription, an SPN Id, and SPN secret. If you don’t know how to create a Service Principal Name check it out here &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal" data-href="https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Create an Azure AD app &amp;amp; service principal in the portal — Microsoft identity platform | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="bd8d" id="bd8d" class="graf graf--p graf-after--p">For this, I have created the function below, as we will use it more than once.&lt;/p>&lt;figure name="ca02" id="ca02" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/51a7ff60a21c5fc60eb6792ae5844021?file=Get-ActiveDirectoryToken.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="9580" id="9580" class="graf graf--h4 graf-after--figure">Preparing HTTP header&lt;/h4>&lt;p name="7035" id="7035" class="graf graf--p graf-after--h4">As I mentioned before, we need two AAD Tokens if our SPN is not added as a user into databricks.&lt;/p>&lt;p name="e35f" id="e35f" class="graf graf--p graf-after--p">The first token is a databricks token. To create that we need to provide the databricks resource id (2ff814a6–3304–4ab8–85cb-cd0e6f879c1d).&lt;/p>&lt;p name="7ea7" id="7ea7" class="graf graf--p graf-after--p">If your SPN is a user in your databricks workspace, only this token should be enough.&lt;/p>&lt;p name="5a4c" id="5a4c" class="graf graf--p graf-after--p">The second one is the management endpoint token you also need to provide the resource id, in this case, it should be “&lt;a href="https://management.core.windows.net/" data-href="https://management.core.windows.net/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://management.core.windows.net/&lt;/a>”. Additionally, your SPN must have Contributor or Owner permissions on your databricks.&lt;/p>&lt;figure name="7927" id="7927" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/51a7ff60a21c5fc60eb6792ae5844021?file=Get-DatabricksHeaderFromSPN.ps1.js">&lt;/script>&lt;/figure>&lt;p name="2100" id="2100" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Creating the databricks Personal Access Token&lt;/strong>&lt;/p>&lt;p name="ad1a" id="ad1a" class="graf graf--p graf-after--p">With our header prepared, you just need to call the databricks API, consuming the methods that you need.&lt;/p>&lt;figure name="3072" id="3072" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/51a7ff60a21c5fc60eb6792ae5844021?file=Get-DatabricksClusters.ps1.js">&lt;/script>&lt;/figure>&lt;p name="2e99" id="2e99" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Complete Script&lt;/strong>&lt;/p>&lt;p name="9e0c" id="9e0c" class="graf graf--p graf-after--p">Below you can find the complete script, including the auxiliar functions :)&lt;/p>&lt;figure name="892c" id="892c" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/51a7ff60a21c5fc60eb6792ae5844021?file=Get-DatabricksClustersWithSPN.ps1.js">&lt;/script>&lt;/figure>&lt;p name="d932" id="d932" class="graf graf--p graf-after--figure graf--trailing">I hope it can help you, and see you in next post!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/2904ec9ef7f8">&lt;time class="dt-published" datetime="2021-05-29T14:24:43.256Z">May 29, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/dataops-automation-accessing-databricks-api-with-aad-service-principal-name-2904ec9ef7f8" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-06-15_dataops-automation---deploying-databricks-notebooks-with-azure-devops-yaml-pipelines-862096ec539c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-06-15_dataops-automation---deploying-databricks-notebooks-with-azure-devops-yaml-pipelines-862096ec539c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In this post, I will show an easy way how to deploy your Databricks notebooks using Azure DevOps and YAML pipelines.
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7a1b" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="6e78" id="6e78" class="graf graf--h3 graf--leading graf--title">DataOps Automation — Deploying Databricks notebooks with Azure DevOps YAML Pipelines&lt;/h3>&lt;p name="4fc9" id="4fc9" class="graf graf--p graf-after--h3">In this post, I will show an easy way how to deploy your Databricks notebooks using Azure DevOps and YAML pipelines.&lt;/p>&lt;p name="ffde" id="ffde" class="graf graf--p graf-after--p">This will be the first of a series of posts, showing how to deploy code and infrastructure of Data Platform tools. I created GitHub repo to keep the examples, so if you want you can check that here: &lt;a href="https://github.com/wesleycamargo/DataOps" data-href="https://github.com/wesleycamargo/DataOps" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">wesleycamargo/DataOps (github.com)&lt;/a> 🙂&lt;/p>&lt;figure name="db44" id="db44" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*7aLnpcc0eKFY3hptjG5W4Q.png" data-width="1126" data-height="659" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*7aLnpcc0eKFY3hptjG5W4Q.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="032a" id="032a" class="graf graf--h4 graf-after--figure">Project structure&lt;/h4>&lt;p name="2016" id="2016" class="graf graf--p graf-after--h4">The organization of this repo is based on components, so I’ll keep everything necessary to deploy some kind of component together. If you have a different structure, remember to update the yaml templates with your paths.&lt;/p>&lt;p name="ff05" id="ff05" class="graf graf--p graf-after--p">For databricks we have a &lt;code class="markup--code markup--p-code">/databricks&lt;/code> and a &lt;code class="markup--code markup--p-code">/src&lt;/code> folder, in the future it will be important to segregate from IaC code. You can have your project folders on this level, in my example, I have two notebooks inside a &lt;code class="markup--code markup--p-code">calculator&lt;/code> folder`.&lt;/p>&lt;figure name="ad2f" id="ad2f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*v-4dZZgIV3rrRXiZe6jcOA.png" data-width="238" data-height="150" src="https://cdn-images-1.medium.com/max/800/1*v-4dZZgIV3rrRXiZe6jcOA.png">&lt;figcaption class="imageCaption">Project structure — Image prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="d53d" id="d53d" class="graf graf--h4 graf-after--figure">Preparing artifacts&lt;/h4>&lt;p name="2a1f" id="2a1f" class="graf graf--p graf-after--h4">In the build stage, we will create a copy of our notebooks into a staging folder, and then publish them as build artifacts to be consumed later in the process.&lt;/p>&lt;p name="6254" id="6254" class="graf graf--p graf-after--p">We will copy all folders under &lt;code class="markup--code markup--p-code">/src&lt;/code> folder, so when we deploy that into databricks workspace all folders will be created into the workspace as well.&lt;/p>&lt;figure name="5c2b" id="5c2b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4e6ab9fc9127166f50fac39eea39c149?file=databricks-build.yml.js">&lt;/script>&lt;/figure>&lt;p name="8aa8" id="8aa8" class="graf graf--p graf-after--figure">If you run the pipeline now you already can see the artifacts and the structure:&lt;/p>&lt;figure name="4fba" id="4fba" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*zBile6BF8zXBHNK78lqPRQ.png" data-width="427" data-height="381" src="https://cdn-images-1.medium.com/max/800/1*zBile6BF8zXBHNK78lqPRQ.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="e8b6" id="e8b6" class="graf graf--h4 graf-after--figure">Setting variables&lt;/h4>&lt;p name="921e" id="921e" class="graf graf--p graf-after--h4">In the deployment stage, we will need to consume some sensitive information like your databricks Personal Access Token. To avoid hard coding this information and to keep this example simple, let&amp;#39;s create some variables in the pipeline.&lt;/p>&lt;figure name="cd42" id="cd42" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*YZkUdlCrfAwCZKOyL_Wo_g.png" data-width="571" data-height="401" src="https://cdn-images-1.medium.com/max/800/1*YZkUdlCrfAwCZKOyL_Wo_g.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;figure name="e457" id="e457" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*igdByvqLq-3bKW2Pvnl7JA.png" data-width="486" data-height="272" src="https://cdn-images-1.medium.com/max/800/1*igdByvqLq-3bKW2Pvnl7JA.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="cb3b" id="cb3b" class="graf graf--h4 graf-after--figure">Deploy&lt;/h4>&lt;p name="3dee" id="3dee" class="graf graf--p graf-after--h4">To deploy we will use a special kind of job called &lt;code class="markup--code markup--p-code">deployment &lt;/code>🙂, there are some advantages to use this instead of the regular job, but I’ll do not explore them now.&lt;/p>&lt;p name="2b64" id="2b64" class="graf graf--p graf-after--p">In the first step, we are setting up the python version to 3.x, to that we are using a task to abstract this activity.&lt;/p>&lt;p name="284c" id="284c" class="graf graf--p graf-after--p">In the second one, we are setting app our databricks workspace. Basically, we are creating a &lt;code class="markup--code markup--p-code">.databrickscfg&lt;/code> file with your token and databricks URL. To populate this file we need to consume the variables created before. So be sure that you have &lt;code class="markup--code markup--p-code">databricks.host&lt;/code> and &lt;code class="markup--code markup--p-code">databricks.token&lt;/code> create. We are also installing the databricks CLI to run on the next step.&lt;/p>&lt;p name="efa3" id="efa3" class="graf graf--p graf-after--p">And finally, in the last step we are importing the artifacts generated before using databricks CLI.&lt;/p>&lt;figure name="fd90" id="fd90" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4e6ab9fc9127166f50fac39eea39c149?file=databricks-deploy.yml.js">&lt;/script>&lt;/figure>&lt;p name="b6d7" id="b6d7" class="graf graf--p graf-after--figure">Below you can see the complete YAML template.&lt;/p>&lt;figure name="0458" id="0458" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/4e6ab9fc9127166f50fac39eea39c149?file=databricks-build-release.yml.js">&lt;/script>&lt;/figure>&lt;p name="af99" id="af99" class="graf graf--p graf-after--figure graf--trailing">Hope that post can help you and see you in the next post! 😃&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/862096ec539c">&lt;time class="dt-published" datetime="2021-06-15T16:54:07.073Z">June 15, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/dataops-automation-deploying-databricks-notebooks-with-azure-devops-yaml-pipelines-862096ec539c" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-07-24_dataops-automation---creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-07-24_dataops-automation---creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DataOps Automation — Creating Azure Data Factory with git integration using Bicep&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DataOps Automation — Creating Azure Data Factory with git integration using Bicep&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
An important feature available in Azure Data Factory is the git integration, which allows us to keep Azure Data Factory artifacts under…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d10f" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="33fd" id="33fd" class="graf graf--h3 graf--leading graf--title">DataOps Automation — Creating Azure Data Factory with git integration using Bicep&lt;/h3>&lt;p name="3bf1" id="3bf1" class="graf graf--p graf-after--h3">An important feature available in Azure Data Factory is the git integration, which allows us to keep Azure Data Factory artifacts under Source Control. This is a mandatory step to achieve Continuous Integration and Delivery later on, so why not configure this using Infrastructure as Code with Bicep in a fully automated way?&lt;/p>&lt;figure name="f5e1" id="f5e1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*HzDcdeTCGa9vVDuUQulXAQ.png" data-width="1128" data-height="662" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*HzDcdeTCGa9vVDuUQulXAQ.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;p name="13b1" id="13b1" class="graf graf--p graf-after--figure">In the &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" data-href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">official Microsoft documentation&lt;/a> there is a good topic explaining how to integrate Azure Data Factory with git, but through the Azure Portal. In this post, I will explain how to do that using Bicep, the new IaC language for Azure, to make it possible to include this step into your CI/CD process, and also how to deploy only on needed environments.&lt;/p>&lt;h3 name="3aa2" id="3aa2" class="graf graf--h3 graf-after--p">Azure Data Factory Git integration&lt;/h3>&lt;p name="f969" id="f969" class="graf graf--p graf-after--h3">Okay, but why do I need to use git on my ADF? To explain this, I’ll list some advantages that the git integration offers, taken from &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" data-href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Microsoft’s documentation&lt;/a>:&lt;/p>&lt;h4 name="188b" id="188b" class="graf graf--h4 graf-after--p">&lt;strong class="markup--strong markup--h4-strong">Source control&lt;/strong>&lt;/h4>&lt;p name="065f" id="065f" class="graf graf--p graf-after--h4">As your data factory workloads become crucial, you would want to integrate your factory with Git to leverage several source control benefits like the following:&lt;/p>&lt;ul class="postList">&lt;li name="c486" id="c486" class="graf graf--li graf-after--p">Ability to track/audit changes.&lt;/li>&lt;li name="5655" id="5655" class="graf graf--li graf-after--li">Ability to revert changes that introduced bugs.&lt;/li>&lt;/ul>&lt;h4 name="9285" id="9285" class="graf graf--h4 graf-after--li">&lt;strong class="markup--strong markup--h4-strong">Partial saves&lt;/strong>&lt;/h4>&lt;p name="4797" id="4797" class="graf graf--p graf-after--h4">When authoring against the data factory service, you can’t save changes as a draft and all publish must pass data factory validation. Whether your pipelines are not finished or you simply don’t want to lose changes if your computer crashes, git integration allows for incremental changes of data factory resources regardless of what state they are in. Configuring a git repository allows you to save changes, letting you only publish when you have tested your changes to your satisfaction.&lt;/p>&lt;h4 name="4dd7" id="4dd7" class="graf graf--h4 graf-after--p">Collaboration and control&lt;/h4>&lt;p name="823d" id="823d" class="graf graf--p graf-after--h4">If you have multiple team members contributing to the same factory, you may want to let your teammates collaborate with each other via a code review process. You can also set up your factory such that not every contributor has equal permissions. Some team members may only be allowed to make changes via Git and only certain people in the team are allowed to publish the changes to the factory.&lt;/p>&lt;h4 name="0517" id="0517" class="graf graf--h4 graf-after--p">Better CI/CD&lt;/h4>&lt;p name="d1df" id="d1df" class="graf graf--p graf-after--h4">If you are deploying to multiple environments with a &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">continuous delivery process&lt;/a>, git integration makes certain actions easier. Some of these actions include:&lt;/p>&lt;ul class="postList">&lt;li name="df28" id="df28" class="graf graf--li graf-after--p">Configure your release pipeline to trigger automatically as soon as there are any changes made to your ‘dev’ factory.&lt;/li>&lt;li name="64d2" id="64d2" class="graf graf--li graf-after--li">Customize the properties in your factory that are available as parameters in the Resource Manager template. It can be useful to keep only the required set of properties as parameters and have everything else hardcoded.&lt;/li>&lt;/ul>&lt;h4 name="d89a" id="d89a" class="graf graf--h4 graf-after--li">Better Performance&lt;/h4>&lt;p name="02e1" id="02e1" class="graf graf--p graf-after--h4">An average factory with git integration loads 10 times faster than one authoring against the data factory service. This performance improvement is because resources are downloaded via Git.&lt;/p>&lt;h3 name="b158" id="b158" class="graf graf--h3 graf-after--p">Git Integration is only for Development Environment&lt;/h3>&lt;p name="65b6" id="65b6" class="graf graf--p graf-after--h3">There are two flows recommended by Microsoft to perform CI/CD on ADF, (you can check it on &lt;a href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" data-href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>), in both cases the development happens in the Development Data Factory workspace only, and the artifacts are promoted through CI/CD deployments. It means that we should not create this integration for non-dev environments like UAT or Production. I will also cover how to identify the environment and create the integration only for your development environment :)&lt;/p>&lt;h3 name="5179" id="5179" class="graf graf--h3 graf-after--p">Creating Bicep templates for Azure Data Factory step by step&lt;/h3>&lt;p name="9459" id="9459" class="graf graf--p graf-after--h3">To keep the explanation simple, I’ll show each stage of the bicep file. Each stage is a deployable file that you can execute individually with the command&lt;/p>&lt;pre name="02b4" id="02b4" class="graf graf--pre graf-after--p">&lt;em class="markup--em markup--pre-em">az deployment group create -f &amp;lt;your file&amp;gt;.bicep -g &amp;lt;your resource group&amp;gt;&lt;/em>&lt;/pre>&lt;p name="cb4e" id="cb4e" class="graf graf--p graf-after--pre">In the end, we will have the complete file ready to use.&lt;/p>&lt;h4 name="c5be" id="c5be" class="graf graf--h4 graf-after--p">Creating Data Factory Workspace&lt;/h4>&lt;p name="5f1b" id="5f1b" class="graf graf--p graf-after--h4">In the first stage, we are creating only the workspace with the most basic configurations. You can see that for the location we are using the location of the Resource Group where we are executing this deployment.&lt;/p>&lt;figure name="e8f8" id="e8f8" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/13b8a4702a25082cc97b6630ecf761dd?file=datafactory.bicep.js">&lt;/script>&lt;/figure>&lt;h4 name="7ed3" id="7ed3" class="graf graf--h4 graf-after--figure">Linking GitHub with Azure Data Factory&lt;/h4>&lt;p name="e30f" id="e30f" class="graf graf--p graf-after--h4">In this stage we achieve the first goal of this post: create the &lt;strong class="markup--strong markup--p-strong">git integration. &lt;/strong>I include the parameters necessary to connect with a GitHub repo, and then a section into “properties”. Now lets check the parameters:&lt;/p>&lt;ol class="postList">&lt;li name="8e88" id="8e88" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">accountName &lt;/strong>-&lt;strong class="markup--strong markup--li-strong"> &lt;/strong>This is your GitHub/Azure DevOps account name.&lt;/li>&lt;li name="8d0d" id="8d0d" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">repositoryName &lt;/strong>- Name of your repository, pay attention that you don’t need your account name at the beginning.&lt;/li>&lt;li name="70cd" id="70cd" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">collaborationBranc &lt;/strong>- The branch that will be used to integrate your feature branches. It will depend on your branch stratety. For git flow, it should be developed branch, for GitHub Flow, master/main.&lt;/li>&lt;li name="4d08" id="4d08" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">rootFolder &lt;/strong>- The folder in your repo where the databricks artifacts will be versioned.&lt;/li>&lt;li name="8611" id="8611" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">projectName&lt;/strong> - This parameter is only used for Azure DevOps. It’s the Team Project name of your repo.&lt;/li>&lt;li name="06b8" id="06b8" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">type &lt;/strong>- This parameter defines if your repo is hosted on GitHub or Azure DevOps. For GitHub, the value must be:&lt;/li>&lt;/ol>&lt;pre name="489c" id="489c" class="graf graf--pre graf-after--li">FactoryGitHubConfiguration&lt;/pre>&lt;p name="e3e3" id="e3e3" class="graf graf--p graf-after--pre">For Azure Devops the value is:&lt;/p>&lt;pre name="1aad" id="1aad" class="graf graf--pre graf-after--p">FactoryVSTSConfiguration&lt;/pre>&lt;figure name="5db8" id="5db8" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*kPiiBIbO9dRU8xDRdSdOmg.png" data-width="682" data-height="443" src="https://cdn-images-1.medium.com/max/800/1*kPiiBIbO9dRU8xDRdSdOmg.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="ce6f" id="ce6f" class="graf graf--h4 graf-after--figure">Checking the environments&lt;/h4>&lt;p name="705c" id="705c" class="graf graf--p graf-after--h4">As was explained above, we must create git integration in the development environment only. If you are using only GitHub or only Azure DevOps, this stage should be enough for your scenario. To check that, we need the following steps:&lt;/p>&lt;ol class="postList">&lt;li name="57b0" id="57b0" class="graf graf--li graf-after--p">An environment parameter.&lt;/li>&lt;li name="b27f" id="b27f" class="graf graf--li graf-after--li">Extract the content of &lt;strong class="markup--strong markup--li-strong">repoConfiguration&lt;/strong> to an external variable.&lt;/li>&lt;li name="e615" id="e615" class="graf graf--li graf-after--li">Use a ternary if to check if the environment provided is development. If it is, then use the variable, if not, use an empty group.&lt;/li>&lt;/ol>&lt;figure name="bbca" id="bbca" class="graf graf--figure graf-after--li">&lt;img class="graf-image" data-image-id="1*sR-iArVHnrubuSbaaH4a4A.png" data-width="703" data-height="407" src="https://cdn-images-1.medium.com/max/800/1*sR-iArVHnrubuSbaaH4a4A.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;p name="25a8" id="25a8" class="graf graf--p graf-after--figure">The bicep file of this stage:&lt;/p>&lt;figure name="753b" id="753b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/13b8a4702a25082cc97b6630ecf761dd?file=datafactory-checkenvironment.bicep.js">&lt;/script>&lt;/figure>&lt;h4 name="1900" id="1900" class="graf graf--h4 graf-after--figure">Linking GitHub or Azure DevOps to Azure Data Factory&lt;/h4>&lt;p name="6d92" id="6d92" class="graf graf--p graf-after--h4">In case that in your scenario you have both Azure DevOps and GitHub, you can prepare your template to support that. This template is more flexible and can be used in more situations. Let’s check the differences from the previous one:&lt;/p>&lt;ol class="postList">&lt;li name="d708" id="d708" class="graf graf--li graf-after--p">Included a “User Friendly” parameter to indicate the type of the repo.&lt;/li>&lt;li name="1bb7" id="1bb7" class="graf graf--li graf-after--li">Check the type parameter and create a variable with the expected value.&lt;/li>&lt;li name="3955" id="3955" class="graf graf--li graf-after--li">Create two configurations, one for GitHub and one for Azure DevOps.&lt;/li>&lt;li name="a12d" id="a12d" class="graf graf--li graf-after--li">Include another ternary if nested into the first one&lt;/li>&lt;/ol>&lt;figure name="f4f6" id="f4f6" class="graf graf--figure graf-after--li">&lt;img class="graf-image" data-image-id="1*axZ5TeO8PChLhDkzhOEbhA.png" data-width="1160" data-height="691" src="https://cdn-images-1.medium.com/max/800/1*axZ5TeO8PChLhDkzhOEbhA.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;p name="7ab9" id="7ab9" class="graf graf--p graf-after--figure">Below you can check the final bicep template:&lt;/p>&lt;figure name="30c1" id="30c1" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/13b8a4702a25082cc97b6630ecf761dd?file=datafactory-complete.bicep.js">&lt;/script>&lt;/figure>&lt;h3 name="1785" id="1785" class="graf graf--h3 graf-after--figure">Real life example&lt;/h3>&lt;p name="d465" id="d465" class="graf graf--p graf-after--h3">To check these examples in more realistic situations, I have been working in a repository in GitHub with examples of pipelines configured and working. You can check that in the DevOps Nights GitHub here: &lt;a href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" data-href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>&lt;p name="6385" id="6385" class="graf graf--p graf-after--p">In &lt;a href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" data-href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>, I am showing how to consume this Bicep Template into an Azure DevOps Pipeline.&lt;/p>&lt;p name="e1cc" id="e1cc" class="graf graf--p graf-after--p">I hope this post can help you to create your ADF in a more automated way, and see you in the next post!&lt;/p>&lt;h4 name="84fa" id="84fa" class="graf graf--h4 graf-after--p">References&lt;/h4>&lt;p name="1f69" id="1f69" class="graf graf--p graf-after--h4">&lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" data-href="https://docs.microsoft.com/en-us/azure/data-factory/source-control#advantages-of-git-integration" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Source control — Azure Data Factory | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="6f13" id="6f13" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/rest/api/datafactory/factories/configure-factory-repo#factoryvstsconfiguration" data-href="https://docs.microsoft.com/en-us/rest/api/datafactory/factories/configure-factory-repo#factoryvstsconfiguration" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Factories — Configure Factory Repo — REST API (Azure Data Factory) | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="5055" id="5055" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.datafactory/factories?tabs=json" data-href="https://docs.microsoft.com/en-us/azure/templates/microsoft.datafactory/factories?tabs=json" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Microsoft.DataFactory/factories 2018–06–01 — ARM template reference | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/376fd3b5bc81">&lt;time class="dt-published" datetime="2021-07-24T22:48:52.111Z">July 24, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-08-13_azure-data-factory-ci-cd-made-simple--building-and-deploying-arm-templates-with-azure-devops-yaml--30c30595afa5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-08-13_azure-data-factory-ci-cd-made-simple--building-and-deploying-arm-templates-with-azure-devops-yaml--30c30595afa5/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML…&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML…&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
The easiest way to publish/deploy Azure Data Factory artifacts
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f4e8" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1c9e" id="1c9e" class="graf graf--h3 graf--leading graf--title">Azure Data Factory CI-CD made simple: Building and deploying ARM templates with Azure DevOps YAML Pipelines&lt;/h3>&lt;h4 name="03ef" id="03ef" class="graf graf--h4 graf-after--h3 graf--subtitle">The easiest way to publish/deploy Azure Data Factory artifacts&lt;/h4>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="a7b4" id="a7b4" class="graf graf--figure graf--layoutOutsetCenter graf-after--h4">&lt;img class="graf-image" data-image-id="1*qv6J2hpyUpXE7hkrBu-KjA.jpeg" data-width="3205" data-height="2404" data-is-featured="true" src="https://cdn-images-1.medium.com/max/1200/1*qv6J2hpyUpXE7hkrBu-KjA.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@andreasfelske?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@andreasfelske?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Andreas Felske&lt;/a> on &lt;a href="https://unsplash.com/photos/9GwMIek9jnY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/photos/9GwMIek9jnY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="0f41" id="0f41" class="graf graf--p graf-after--figure">If you work with Azure Data Factory, you probably noticed that the deployment process for this tool is unique. It is different from an API or website deployment as it generates ARM Templates and certainly at some point in time questioned “Why is so difficult to deploy it?”. Well, it doesn’t have to be…&lt;/p>&lt;h3 name="8e3b" id="8e3b" class="graf graf--h3 graf-after--p">Data Factory CI/CD — the old (and problematic) flow&lt;/h3>&lt;p name="ddc2" id="ddc2" class="graf graf--p graf-after--h3">Azure Data Factory is a great orchestration tool for the Big Data process. It has many integrations and capabilities that make the Data Engineer life very easy.&lt;/p>&lt;p name="90dc" id="90dc" class="graf graf--p graf-after--p">Although when we talk about deployments there are some tricks, for example, the &lt;strong class="markup--strong markup--p-strong">publish button &lt;/strong>inside the workspace, that is necessary to generate the ARM Templates to be deployed. Also, there is no deployment into the development environment, as you are already working there as an editor tool. This process’s a kind different comparing to other “traditional developments”, and this &lt;strong class="markup--strong markup--p-strong">manual step &lt;/strong>sends shivers down DevOps engineers spines:&lt;/p>&lt;figure name="9ff0" id="9ff0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*gb7Xo3KGFPcICqWn.png" data-width="862" data-height="643" src="https://cdn-images-1.medium.com/max/800/0*gb7Xo3KGFPcICqWn.png">&lt;figcaption class="imageCaption">Deployment from Azure Data Factory Workspace — Image from &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#current-cicd-flow" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#current-cicd-flow" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="8ddf" id="8ddf" class="graf graf--p graf-after--figure">It often creates discussions and “workarounds” to deal with this manual step. In some solutions, people move the generate ARM Templates from the adf_publish manually to the feature branch and create a new commit. In others, there is an integration using more than one repo, but again, start the deployment should be - again - a manual step.&lt;/p>&lt;p name="e587" id="e587" class="graf graf--p graf-after--p">On the older approach, the best solution from my point of view is to deploy using Azure Powershell, but it creates additional complexity as you need to control manually all elements that should be deployed, like linked services and pipelines.&lt;/p>&lt;h3 name="2972" id="2972" class="graf graf--h3 graf-after--p">Data Factory CI/CD — the new (and much better) flow&lt;/h3>&lt;p name="95cc" id="95cc" class="graf graf--p graf-after--h3">Fortunately, there is a new way to generate the ARM templates to be deployed, and you don’t need the workarounds mentioned above.&lt;/p>&lt;p name="dedf" id="dedf" class="graf graf--p graf-after--p">In this strategy, you basically validate and “build” your Data Factory JSON files into ARM Templates ready to be used. To make it work, you need to create a build pipeline and consume the &lt;a href="https://www.npmjs.com/package/@microsoft/azure-data-factory-utilities" data-href="https://www.npmjs.com/package/@microsoft/azure-data-factory-utilities" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">ADFUtilities NPM package&lt;/a>. This is much cleaner and the manual steps disappear :).&lt;/p>&lt;figure name="92c8" id="92c8" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*ROmkuAm2NMqLXJmH.png" data-width="977" data-height="654" src="https://cdn-images-1.medium.com/max/800/0*ROmkuAm2NMqLXJmH.png">&lt;figcaption class="imageCaption">Deployment with new Azure Data Factory flow — Image from &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#the-new-cicd-flow" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#the-new-cicd-flow" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="a160" id="a160" class="graf graf--p graf-after--figure graf--trailing">For more information, check the official documentation &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>.&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="7d30" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9ec2" id="9ec2" class="graf graf--h3 graf--leading">How to Create Azure Data Factory using IaC&lt;/h3>&lt;h4 name="00ca" id="00ca" class="graf graf--h4 graf-after--h3">Infrastructure as Code&lt;/h4>&lt;p name="8f6d" id="8f6d" class="graf graf--p graf-after--h4">There are tons of reasons to use IaC in your projects, as you can check &lt;a href="https://docs.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code#:~:text=Infrastructure%20as%20Code%20enables%20DevOps,to%20prevent%20common%20deployment%20issues." data-href="https://docs.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code#:~:text=Infrastructure%20as%20Code%20enables%20DevOps,to%20prevent%20common%20deployment%20issues." class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>. One of them is that Infrastructure as Code is the easiest and fast way to implement your environment. So, as we want to keep our ADF deployment simple, why not use it :)?&lt;/p>&lt;p name="9243" id="9243" class="graf graf--p graf-after--p">In this example, I will use &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Bicep &lt;/a>templates to deploy our Data Factory. If Bicep is new to you, it is basically a DSL (Domain Specific Language) to make things easier for ARM Templates users.&lt;/p>&lt;figure name="d9ac" id="d9ac" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*UxUKOY8oNniMGGHd.png" data-width="652" data-height="165" src="https://cdn-images-1.medium.com/max/800/0*UxUKOY8oNniMGGHd.png">&lt;figcaption class="imageCaption">Bicep is has a good extension for VS Code— Image from &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="6ace" id="6ace" class="graf graf--p graf-after--figure">In this &lt;a href="https://camargo-wes.medium.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" data-href="https://camargo-wes.medium.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">post&lt;/a>, you can check how to create the Bicep file for Data Factory with git integration that will be used to deploy the ADF.&lt;/p>&lt;p name="7b6b" id="7b6b" class="graf graf--p graf-after--p graf--trailing">It will create a link between your Azure Data Factory and your git repo (it works on Azure DevOps and GitHub), so when you create a pipeline in your Data Factory, it will also be versioned into the git repo.&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="a153" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="b731" id="b731" class="graf graf--h3 graf--leading">Git Repository&lt;/h3>&lt;h4 name="ffe1" id="ffe1" class="graf graf--h4 graf-after--h3">Repository Structure&lt;/h4>&lt;p name="8a83" id="8a83" class="graf graf--p graf-after--h4">The repo structure will depend on each project. One of the best practices is to keep all necessary code to deploy a project in the same repo. Due to that, I like to create a structure where I have the name of the component, and always an “src” folder underneath. In this case, we will make the src folder as “Root folder” in the git integration process.&lt;/p>&lt;figure name="1f12" id="1f12" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*YtAqSUP9bqM4NyrMgs3UIw.png" data-width="454" data-height="143" src="https://cdn-images-1.medium.com/max/800/1*YtAqSUP9bqM4NyrMgs3UIw.png">&lt;figcaption class="imageCaption">Repository Structure — Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="368c" id="368c" class="graf graf--h4 graf-after--figure">Required files to build ARM Templates&lt;/h4>&lt;p name="fc44" id="fc44" class="graf graf--p graf-after--h4">Some files are necessary to have in our repo to generate the templates. These files need to be added to the src folder, and they will be referenced during the build stage.&lt;/p>&lt;p name="85f7" id="85f7" class="graf graf--p graf-after--p">In the src folder create the file package.json. It contains the metadata of the package that will be used to build the ADF Artifacts.&lt;/p>&lt;figure name="88a6" id="88a6" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b8ffbdca84f7c364248e04c4649806fc?file=package.json.js">&lt;/script>&lt;/figure>&lt;p name="6a4c" id="6a4c" class="graf graf--p graf-after--figure">In the same folder also create the file publish_config.json with the content below. It will not impact the generation of the ARM Templates, but it’s necessary to run the build:&lt;/p>&lt;figure name="0425" id="0425" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b8ffbdca84f7c364248e04c4649806fc?file=publish_config.json.js">&lt;/script>&lt;/figure>&lt;p name="58f7" id="58f7" class="graf graf--p graf-after--figure">The last file is arm-template-parameters-definition.json. This contains the definitions of your ARM Parameters. I won’t go into details, as it requires a dedicated post for it. For the initial version, you can just create the content below:&lt;/p>&lt;figure name="a163" id="a163" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b8ffbdca84f7c364248e04c4649806fc?file=arm-template-parameters-definition.json.js">&lt;/script>&lt;/figure>&lt;p name="d700" id="d700" class="graf graf--p graf-after--figure">After create git integrate and all necessary files this is how your repo will look like:&lt;/p>&lt;figure name="bc28" id="bc28" class="graf graf--figure graf-after--p graf--trailing">&lt;img class="graf-image" data-image-id="1*xesC9GvPVvyOeHafv6EvXg.png" data-width="622" data-height="384" src="https://cdn-images-1.medium.com/max/800/1*xesC9GvPVvyOeHafv6EvXg.png">&lt;figcaption class="imageCaption">Repository structure for Azure Data Factory — Image by author&lt;/figcaption>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="3b93" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2688" id="2688" class="graf graf--h3 graf--leading">How to create Build YAML Pipelines for Azure Data Factory&lt;/h3>&lt;p name="a13c" id="a13c" class="graf graf--p graf-after--h3">No doubt that pipeline as code will be the future of pipeline definitions, with the capacity to be under version control and reusability.&lt;/p>&lt;h4 name="f62f" id="f62f" class="graf graf--h4 graf-after--p">Variables&lt;/h4>&lt;p name="7f5b" id="7f5b" class="graf graf--p graf-after--h4">The first configuration that is necessary is the variables. They will be used both for build and release later on.&lt;/p>&lt;p name="9a91" id="9a91" class="graf graf--p graf-after--p">The most important variables during the build stage are:&lt;/p>&lt;ol class="postList">&lt;li name="b317" id="b317" class="graf graf--li graf-after--p">workingDir - This is the src directory. There must be the required files mentioned above.&lt;/li>&lt;li name="00fa" id="00fa" class="graf graf--li graf-after--li">dataFactoryResourceId - Fill this with the resource Id of your ADF. It’s a good idea to make it parametrizable to work in different environments&lt;/li>&lt;/ol>&lt;figure name="410b" id="410b" class="graf graf--figure graf-after--li">&lt;img class="graf-image" data-image-id="1*Y8FG1YgQAtQCCysOutYifw.png" data-width="1515" data-height="261" src="https://cdn-images-1.medium.com/max/800/1*Y8FG1YgQAtQCCysOutYifw.png">&lt;figcaption class="imageCaption">Build and Deployment Variables — Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="93bd" id="93bd" class="graf graf--h4 graf-after--figure">Building Data Factory&lt;/h4>&lt;p name="8df9" id="8df9" class="graf graf--p graf-after--h4">As mentioned above, we need to consume the &lt;a href="https://www.npmjs.com/package/@microsoft/azure-data-factory-utilities" data-href="https://www.npmjs.com/package/@microsoft/azure-data-factory-utilities" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">ADFUtilities NPM package&lt;/a> in the build process.&lt;/p>&lt;p name="c2d2" id="c2d2" class="graf graf--p graf-after--p">In the first two tasks, NodeJS is configured in the build agent. Pay attention to workingDir variable that we mentioned in the Variables section.&lt;/p>&lt;p name="6d22" id="6d22" class="graf graf--p graf-after--p">In the latest two tasks, we are calling the NPM package to Validate and “Build” our Data Factory and Generate the ARM Templates. In the last task “artifacts” is the relative output directory. It means that it will be the output directory to the ARM Templates.&lt;/p>&lt;figure name="528d" id="528d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*hxff1a4SfxpSRAKGjak-7A.png" data-width="1527" data-height="865" src="https://cdn-images-1.medium.com/max/800/1*hxff1a4SfxpSRAKGjak-7A.png">&lt;figcaption class="imageCaption">Build tasks for Azure Data Factory — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="154a" id="154a" class="graf graf--p graf-after--figure">In the next tasks, we are copying the ARM Templates from the output to the staging directory, and “building“ the bicep files into ARM Templates. These ones will be used to create the Azure Data Factory Workspace.&lt;/p>&lt;figure name="358a" id="358a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*FzU20QATViUliVFKaujdlw.png" data-width="1522" data-height="773" src="https://cdn-images-1.medium.com/max/800/1*FzU20QATViUliVFKaujdlw.png">&lt;figcaption class="imageCaption">Build tasks for Azure Data Factory — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="9ad4" id="9ad4" class="graf graf--p graf-after--figure">After running the build pipeline, you will have the artifacts that will be consumed during the deployment stage:&lt;/p>&lt;figure name="3c7a" id="3c7a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*xLM1sqP0zF8ToLhmWy84bA.png" data-width="1223" data-height="683" src="https://cdn-images-1.medium.com/max/800/1*xLM1sqP0zF8ToLhmWy84bA.png">&lt;figcaption class="imageCaption">Azure Data Factory artifacts — Image by author&lt;/figcaption>&lt;/figure>&lt;figure name="3484" id="3484" class="graf graf--figure graf-after--figure graf--trailing">&lt;img class="graf-image" data-image-id="1*KokLuIz66bVH_C8D9MqvGA.png" data-width="773" data-height="726" src="https://cdn-images-1.medium.com/max/800/1*KokLuIz66bVH_C8D9MqvGA.png">&lt;figcaption class="imageCaption">Azure Data Factory ARM Templates — Image by author&lt;/figcaption>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="8814" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="aab7" id="aab7" class="graf graf--h3 graf--leading">How to create Release YAML Pipelines for Azure Data Factory&lt;/h3>&lt;p name="d5fb" id="d5fb" class="graf graf--p graf-after--h3">To deploy Data Factory we are using the run Once strategy. It will consume the artifacts created on the build stage&lt;/p>&lt;h4 name="2edb" id="2edb" class="graf graf--h4 graf-after--p">Development&lt;/h4>&lt;p name="1011" id="1011" class="graf graf--p graf-after--h4">When the git integration is enabled in development environment, as the code is produced in the workspace, there is no need to publish in this environment. It will deploy only the environment using the Infrastructure as Code templates. It also contains a dependency for the build stage.&lt;/p>&lt;figure name="f9b7" id="f9b7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*1CyHziX8HIxTiFKWd1AHJw.png" data-width="1332" data-height="905" src="https://cdn-images-1.medium.com/max/800/1*1CyHziX8HIxTiFKWd1AHJw.png">&lt;figcaption class="imageCaption">Development environment — Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="709f" id="709f" class="graf graf--h4 graf-after--figure">UAT and Production&lt;/h4>&lt;p name="4f1a" id="4f1a" class="graf graf--p graf-after--h4">In UAT we have a dependency on the development environment. In Production, the dependency is on UAT. As in these stages, we need to deploy both, infrastructure and code, we will use a preDeploy and deploy job:&lt;/p>&lt;figure name="a6a4" id="a6a4" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*H7fXBNZIabhKW5BEoxT2Lw.png" data-width="695" data-height="496" src="https://cdn-images-1.medium.com/max/800/1*H7fXBNZIabhKW5BEoxT2Lw.png">&lt;figcaption class="imageCaption">preDeploy stage — Image by author&lt;/figcaption>&lt;/figure>&lt;figure name="e7ec" id="e7ec" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*TK9afdqzBDdiE2m1791joQ.png" data-width="1595" data-height="460" src="https://cdn-images-1.medium.com/max/800/1*TK9afdqzBDdiE2m1791joQ.png">&lt;figcaption class="imageCaption">deploy stage — Image by Author&lt;/figcaption>&lt;/figure>&lt;p name="e14b" id="e14b" class="graf graf--p graf-after--figure">When run it will first create the Infrastructure using the Bicep files in the preDeploy Stage, and then deploy the artifacts generated on the build stage. And this is the final result:&lt;/p>&lt;figure name="cd7b" id="cd7b" class="graf graf--figure graf-after--p graf--trailing">&lt;img class="graf-image" data-image-id="1*D1TW--IjWUMr1c-TR5CNYQ.png" data-width="1047" data-height="345" src="https://cdn-images-1.medium.com/max/800/1*D1TW--IjWUMr1c-TR5CNYQ.png">&lt;figcaption class="imageCaption">Deployment Pipeline — Image by Author&lt;/figcaption>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="116e" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5e2a" id="5e2a" class="graf graf--h3 graf--leading">Key Takeaways&lt;/h3>&lt;p name="9594" id="9594" class="graf graf--p graf-after--h3">There is more than one strategy to deploy Azure Data Factory, I have tried most of them and they work very well, but this one from my point of view is the simplest and clean way to achieve fully automated deployments.&lt;/p>&lt;p name="692a" id="692a" class="graf graf--p graf-after--p">Below you can check the complete YAML used to deploy it. You can also check other Azure DevOps YAML Templates examples in my GitHub repo: &lt;a href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" data-href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>&lt;p name="0fd2" id="0fd2" class="graf graf--p graf-after--p">I hope it can be useful!&lt;/p>&lt;figure name="bde1" id="bde1" class="graf graf--figure graf--iframe graf-after--p graf--trailing">&lt;script src="https://gist.github.com/wesleycamargo/b8ffbdca84f7c364248e04c4649806fc?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/30c30595afa5">&lt;time class="dt-published" datetime="2021-08-13T16:24:55.251Z">August 13, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-08-20_creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines-4bf85be30cc7/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-08-20_creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines-4bf85be30cc7/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Continuing the DataOps Automation series, in this post I will demonstrate how to create your Databricks workspace using Infrastructure as…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b4c4" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="41eb" id="41eb" class="graf graf--h3 graf--leading graf--title">Creating Azure Databricks with Bicep and Azure DevOps YAML Pipelines&lt;/h3>&lt;h4 name="40d3" id="40d3" class="graf graf--h4 graf-after--h3 graf--subtitle">Continuing the DataOps Automation series, in this post I will demonstrate how to create your Databricks workspace using Infrastructure as Code with Bicep and Azure DevOps YAML Pipelines to deploy it in Azure. Let’s check it out!&lt;/h4>&lt;figure name="d329" id="d329" class="graf graf--figure graf-after--h4">&lt;img class="graf-image" data-image-id="1*q45YY42etgKPognuoFZJmA.jpeg" data-width="3778" data-height="5667" src="https://cdn-images-1.medium.com/max/800/1*q45YY42etgKPognuoFZJmA.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@benjopen?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@benjopen?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Benjamin Jopen&lt;/a> on &lt;a href="https://unsplash.com/s/photos/brick-construction?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/brick-construction?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="abe4" id="abe4" class="graf graf--p graf-after--figure">In the previous articles, you can check how to&lt;a href="https://towardsdatascience.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" data-href="https://towardsdatascience.com/dataops-automation-creating-azure-data-factory-with-git-integration-using-bicep-376fd3b5bc81" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank"> create an Azure Data Factory with git integration using Bicep&lt;/a> and also the &lt;a href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" data-href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">easiest way to create a CI/CD pipeline for Azure Data Factory&lt;/a>&lt;/p>&lt;p name="17a5" id="17a5" class="graf graf--p graf-after--p">At the end of the post, you can check a complete YAML pipeline read to be used!&lt;/p>&lt;h3 name="89db" id="89db" class="graf graf--h3 graf-after--p">What is a Bicep template?&lt;/h3>&lt;p name="fafc" id="fafc" class="graf graf--p graf-after--h3">If you are not familiar with Bicep, this is a DSL for the ARM Templates, that has a cleaner syntax, better support to modules, and other great features. It also has a nice &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/quickstart-create-bicep-use-visual-studio-code?tabs=CLI&amp;amp;WT.mc_id=devops-34401-jagord" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/quickstart-create-bicep-use-visual-studio-code?tabs=CLI&amp;amp;WT.mc_id=devops-34401-jagord" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Visual Studio Code extension &lt;/a>that helps a lot in building templates from scratch.&lt;/p>&lt;figure name="5164" id="5164" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*FsceF8fsND7cZ2BM.png" data-width="652" data-height="165" src="https://cdn-images-1.medium.com/max/800/0*FsceF8fsND7cZ2BM.png">&lt;figcaption class="imageCaption">Nice extension for Visual Studio Code! — Image from &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/install#development-environment" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="8f4d" id="8f4d" class="graf graf--p graf-after--figure">When you run a deployment using a bicep template, it transpile the file and generates a native ARM Template, similar to what happens between Typescript and Javascript.&lt;/p>&lt;p name="41be" id="41be" class="graf graf--p graf-after--p">If you want to learn more about it, check the official documentation &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>.&lt;/p>&lt;h3 name="0931" id="0931" class="graf graf--h3 graf-after--p">Creating the Infrastructure as Code for Azure Databricks&lt;/h3>&lt;h4 name="c69d" id="c69d" class="graf graf--h4 graf-after--h3">Creating a Resource Group with Azure CLI&lt;/h4>&lt;p name="0551" id="0551" class="graf graf--p graf-after--h4">To deploy our Databricks workspace we need to have a Resource Group created in your Azure Subscription. The easiest way to do that is through Azure CLI. To do that you need to log in with the command &lt;code class="markup--code markup--p-code">az login&lt;/code> and then run the following command:&lt;/p>&lt;pre name="1078" id="1078" class="graf graf--pre graf-after--p">az group create -name RG-Databricks -location northeurope&lt;/pre>&lt;p name="e4d0" id="e4d0" class="graf graf--p graf-after--pre">Replace the parameters name and location for those that best suit your needs.&lt;/p>&lt;h4 name="7825" id="7825" class="graf graf--h4 graf-after--p">Creating Bicep templates for Azure Databricks&lt;/h4>&lt;p name="1a44" id="1a44" class="graf graf--p graf-after--h4">The Bicep template for Azure Databricks it’s quite simple and has 4 main sections:&lt;/p>&lt;p name="848e" id="848e" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Parameters:&lt;/strong>&lt;/p>&lt;ul class="postList">&lt;li name="beb1" id="beb1" class="graf graf--li graf-after--p">Workspace Name: If you do not provide a value, it uses a &lt;code class="markup--code markup--li-code">uniqueString&lt;/code> function, which ensures that it will always be the same, as this is based on the resource group id.&lt;/li>&lt;li name="f21e" id="f21e" class="graf graf--li graf-after--li">Location: By default, this is using the resource group location&lt;/li>&lt;li name="d277" id="d277" class="graf graf--li graf-after--li">SKU: The default value is trial, so be sure to replace it in your real-life scenario ;).&lt;/li>&lt;/ul>&lt;figure name="a820" id="a820" class="graf graf--figure graf--iframe graf-after--li">&lt;script src="https://gist.github.com/wesleycamargo/141accbfe022118811f6b9519306d67f?file=databricks.bicep.js">&lt;/script>&lt;/figure>&lt;p name="d297" id="d297" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Variables: &lt;/strong>The template also has the variable &lt;code class="markup--code markup--p-code">managedResourceGroupName&lt;/code> . This resource group will be managed by Azure Databricks to create your clusters later on.&lt;/p>&lt;p name="7160" id="7160" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Resources: &lt;/strong>Here we have only one resource that is the Databrics Workspace. This is consuming the API version &lt;code class="markup--code markup--p-code">2018–04–01&lt;/code> .&lt;/p>&lt;p name="c0f2" id="c0f2" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Output: &lt;/strong>This section contains the variables that you need to expose. It means that they can be accessed by other processes later on in your deployment process.&lt;/p>&lt;h3 name="6ae4" id="6ae4" class="graf graf--h3 graf-after--p">Deploying Bicep with Azure DevOps YAML Pipelines&lt;/h3>&lt;h4 name="b242" id="b242" class="graf graf--h4 graf-after--h3">Building Bicep Template&lt;/h4>&lt;p name="f594" id="f594" class="graf graf--p graf-after--h4">As I said before, it is possible to “build” the Bicep template transpiling it into an ARM Template. So to ensure that our template is valid, let’s do it!&lt;/p>&lt;p name="bfb9" id="bfb9" class="graf graf--p graf-after--p">To build it, you will also use the Azure CLI. The command is also quite simple:&lt;/p>&lt;pre name="546f" id="546f" class="graf graf--pre graf-after--p">az bicep build --file &amp;lt;your file&amp;gt; --outdir &amp;lt;your directory&amp;gt;&lt;/pre>&lt;p name="7ea3" id="7ea3" class="graf graf--p graf-after--pre">To create an Azure DevOps YAML Pipeline, we will run the command above in an AzureCLI task:&lt;/p>&lt;figure name="d311" id="d311" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/141accbfe022118811f6b9519306d67f?file=azure-pipelines-build.yml.js">&lt;/script>&lt;/figure>&lt;p name="0fbe" id="0fbe" class="graf graf--p graf-after--figure">After transpile the Bicep into ARM Template, it will deploy as a Deployment Artefact read to be consumed:&lt;/p>&lt;figure name="ed4b" id="ed4b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*GhTEFX4p8uW0MOolGJJRsQ.png" data-width="1205" data-height="637" src="https://cdn-images-1.medium.com/max/800/1*GhTEFX4p8uW0MOolGJJRsQ.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;figure name="04d9" id="04d9" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*GsfTVy6oBm0Deal_YVFUcw.png" data-width="397" data-height="370" src="https://cdn-images-1.medium.com/max/800/1*GsfTVy6oBm0Deal_YVFUcw.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;p name="9da9" id="9da9" class="graf graf--p graf-after--figure">Build your Bicep is a good practice, as you can validate that there is no error in it and gather all necessary files to be deployed.&lt;/p>&lt;h4 name="99ba" id="99ba" class="graf graf--h4 graf-after--p">Deploying Bicep with YAML Pipelines&lt;/h4>&lt;p name="c504" id="c504" class="graf graf--p graf-after--h4">With the artifacts generated in the build step, now we are ready to deploy them in our environment. For that it is necessary to add one more stage into the build YAML, with the instruction to run the ARM Template:&lt;/p>&lt;figure name="d36a" id="d36a" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/141accbfe022118811f6b9519306d67f?file=azure-pipelines-deploy.yml.js">&lt;/script>&lt;/figure>&lt;p name="8a82" id="8a82" class="graf graf--p graf-after--figure">It consumes the task &lt;code class="markup--code markup--p-code">AzureResourceManagerTemplateDeployment@3&lt;/code> that is responsible to run the ARM Template into Azure Subscription. You can have more information about this task &lt;a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-resource-group-deployment?view=azure-devops" data-href="https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/azure-resource-group-deployment?view=azure-devops" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>.&lt;/p>&lt;p name="b05e" id="b05e" class="graf graf--p graf-after--p">This stage represents the development stage. To deploy it in other environments, you just need to copy it and replace the values according to your environments :)&lt;/p>&lt;h3 name="4034" id="4034" class="graf graf--h3 graf-after--p">Real life example&lt;/h3>&lt;p name="d57e" id="d57e" class="graf graf--p graf-after--h3">To check these examples in more realistic situations, I have been working in a GitHub repository with examples of pipelines configured and working. You can check that in the DevOps Nights GitHub here: &lt;a href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" data-href="https://github.com/devopsnights/azuredevops-yaml-quickstart-templates" class="markup--anchor markup--p-anchor" rel="noopener nofollow noopener" target="_blank">devopsnights/azuredevops-yaml-quickstart-templates (github.com)&lt;/a>&lt;/p>&lt;h3 name="a2f1" id="a2f1" class="graf graf--h3 graf-after--p">Databricks YAML Pipeline&lt;/h3>&lt;p name="0e9a" id="0e9a" class="graf graf--p graf-after--h3">As promised below you can check a full Azure DevOps YAML Pipeline configured and working:&lt;/p>&lt;figure name="85bd" id="85bd" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/141accbfe022118811f6b9519306d67f?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="6f86" id="6f86" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="573f" id="573f" class="graf graf--p graf-after--h3">Bicep has become a very relevant tool for Azure and has a good potential to be the default tool for Infrastructure as Code in Azure. So start to be familiar with it now, will be very relevant in the future :)&lt;/p>&lt;p name="a877" id="a877" class="graf graf--p graf-after--p graf--trailing">I hope this post could help you, and see you in the next post!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/4bf85be30cc7">&lt;time class="dt-published" datetime="2021-08-20T17:45:12.653Z">August 20, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/creating-azure-databricks-with-bicep-and-azure-devops-yaml-pipelines-4bf85be30cc7" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-10-18_hello-eric--alexandr-is-right--you-need-to-pass-the-empty-object-to-validation-works--9ef426020259/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-10-18_hello-eric--alexandr-is-right--you-need-to-pass-the-empty-object-to-validation-works--9ef426020259/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Hello Eric, Alexandr is right, you need to pass the empty object to validation works.&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Hello Eric, Alexandr is right, you need to pass the empty object to validation works.&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="cfaf" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="f31b" id="f31b" class="graf graf--p graf--leading graf--trailing">Hello Eric, Alexandr is right, you need to pass the empty object to validation works.&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/9ef426020259">&lt;time class="dt-published" datetime="2021-10-18T12:08:02.780Z">October 18, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/hello-eric-alexandr-is-right-you-need-to-pass-the-empty-object-to-validation-works-9ef426020259" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-12-20_how-to-suppress-warning-and-error-messages-in-azure-cli-34cece53591c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-12-20_how-to-suppress-warning-and-error-messages-in-azure-cli-34cece53591c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to suppress warning and error messages in Azure CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to suppress warning and error messages in Azure CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In Azure CLI some commands can return errors and warning messages, which can cause troubles on your script, so check out how to suppress it
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="3aa5" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5aab" id="5aab" class="graf graf--h3 graf--leading graf--title">How to suppress warning and error messages in Azure CLI&lt;/h3>&lt;h4 name="5d6a" id="5d6a" class="graf graf--h4 graf-after--h3 graf--subtitle">In Azure CLI some commands can return errors and warning messages, which can cause troubles on your script, so check out how to suppress it&lt;/h4>&lt;figure name="e0d9" id="e0d9" class="graf graf--figure graf-after--h4">&lt;img class="graf-image" data-image-id="0*CRHG3CI34LabcOV4.jpeg" data-width="700" data-height="466" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*CRHG3CI34LabcOV4.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@ahsanjaya?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@ahsanjaya?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Muhammad Daudy&lt;/a> on &lt;a href="https://unsplash.com/s/photos/warning?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/warning?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="6481" id="6481" class="graf graf--h3 graf-after--figure">How to suppress warnings on Azure CLI&lt;/h3>&lt;h4 name="a8c7" id="a8c7" class="graf graf--h4 graf-after--h3">Command group is in preview and under development&lt;/h4>&lt;p name="a951" id="a951" class="graf graf--p graf-after--h4">In some cases the CLI used can be under development and show the message: &lt;code class="markup--code markup--p-code u-paddingRight0 u-marginRight0">Command group is in preview and under development. Reference and support levels: &lt;a href="https://aka.ms/CLI_refstatus" data-href="https://aka.ms/CLI_refstatus" class="markup--anchor markup--p-anchor" rel="noopener ugc nofollow noopener" target="_blank">https://aka.ms/CLI_refstatus&lt;/a>&lt;/code>&lt;/p>&lt;p name="b65c" id="b65c" class="graf graf--p graf-after--p">At the moment that I am writing this post, the az devops CLI variable-group for example is always returning the message above, which have been causing troubles and breaking my pester tests :)&lt;/p>&lt;figure name="614c" id="614c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*SHfQUJPYn9MuJ-i3.png" data-width="700" data-height="82" src="https://cdn-images-1.medium.com/max/800/0*SHfQUJPYn9MuJ-i3.png">&lt;figcaption class="imageCaption">Photo prepared by author&lt;/figcaption>&lt;/figure>&lt;h4 name="fafb" id="fafb" class="graf graf--h4 graf-after--figure">Quiet mode on Azure CLI&lt;/h4>&lt;p name="c908" id="c908" class="graf graf--p graf-after--h4">For Azure CLI, the simplest way to make the commands “quiet” is by adding the global parameter &lt;code class="markup--code markup--p-code">--only-show-errors&lt;/code> in your command. &lt;strong class="markup--strong markup--p-strong">It will suppress only the warnings &lt;/strong>and keep the message in case you have any errors during the execution.&lt;/p>&lt;p name="c1f4" id="c1f4" class="graf graf--p graf-after--p">So in our example for &lt;code class="markup--code markup--p-code">az pipelines variable-group&lt;/code> our command will be like this:&lt;/p>&lt;pre name="024d" id="024d" class="graf graf--pre graf-after--p">az pipelines variable-group list --org $organization -p $project --only-show-errors&lt;/pre>&lt;h3 name="7632" id="7632" class="graf graf--h3 graf-after--pre">How to suppress errors on Azure CLI&lt;/h3>&lt;p name="283f" id="283f" class="graf graf--p graf-after--h3">In some cases, you may need to also suppress the errors during your script execution and there is one more option for it. I would recommend this approach only if you really do not care if something went wrong during your script execution.&lt;/p>&lt;h3 name="3b0f" id="3b0f" class="graf graf--h3 graf-after--p">Redirecting the console output STDERR&lt;/h3>&lt;p name="4fc8" id="4fc8" class="graf graf--p graf-after--h3">A common scenario to redirect streams is when the symbol &lt;code class="markup--code markup--p-code">&amp;gt;&lt;/code> is used to write the output of the command in a file. It redirects the standard output - STDOUT - to the file added as a parameter.&lt;/p>&lt;p name="2b48" id="2b48" class="graf graf--p graf-after--p">In the situation that is necessary to suppress the errors, we need to redirect the output of the error stream — STDERR.&lt;/p>&lt;p name="3ee6" id="3ee6" class="graf graf--p graf-after--p">To do it you simply need to add &lt;code class="markup--code markup--p-code">2&amp;gt;nul&lt;/code> after the CLI command, which means that the second stream (STDERR) will be redirected to &lt;code class="markup--code markup--p-code">null&lt;/code> .&lt;/p>&lt;p name="a99d" id="a99d" class="graf graf--p graf-after--p">So in our example for &lt;code class="markup--code markup--p-code">az pipelines variable-group&lt;/code> the command will be:&lt;/p>&lt;pre name="cdef" id="cdef" class="graf graf--pre graf-after--p">az pipelines variable-group list --org $organization -p $project 2&amp;gt;nul&lt;/pre>&lt;h3 name="b680" id="b680" class="graf graf--h3 graf-after--pre">Conclusion&lt;/h3>&lt;p name="afbb" id="afbb" class="graf graf--p graf-after--h3">Although this topic looks simple, sometimes it’s not so easy to find this information in the documentation, especially regarding the error suppressing topic, and also the comparison of both approaches is not documented.&lt;/p>&lt;p name="1633" id="1633" class="graf graf--p graf-after--p">I grouped both, how to suppress warnings and errors in one place, so would be to choose which option suits better in each scenario.&lt;/p>&lt;h3 name="331f" id="331f" class="graf graf--h3 graf-after--p">References&lt;/h3>&lt;p name="63e3" id="63e3" class="graf graf--p graf-after--h3">&lt;a href="https://docs.microsoft.com/en-us/troubleshoot/cpp/redirecting-error-command-prompt" data-href="https://docs.microsoft.com/en-us/troubleshoot/cpp/redirecting-error-command-prompt" class="markup--anchor markup--p-anchor" rel="noopener ugc nofollow noopener" target="_blank">Redirecting error from Command Prompt — Visual C++ | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="4569" id="4569" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://github.com/Azure/azure-cli/issues/13384" data-href="https://github.com/Azure/azure-cli/issues/13384" class="markup--anchor markup--p-anchor" rel="noopener ugc nofollow noopener" target="_blank">https://github.com/Azure/azure-cli/issues/13384&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/34cece53591c">&lt;time class="dt-published" datetime="2021-12-20T08:02:01.951Z">December 20, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-suppress-warnings-and-errors-messages-in-azure-cli-34cece53591c" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2021-12-30_how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2021-12-30_how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to extend an Azure DevOps YAML Pipeline Template&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to extend an Azure DevOps YAML Pipeline Template&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you need to control what is allowed during your deployment, extending the YAML Templates is the easiest way to know what is being done…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="9ab5" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="61b2" id="61b2" class="graf graf--h3 graf--leading graf--title">How to extend an Azure DevOps YAML Pipeline Template&lt;/h3>&lt;p name="e1a4" id="e1a4" class="graf graf--p graf-after--h3">If you need to control what is allowed during your deployment, extending the YAML Templates is the easiest way to know what is being done on your deployments.&lt;/p>&lt;figure name="433c" id="433c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*8JQMH109KuJHKrUubmjxqA.jpeg" data-width="5188" data-height="3459" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*8JQMH109KuJHKrUubmjxqA.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@zonduurzaam?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@zonduurzaam?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Zonduurzaam Deventer&lt;/a> on &lt;a href="https://unsplash.com/s/photos/power-strip?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/power-strip?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="62fa" id="62fa" class="graf graf--h3 graf-after--figure">Azure DevOps YAML Templates&lt;/h3>&lt;p name="dadf" id="dadf" class="graf graf--p graf-after--h3">YAML Templates are the smartest way to create your pipelines. It allows you to break down the pipelines into small pieces reusing your logic, which leads to some best practices as &lt;em class="markup--em markup--p-em">Don&amp;#39;t Repeat Yourself &lt;/em>and&lt;em class="markup--em markup--p-em"> Dependency Inversion.&lt;/em>&lt;/p>&lt;p name="81ed" id="81ed" class="graf graf--p graf-after--p">It’s also possible to use the &lt;em class="markup--em markup--p-em">Declarative &lt;/em>instead of the &lt;em class="markup--em markup--p-em">Imperative&lt;/em> approach, therefore who will consume your pipelines does not need to know the details of how to deploy an application, but just say what is necessary to deploy.&lt;/p>&lt;p name="b900" id="b900" class="graf graf--p graf-after--p">With these principles being correctly applied, it is possible to build a reliable and robust way to deploy new applications, but who will consume it doesn’t need to be a DevOps expert.&lt;/p>&lt;h3 name="f3dd" id="f3dd" class="graf graf--h3 graf-after--p">Creating an Azure DevOps YAML Templates&lt;/h3>&lt;h4 name="bf04" id="bf04" class="graf graf--h4 graf-after--h3">Parameters on Azure DevOps YAML Templates&lt;/h4>&lt;p name="ae28" id="ae28" class="graf graf--p graf-after--h4">On top of the template, the first section is &lt;code class="markup--code markup--p-code">parameters&lt;/code> . As our goal is to make the templates reusable, makes complete sense to have a way to change values according to which application is consuming the template. To keep it simple in this example, it was parametrized the application name.&lt;/p>&lt;pre name="440f" id="440f" class="graf graf--pre graf-after--p">parameters:&lt;br> - name: applicationName&lt;br> type: string&lt;/pre>&lt;h4 name="3f7d" id="3f7d" class="graf graf--h4 graf-after--pre">Stages on Azure DevOps YAML Templates&lt;/h4>&lt;p name="59a4" id="59a4" class="graf graf--p graf-after--h4">To have an extendible template, it must be created on the level of the stages. This example has two of them, one for build and one more for development environment. &lt;br>Below you can check the full template script:&lt;/p>&lt;figure name="546e" id="546e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b5f5b29229129bc6401ff91060daf739?file=template.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="65f2" id="65f2" class="graf graf--h3 graf-after--figure">Extending Azure DevOps YAML Templates&lt;/h3>&lt;h4 name="e9c9" id="e9c9" class="graf graf--h4 graf-after--h3">Configuring triggers on Azure DevOps YAML Templates&lt;/h4>&lt;p name="9e88" id="9e88" class="graf graf--p graf-after--h4">On top of the consumer file, in our case &lt;code class="markup--code markup--p-code">azure-pipelines.yml&lt;/code> , we need to declare the triggers of the pipeline. It is mandatory to include at least one value for branch(it can be * if needed), or &lt;code class="markup--code markup--p-code">none&lt;/code> . You can also set the path where your files are, and your pipeline will run only when those files change.&lt;/p>&lt;pre name="7b50" id="7b50" class="graf graf--pre graf-after--p">trigger:&lt;br> branches:&lt;br> include:&lt;br> - main&lt;br> - develop&lt;br> paths:&lt;br> include:&lt;br> - src/*&lt;/pre>&lt;h4 name="8442" id="8442" class="graf graf--h4 graf-after--pre">Referencing Azure DevOps YAML Templates&lt;/h4>&lt;p name="9d9e" id="9d9e" class="graf graf--p graf-after--h4">To extend a template, you need to provide the relative path for your template file. In this example, there is a &lt;code class="markup--code markup--p-code">templates&lt;/code> directory with the file &lt;code class="markup--code markup--p-code">template.yml&lt;/code> so on the consumer file, it’s necessary to provide the template path in the format &lt;code class="markup--code markup--p-code">./templates/template.yml&lt;/code> &lt;code class="markup--code markup--p-code">.&lt;/code>&lt;/p>&lt;figure name="c658" id="c658" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*PKHTHZN9K5hkDjgXRZ7mzQ.png" data-width="348" data-height="119" src="https://cdn-images-1.medium.com/max/800/1*PKHTHZN9K5hkDjgXRZ7mzQ.png">&lt;figcaption class="imageCaption">Image prepared by author&lt;/figcaption>&lt;/figure>&lt;p name="982a" id="982a" class="graf graf--p graf-after--figure">We also need to provide the parameter defined in our template. To this, you just need to add the parameters section right below the template, the name of the parameter, and of course, the value for it. Below there is the complete “consumer” file.&lt;/p>&lt;figure name="4dad" id="4dad" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/b5f5b29229129bc6401ff91060daf739?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="f5c6" id="f5c6" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="63ca" id="63ca" class="graf graf--p graf-after--h3">In this post, I introduced the basic concepts of how to extend Azure DevOps YAML Pipelines. This is easy to implement but can yield good fruits in future implementations.&lt;/p>&lt;p name="faa6" id="faa6" class="graf graf--p graf-after--p graf--trailing">In future articles, I will deep dive into this subject and show the full potential of this approach :).&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/b9d851c5e872">&lt;time class="dt-published" datetime="2021-12-30T16:28:36.566Z">December 30, 2021&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-01-28_delivery-as-code-with-azure-devops-release-engine-6b69a9cb24f4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-01-28_delivery-as-code-with-azure-devops-release-engine-6b69a9cb24f4/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Delivery as Code with Azure DevOps Release Engine&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Delivery as Code with Azure DevOps Release Engine&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Delivery as Code is the concept of having all necessary configurations of your delivery defined in a file, which can be kept under source…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f128" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="a65e" id="a65e" class="graf graf--h3 graf--leading graf--title">Delivery as Code with Azure DevOps Release Engine&lt;/h3>&lt;p name="42ed" id="42ed" class="graf graf--p graf-after--h3">Delivery as Code is the concept of having all necessary configurations of your delivery defined in a file, which can be kept under source control and have all good practices applied to application development over it. It ensures that your deliveries are consistent and reliable.&lt;/p>&lt;figure name="1e55" id="1e55" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*_BNFAVB90d4cdBvFgz7loA.jpeg" data-width="6016" data-height="4016" data-is-featured="true" alt="Photo by &amp;lt;a href=”https://unsplash.com/@actionjackson801?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&amp;quot;&amp;gt;Jackson Hendry&amp;lt;/a&amp;gt; on &amp;lt;a href=”https://unsplash.com/s/photos/night-sky?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&amp;quot;&amp;gt;Unsplash&amp;lt;/a&amp;gt;" src="https://cdn-images-1.medium.com/max/800/1*_BNFAVB90d4cdBvFgz7loA.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@actionjackson801?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@actionjackson801?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Jackson Hendry&lt;/a> on &lt;a href="https://unsplash.com/s/photos/night-sky?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/night-sky?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="08f8" id="08f8" class="graf graf--h3 graf-after--figure">Everything as Code&lt;/h3>&lt;p name="0175" id="0175" class="graf graf--p graf-after--h3">In the past years, everything is becoming “as Code”. It started with Infrastructure as Code, aka IaC, and today there are many languages supporting it, since the AWS Cloud Formation, passing through Terraform and Pulumi, that are Cloud agnostics, until the Azure ARM Templates and his newborn son Azure Bicep.&lt;/p>&lt;p name="7614" id="7614" class="graf graf--p graf-after--p">But there are also other uses of as Code, such as Database as Code, Pipelines as Code, Monitoring as Code, Security as Code, and so forth, this list is big and still growing.&lt;/p>&lt;h4 name="41fc" id="41fc" class="graf graf--h4 graf-after--p">Why have my definitions as code?&lt;/h4>&lt;p name="318e" id="318e" class="graf graf--p graf-after--h4">One of the reasons behind this is if you have the instructions to create your environment versioned, you can easily reproduce the steps to create it. Imagine that for some reason you lose your infrastructure environment, in some minutes you can spin up a new environment based on the versioned definitions.&lt;/p>&lt;p name="09bc" id="09bc" class="graf graf--p graf-after--p">Another reason is that as you can easily create a new environment, you can apply development good practices on it. For example, you can deploy a new environment using the versioned scripts, and run Unit Tests against it. With frameworks like Pester this is easy to implement.&lt;/p>&lt;h3 name="d347" id="d347" class="graf graf--h3 graf-after--p">What is Delivery as Code?&lt;/h3>&lt;p name="f588" id="f588" class="graf graf--p graf-after--h3">The advantages of having definitions under source control are clear, so why do not apply them in the Delivery of the software?&lt;/p>&lt;p name="323f" id="323f" class="graf graf--p graf-after--p">With that in mind and my passion to automate everything that I can, I started to develop an easy way to configure the releases and make them as simple as possible, based on my experience working in the DevOps field.&lt;/p>&lt;p name="7e5d" id="7e5d" class="graf graf--p graf-after--p">To configure a new delivery, instead of configuring manually or having scripts of how to implement it, you just need to inform what you need and all the complexity of the implementation will be abstracted. This is the declarative approach very keen on Infrastructure as Code, which allows you have indepotent deployments.&lt;/p>&lt;h3 name="f127" id="f127" class="graf graf--h3 graf-after--p">What is Azure DevOps Release Engine&lt;/h3>&lt;p name="588b" id="588b" class="graf graf--p graf-after--h3">Azure DevOps Release Engine is an approach developed to support Delivery as Code. It was built on top of Azure DevOps YAML Templates and can be used to deploy any kind of technology, with any kind of tool anywhere.&lt;/p>&lt;p name="3cd7" id="3cd7" class="graf graf--p graf-after--p">It means that you can deploy languages such as:&lt;/p>&lt;ul class="postList">&lt;li name="043d" id="043d" class="graf graf--li graf-after--p">dotnet Core&lt;/li>&lt;li name="c28b" id="c28b" class="graf graf--li graf-after--li">nodeJS&lt;/li>&lt;li name="bc6d" id="bc6d" class="graf graf--li graf-after--li">Java&lt;/li>&lt;/ul>&lt;p name="f3d9" id="f3d9" class="graf graf--p graf-after--li">Using any tool like:&lt;/p>&lt;ul class="postList">&lt;li name="3c87" id="3c87" class="graf graf--li graf-after--p">Azure Bicep&lt;/li>&lt;li name="2dc4" id="2dc4" class="graf graf--li graf-after--li">Terraform&lt;/li>&lt;li name="b13a" id="b13a" class="graf graf--li graf-after--li">Cloud Formation&lt;/li>&lt;li name="08d6" id="08d6" class="graf graf--li graf-after--li">Pulumi&lt;/li>&lt;/ul>&lt;p name="120e" id="120e" class="graf graf--p graf-after--li">In any platform:&lt;/p>&lt;ul class="postList">&lt;li name="61c3" id="61c3" class="graf graf--li graf-after--p">Azure&lt;/li>&lt;li name="f39c" id="f39c" class="graf graf--li graf-after--li">AWS&lt;/li>&lt;li name="bb40" id="bb40" class="graf graf--li graf-after--li">VMWare&lt;/li>&lt;li name="359e" id="359e" class="graf graf--li graf-after--li">OnPremisses data centers&lt;/li>&lt;/ul>&lt;h3 name="7f3d" id="7f3d" class="graf graf--h3 graf-after--li">How does Azure DevOps Release Engine work?&lt;/h3>&lt;p name="d725" id="d725" class="graf graf--p graf-after--h3">Azure DevOps Release Engine was created using Azure DevOps YAML Pipelines as a support tool. It consists of a centralized repository where they centralize deployment definitions - the instructions of how to deploy - are versioned and Client/Application repositories which must have the declaration of what should be deployed.&lt;/p>&lt;p name="4de7" id="4de7" class="graf graf--p graf-after--p">The client application repository must have a YAML pipeline that extends from the main YAML in the centralized repository - &lt;a href="https://towardsdev.com/how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872" data-href="https://towardsdev.com/how-to-extend-an-azure-devops-yaml-pipeline-template-b9d851c5e872" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here there is a post explaining how the extended pipelines work&lt;/a>. The main file is responsible to parse the instructions provided and deciding which definition must be used.&lt;/p>&lt;figure name="9e62" id="9e62" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*TdY4HlqI1O_KNVr0Rljknw.png" data-width="1471" data-height="626" src="https://cdn-images-1.medium.com/max/800/1*TdY4HlqI1O_KNVr0Rljknw.png">&lt;/figure>&lt;h4 name="ebae" id="ebae" class="graf graf--h4 graf-after--figure">Centralized Release definitions&lt;/h4>&lt;p name="e003" id="e003" class="graf graf--p graf-after--h4">The definitions in this repository can be reused, saving time and allowing all deployments of the same kind of component to be deployed in the same way, which leads to more consistent and less problematic releases, as the deployment instructions were well tested.&lt;/p>&lt;h4 name="25ca" id="25ca" class="graf graf--h4 graf-after--p">Client/Application repositories&lt;/h4>&lt;p name="a922" id="a922" class="graf graf--p graf-after--h4">The client repositories are the repos where your applications are versioned. It can have any sort of resource to be deployed and to consume the Release Engine you just need to create a YAML file following the Azure DevOps Release Engine schema.&lt;/p>&lt;h3 name="451a" id="451a" class="graf graf--h3 graf-after--p">How to set up Azure DevOps Release Engine?&lt;/h3>&lt;h4 name="8766" id="8766" class="graf graf--h4 graf-after--h3">Importing the repo into Azure DevOps&lt;/h4>&lt;p name="e172" id="e172" class="graf graf--p graf-after--h4">In the Azure DevOps Release Engine repository at GitHub copy the link to the repository following the sequence below:&lt;/p>&lt;figure name="e4da" id="e4da" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*uPtLLtDIIbY3RKAgTjMX7A.png" data-width="1246" data-height="592" src="https://cdn-images-1.medium.com/max/800/1*uPtLLtDIIbY3RKAgTjMX7A.png">&lt;figcaption class="imageCaption">Copy the repository URL — Image by author&lt;/figcaption>&lt;/figure>&lt;figure name="5baa" id="5baa" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*aqO2RG6w41ox4JDYWe8twg.png" data-width="1072" data-height="546" src="https://cdn-images-1.medium.com/max/800/1*aqO2RG6w41ox4JDYWe8twg.png">&lt;figcaption class="imageCaption">Click in Import repository — Image by author&lt;/figcaption>&lt;/figure>&lt;figure name="d1f3" id="d1f3" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*wvfx90_WRO7LRsbyJ_v-Dw.png" data-width="607" data-height="409" src="https://cdn-images-1.medium.com/max/800/1*wvfx90_WRO7LRsbyJ_v-Dw.png">&lt;figcaption class="imageCaption">Paste the link and import — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="f664" id="f664" class="graf graf--p graf-after--figure">After it you should have the repository in your Azure DevOps repos, with the structure below:&lt;/p>&lt;figure name="210f" id="210f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*-E9yirfM67UbeJjnPi8rVg.png" data-width="424" data-height="494" src="https://cdn-images-1.medium.com/max/800/1*-E9yirfM67UbeJjnPi8rVg.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="0a6d" id="0a6d" class="graf graf--h3 graf-after--figure">How to set up the application to consume the Azure DevOps Release engine?&lt;/h3>&lt;h4 name="535d" id="535d" class="graf graf--h4 graf-after--h3">Repository structure&lt;/h4>&lt;p name="7e10" id="7e10" class="graf graf--p graf-after--h4">In a dotnet Core application repository add the file azure-pipelines.yml in the root folder, and one file corresponding to each environment that will be deployed in a “variables” directory. I recommend having the source code under a different directory to keep the repository cleaner and tidy, in my case it’s under the &lt;code class="markup--code markup--p-code">src&lt;/code>directory.&lt;/p>&lt;figure name="c748" id="c748" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*wZ_WvkWKvUAYkNZIJD1R9Q.png" data-width="274" data-height="431" src="https://cdn-images-1.medium.com/max/800/1*wZ_WvkWKvUAYkNZIJD1R9Q.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="8173" id="8173" class="graf graf--h4 graf-after--figure">Creating the azure-pipelines.yml file&lt;/h4>&lt;p name="604a" id="604a" class="graf graf--p graf-after--h4">This file contains all instructions on what resources need to be deployed. I will add the complete file in the end so it will be possible to just copy it ;).&lt;/p>&lt;figure name="4e27" id="4e27" class="graf graf--figure graf--startsWithDoubleQuote graf-after--p">&lt;img class="graf-image" data-image-id="1*4ozkyI8QtFth7UpEaAZQGw.png" data-width="365" data-height="273" src="https://cdn-images-1.medium.com/max/800/1*4ozkyI8QtFth7UpEaAZQGw.png">&lt;figcaption class="imageCaption">“Importing” a repository in Azure DevOps — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="a620" id="a620" class="graf graf--p graf-after--figure">The beginning of the file contains pipeline configurations that will be the same in most of the pipelines. The declaration of Release Engine as a repository resource is very important, as the templates will be consumed from this resource that will be “imported”.&lt;/p>&lt;h4 name="24b5" id="24b5" class="graf graf--h4 graf-after--p">Azure DevOps Release Engine settings&lt;/h4>&lt;p name="1453" id="1453" class="graf graf--p graf-after--h4">With Release Engine imported, it is necessary now to extend from the main.yml file &lt;strong class="markup--strong markup--p-strong">(1)&lt;/strong>. This file is basically a parser that will read the information provided as parameters and redirect to the correct file. I will deep dive into this file in future posts.&lt;/p>&lt;figure name="ecee" id="ecee" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*G470hXFe5jMfVuOFv_Stkw.png" data-width="799" data-height="516" src="https://cdn-images-1.medium.com/max/800/1*G470hXFe5jMfVuOFv_Stkw.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;p name="46b9" id="46b9" class="graf graf--p graf-after--figure">The most important section is the &lt;strong class="markup--strong markup--p-strong">parameters&lt;/strong>. This section contains all information that will be provided to the engine. As mentioned above this information will be parsed by the main file, and according to the resource types provided. call the right definition to deploy it.&lt;/p>&lt;p name="8ad4" id="8ad4" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Release settings&lt;br>&lt;/strong>Inside parameters, the session &lt;strong class="markup--strong markup--p-strong">settings (2) &lt;/strong>contain the configuration of your release.&lt;/p>&lt;p name="d262" id="d262" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Azure settings&lt;br>&lt;/strong>In the current version, it is possible to enable or disable the deployment of your infrastructure, application, and build &lt;strong class="markup--strong markup--p-strong">(3)&lt;/strong>. Here it is also necessary to provide the directory of your variable files. The variables will be explained later. It is possible to provide the values straight on this file,&lt;/p>&lt;p name="5f1d" id="5f1d" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Environments&lt;br>&lt;/strong>It is also necessary to provide information about your Azure environment &lt;strong class="markup--strong markup--p-strong">(4)&lt;/strong>, such as service connection, resource group where the resources will be deployed, and so on. If the parameter &lt;strong class="markup--strong markup--p-strong">new &lt;/strong>under resource group is provided, it will also create the resource group.&lt;/p>&lt;p name="b846" id="b846" class="graf graf--p graf-after--p">Last but not least, you must declare which environments will be deployed. The way that it was built will create exactly the same configuration for all environments, which ensures that the implementation in your production environment will follow the same steps as in the others, increasing the &lt;strong class="markup--strong markup--p-strong">reliability of the delivery&lt;/strong>, as was mentioned at the beginning of this post.&lt;/p>&lt;h4 name="2fd3" id="2fd3" class="graf graf--h4 graf-after--p">Configuring resources to be deployed with Azure DevOps Release Engine&lt;/h4>&lt;p name="11a4" id="11a4" class="graf graf--p graf-after--h4">The latest section in the azure-pipelines.yml is the resource. This is a list of resources that will be deployed in this release and its configurations. In this example, we are going to deploy a dotnet Core application into an Azure Web App. Let’s go through the main items in this section:&lt;/p>&lt;figure name="7f24" id="7f24" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*WWvMG336nyZ1iMQj4kWsPQ.png" data-width="399" data-height="218" src="https://cdn-images-1.medium.com/max/800/1*WWvMG336nyZ1iMQj4kWsPQ.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;p name="efce" id="efce" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">name &lt;/strong>- This is the name of the web app that will be created into Azure. This is provided through a parameter that is stored in the respective variable file of the environment that is running. It means that you can deploy in different environments like dev, uat and prd with unique names, avoiding conflicts.&lt;/p>&lt;p name="4cfd" id="4cfd" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">type &lt;/strong>- The type is parsed inside the main.yml file and calls the right deployment definition for the type provided. This example is a dotnet Core application but it is possible to deploy any resource with the deployment definition already implemented on Release Engine.&lt;/p>&lt;p name="d922" id="d922" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">runName&lt;/strong> - Run name is the name of the Azure DevOps job. This is necessary to make the run unique and have the possibility to link dependent resources.&lt;/p>&lt;p name="f387" id="f387" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">enabled&lt;/strong> - It is possible to easily disable the deployment of this resource.&lt;/p>&lt;p name="5912" id="5912" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">deploy.type&lt;/strong> - Inform which type of deployment it is. In this example, the dotnet Core application will be deployed into an Azure Web App.&lt;/p>&lt;p name="0553" id="0553" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">deploy.infrastructure.servicePlanName&lt;/strong> - Similar to the name, we are informing the name of the service plan that will be used by our Azure Web App.&lt;/p>&lt;h4 name="c8f3" id="c8f3" class="graf graf--h4 graf-after--p">Configuring variables for Azure DevOps Release Engine&lt;/h4>&lt;p name="4e5a" id="4e5a" class="graf graf--p graf-after--h4">As mentioned before, it is necessary one variable file per environment. The variable file allows having resources with unique names in the environments.&lt;/p>&lt;figure name="a40e" id="a40e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*aQ7Pc0GTl1tcQViMPWR7Xw.png" data-width="728" data-height="361" src="https://cdn-images-1.medium.com/max/800/1*aQ7Pc0GTl1tcQViMPWR7Xw.png">&lt;/figure>&lt;p name="31e2" id="31e2" class="graf graf--p graf-after--figure">This file will be loaded automatically by the engine, so the only action necessary is to add the file following the patter {env-name}-vars.yml, where env-name is the name defined at azure-pipelines.yml&lt;/p>&lt;p name="7890" id="7890" class="graf graf--p graf-after--p">After being loaded by the engine, the variables will be available like any other variable in Azure DevOps. In azure-pipelines the variables are accessed using the macro syntax $(variable-name).&lt;/p>&lt;h4 name="e0c2" id="e0c2" class="graf graf--h4 graf-after--p">Complete template&lt;/h4>&lt;p name="370c" id="370c" class="graf graf--p graf-after--h4">Below there is the complete template for dotnet Core and Azure Web Apps. You can also check the repository with more examples and the implementation of the engine on &lt;a href="https://github.com/devopsnights/AzureDevOpsReleaseEngine" data-href="https://github.com/devopsnights/AzureDevOpsReleaseEngine" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure DevOps Release Engine repository at GitHub&lt;/a>.&lt;/p>&lt;figure name="3061" id="3061" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/ae316d2b1488515e32eaf4fd39deb640?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="4634" id="4634" class="graf graf--h3 graf-after--figure">Takeaways&lt;/h3>&lt;p name="e1ad" id="e1ad" class="graf graf--p graf-after--h3">The Azure DevOps Release Engine simplifies the release configuration, abstracting the release definition providing an “as Code” approach for your Delivery.&lt;/p>&lt;p name="9da2" id="9da2" class="graf graf--p graf-after--p">This is a work in progress but built on top of a very mature process based on real-life experience, solving real-life problems that we face in our day-by-day activities.&lt;/p>&lt;p name="dba1" id="dba1" class="graf graf--p graf-after--p">I hope it can help, and see you in future posts!&lt;/p>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--p">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/6b69a9cb24f4">&lt;time class="dt-published" datetime="2022-01-28T18:05:03.865Z">January 28, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/delivery-as-code-with-azure-devops-release-engine-6b69a9cb24f4" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-02-02_creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines-246fcaa355b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-02-02_creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines-246fcaa355b/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
PowerShell Modules are very useful and can save a lot of time if well designed and created. Check on this post how to create and pack a…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="1370" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="be81" id="be81" class="graf graf--h3 graf--leading graf--title">Creating and publishing PowerShell Modules to Azure Artifacts with Azure DevOps YAML Pipelines&lt;/h3>&lt;p name="ec9a" id="ec9a" class="graf graf--p graf-after--h3">PowerShell Modules are very useful and can save a lot of time if well designed and created. Check on this post how to create and pack a basic PowerShell Module, and publish it into Azure Artifact using Azure DevOps YAML Pipelines.&lt;/p>&lt;figure name="e81d" id="e81d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*fsn7lNWadvhhO4YLZ_YTxQ.jpeg" data-width="3600" data-height="2400" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*fsn7lNWadvhhO4YLZ_YTxQ.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@trnavskauni?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@trnavskauni?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Trnava University&lt;/a> on &lt;a href="https://unsplash.com/s/photos/artifact?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/artifact?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="cdc9" id="cdc9" class="graf graf--h3 graf-after--figure">Creating PowerShell Module and PowerShell Module Manifest&lt;/h3>&lt;h4 name="107b" id="107b" class="graf graf--h4 graf-after--h3">Creating a PowerShell Module - psm1&lt;/h4>&lt;p name="dd65" id="dd65" class="graf graf--p graf-after--h4">A PowerShell Module is a way to organize and pack a set of PowerShell components to be reused or shared. The most common components to be shared are functions.&lt;/p>&lt;p name="5dad" id="5dad" class="graf graf--p graf-after--p">In this example, we will create the module &lt;code class="markup--code markup--p-code">Example.Module&lt;/code> with the extension &lt;code class="markup--code markup--p-code">psm1&lt;/code> , and include a PowerShell function.&lt;/p>&lt;figure name="ebb1" id="ebb1" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/a1b041398788429dfc45c603cf4be9f4?file=Example.Module.psm1.js">&lt;/script>&lt;/figure>&lt;h4 name="0ae8" id="0ae8" class="graf graf--h4 graf-after--figure">Creating a PowerShell Module Manifest - psd1&lt;/h4>&lt;p name="5306" id="5306" class="graf graf--p graf-after--h4">To create the Module Manifest, it is possible to run the cmdlet &lt;code class="markup--code markup--p-code">New-ModuleManifest&lt;/code> . It will generate the &lt;code class="markup--code markup--p-code">psd1&lt;/code> manifest file with default configurations.&lt;/p>&lt;p name="906e" id="906e" class="graf graf--p graf-after--p">The most important variables are &lt;code class="markup--code markup--p-code">NestedModules&lt;/code> and &lt;code class="markup--code markup--p-code">RootModule&lt;/code> which must contain the name of the psm1 file.&lt;/p>&lt;figure name="913e" id="913e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/a1b041398788429dfc45c603cf4be9f4?file=Example.Module.psd1.js">&lt;/script>&lt;/figure>&lt;h4 name="bcbe" id="bcbe" class="graf graf--h4 graf-after--figure">Creating a nuspec file for the PowerShell Module&lt;/h4>&lt;p name="1738" id="1738" class="graf graf--p graf-after--h4">To create the nuspec file you need to run the command &lt;code class="markup--code markup--p-code">nuget spec Example.Module&lt;/code> . It will generate a base file that it is possible to replace with your values.&lt;/p>&lt;figure name="fccf" id="fccf" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/a1b041398788429dfc45c603cf4be9f4?file=Example.Module.nuspec.js">&lt;/script>&lt;/figure>&lt;h4 name="d416" id="d416" class="graf graf--h4 graf-after--figure">Making the PowerShell Module version dynamic&lt;/h4>&lt;p name="124f" id="124f" class="graf graf--p graf-after--h4">In both &lt;code class="markup--code markup--p-code">psm1&lt;/code>(1) and &lt;code class="markup--code markup--p-code">nuspec&lt;/code> (2) files there is a variable &lt;code class="markup--code markup--p-code">$(version)&lt;/code> . This variable will be replaced by the version defined in the deployment pipeline. It uses the &lt;a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&amp;amp;tabs=yaml%2Cbatch#understand-variable-syntax" data-href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&amp;amp;tabs=yaml%2Cbatch#understand-variable-syntax" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure DevOps macro syntax&lt;/a> to consume the variables.&lt;/p>&lt;figure name="18e7" id="18e7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*hC2Fp7Sq3dAcnFCrOSfRSA.png" data-width="719" data-height="394" src="https://cdn-images-1.medium.com/max/800/1*hC2Fp7Sq3dAcnFCrOSfRSA.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;figure name="58ba" id="58ba" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*TOn6t_70pay-LOgPYJVjAg.png" data-width="852" data-height="285" src="https://cdn-images-1.medium.com/max/800/1*TOn6t_70pay-LOgPYJVjAg.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="f51f" id="f51f" class="graf graf--h3 graf-after--figure">Creating an Azure Artifacts Feed&lt;/h3>&lt;p name="2ee6" id="2ee6" class="graf graf--p graf-after--h3">For instructions on how to create a feed, you can check this post where I also show how to push a dotnet Core package to Azure Artifacts:&lt;/p>&lt;p name="1d5f" id="1d5f" class="graf graf--p graf-after--p">&lt;a href="https://camargo-wes.medium.com/how-to-send-net-core-nuget-packages-to-azure-artifacts-238fa08db6b5" data-href="https://camargo-wes.medium.com/how-to-send-net-core-nuget-packages-to-azure-artifacts-238fa08db6b5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">How to send .Net Core NuGet packages to Azure Artifacts | by Wesley Camargo | Medium&lt;/a>&lt;/p>&lt;h3 name="f821" id="f821" class="graf graf--h3 graf-after--p">Deploying PowerShell Module with Azure DevOps YAML Pipeline into Azure Artifact&lt;/h3>&lt;h4 name="51f9" id="51f9" class="graf graf--h4 graf-after--h3">Version Number to update PowerShell Module&lt;/h4>&lt;p name="7ffa" id="7ffa" class="graf graf--p graf-after--h4">To simplify this example, we will provide the version number of the module by Azure DevOps parameter(1). Then we populate a variable with the value of the parameter using template expression syntax(2). In a future post, I will how to bump this number automatically.&lt;/p>&lt;figure name="68a5" id="68a5" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ntWVJnMc2jpUqLegnE_fkw.png" data-width="517" data-height="244" src="https://cdn-images-1.medium.com/max/800/1*ntWVJnMc2jpUqLegnE_fkw.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="60fd" id="60fd" class="graf graf--h4 graf-after--figure">Replacing version number in nuspec and module manifest&lt;/h4>&lt;p name="2491" id="2491" class="graf graf--p graf-after--h4">The next step is to replace the variable &lt;code class="markup--code markup--p-code">$(version)&lt;/code> mentioned above with the version number. To do it will be used the &lt;a href="https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens" data-href="https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">replace token task&lt;/a>. Note that we specify the extensions of the manifest and nuspec files.&lt;/p>&lt;figure name="6a42" id="6a42" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*xMkiWFVlx2G_UJ_M6-pinQ.png" data-width="503" data-height="359" src="https://cdn-images-1.medium.com/max/800/1*xMkiWFVlx2G_UJ_M6-pinQ.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="e4a0" id="e4a0" class="graf graf--h4 graf-after--figure">Packing PowerShell Module with NuGet&lt;/h4>&lt;p name="d2f7" id="d2f7" class="graf graf--p graf-after--h4">To pack the module is used the NuGetCommand task, and specified the nuspec file. After generating the NuGet package it will be published as a pipeline artifact - be careful not to confuse with Azure Artifacts, we are almost there but not yet :) - which will be consumed in the next stage: deployment.&lt;/p>&lt;figure name="2cbe" id="2cbe" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*RNGcd5bStLWiDOzCSIUTpA.png" data-width="653" data-height="251" src="https://cdn-images-1.medium.com/max/800/1*RNGcd5bStLWiDOzCSIUTpA.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="3393" id="3393" class="graf graf--h4 graf-after--figure">Pushing PowerShell Module to Azure Artifacts&lt;/h4>&lt;p name="a0fd" id="a0fd" class="graf graf--p graf-after--h4">Finally, in the deployment stage, we will push our package into our Azure Artifacts. It will also use the NuGet Command task to push it, sending the &lt;code class="markup--code markup--p-code">nupkg&lt;/code> generate in the build stage. It is also necessary to provide the name of the Azure Artifacts Feed.&lt;/p>&lt;figure name="9adb" id="9adb" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*8L4ufhKDW1GtuEU_gsEPyQ.png" data-width="1024" data-height="365" src="https://cdn-images-1.medium.com/max/800/1*8L4ufhKDW1GtuEU_gsEPyQ.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="5a79" id="5a79" class="graf graf--h4 graf-after--figure">Complete azure-pipelines.yml to publish PowerShell Modules to Azure Artifacts&lt;/h4>&lt;figure name="9a22" id="9a22" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/a1b041398788429dfc45c603cf4be9f4?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--figure">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/246fcaa355b">&lt;time class="dt-published" datetime="2022-02-02T23:02:46.474Z">February 2, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/creating-and-publishing-powershell-modules-to-azure-artifacts-with-azure-devops-yaml-pipelines-246fcaa355b" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-02-24_criando-azure-resource-group-com-azure-cli-7fa50d2ad129/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-02-24_criando-azure-resource-group-com-azure-cli-7fa50d2ad129/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Criando Azure Resource Group com Azure CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Criando Azure Resource Group com Azure CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
O Azure CLI é uma interface de linha de comando para o Azure. Ele pode ser usado com PowerShell ou em bash, com ele é possível criar…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d3a4" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5ade" id="5ade" class="graf graf--h3 graf--leading graf--title">Criando Azure Resource Group com Azure CLI&lt;/h3>&lt;p name="0899" id="0899" class="graf graf--p graf-after--h3">O Azure CLI é uma interface de linha de comando para o Azure. Ele pode ser usado com PowerShell ou em bash, com ele é possível criar recursos, resource groups, executar ações no Azure entre outras coisas. Aqui vou mostrar os comandos básicos para conectar ao Azure utilizando o Azure CLI e como criar um resource group.&lt;/p>&lt;figure name="de78" id="de78" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cilM3e42GLTP7Tod8bXeQg.jpeg" data-width="3000" data-height="2000" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*cilM3e42GLTP7Tod8bXeQg.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@fakurian?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@fakurian?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Milad Fakurian&lt;/a> on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="d8d1" id="d8d1" class="graf graf--p graf-after--figure">No vídeo abaixo é possível acompanhar todo o processe de conexão ao Azure e criação do Resource Group usando Azure CLI. Após o vídeo estão os comandos utilizados e um breve resumo sobre seu uso.&lt;/p>&lt;figure name="102a" id="102a" class="graf graf--figure graf--iframe graf-after--p">&lt;iframe src="https://www.youtube.com/embed/miZ7wyZ7anQ?feature=oembed" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h3 name="20c4" id="20c4" class="graf graf--h3 graf-after--figure">Como conectar ao Azure com Azure CLI&lt;/h3>&lt;h4 name="a74c" id="a74c" class="graf graf--h4 graf-after--h3">Azure CLI - comandos para Account&lt;/h4>&lt;p name="ae26" id="ae26" class="graf graf--p graf-after--h4">Abaixo estão todos os comandos utilizados para realizar login e configurar a Azure Subscription para ser utilizada&lt;/p>&lt;figure name="1412" id="1412" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/a379c126d3eb87930ab7aa19b21615a6?file=LoginAndSetAccount.ps1.js">&lt;/script>&lt;/figure>&lt;p name="a518" id="a518" class="graf graf--p graf-after--figure">Agora vamos ver os detalhes de execuçao dos comandos:&lt;/p>&lt;p name="707d" id="707d" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">az -h&lt;/code> — Lista os comandos disponíveis no Azure CLI&lt;/p>&lt;figure name="4840" id="4840" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*xtFjXLBbgrQw6IOTLT5HZA.png" data-width="1233" data-height="772" src="https://cdn-images-1.medium.com/max/800/1*xtFjXLBbgrQw6IOTLT5HZA.png">&lt;/figure>&lt;p name="1d14" id="1d14" class="graf graf--p graf-after--figure">&lt;code class="markup--code markup--p-code">az login&lt;/code>- Abre a página de login no browser para selecionar a conta que será conectada&lt;/p>&lt;figure name="ac19" id="ac19" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cFaJ-sa-gDYIgWNEKGGXOA.png" data-width="464" data-height="595" src="https://cdn-images-1.medium.com/max/800/1*cFaJ-sa-gDYIgWNEKGGXOA.png">&lt;/figure>&lt;p name="1f80" id="1f80" class="graf graf--p graf-after--figure">&lt;code class="markup--code markup--p-code">az account list&lt;/code> - Lista as subscription disponíveis&lt;br>&lt;code class="markup--code markup--p-code">az account set -subscription&lt;/code> - Seleciona a subscription que será usada&lt;br>&lt;code class="markup--code markup--p-code">az account show&lt;/code> - Exibe as informações da subscription atual&lt;/p>&lt;figure name="72eb" id="72eb" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*UXnIG5vzHh8dZ51X44rqtw.png" data-width="952" data-height="508" src="https://cdn-images-1.medium.com/max/800/1*UXnIG5vzHh8dZ51X44rqtw.png">&lt;/figure>&lt;h3 name="2633" id="2633" class="graf graf--h3 graf-after--figure">Como criar um Azure Resource Group com Azure CLI&lt;/h3>&lt;h4 name="4b34" id="4b34" class="graf graf--h4 graf-after--h3">Azure CLI — comandos para Resource Group&lt;/h4>&lt;p name="506f" id="506f" class="graf graf--p graf-after--h4">&lt;code class="markup--code markup--p-code">az group -h&lt;/code> - Lista os comandos disponíveis para Resource Groups&lt;br>&lt;code class="markup--code markup--p-code">az group create -h&lt;/code> - Lista os argumentos necessários para criar um Resource Group&lt;/p>&lt;figure name="365f" id="365f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*q9u4264fwYxWQQ2l2ieLEA.png" data-width="1112" data-height="772" src="https://cdn-images-1.medium.com/max/800/1*q9u4264fwYxWQQ2l2ieLEA.png">&lt;/figure>&lt;p name="5477" id="5477" class="graf graf--p graf-after--figure">&lt;code class="markup--code markup--p-code">az group create --location -–name&lt;/code> - Cria um Resource Group&lt;/p>&lt;figure name="11ca" id="11ca" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ZKz9LJWr6lrBvZFPGKMJjA.png" data-width="1032" data-height="388" src="https://cdn-images-1.medium.com/max/800/1*ZKz9LJWr6lrBvZFPGKMJjA.png">&lt;/figure>&lt;p name="34aa" id="34aa" class="graf graf--p graf-after--figure">&lt;code class="markup--code markup--p-code">az group list --output table&lt;/code> - Lista Resource Groups da subscription em formato de tabela&lt;/p>&lt;figure name="040a" id="040a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ru6Eh_JTfYgz9ooYcZqZ6w.png" data-width="1032" data-height="316" src="https://cdn-images-1.medium.com/max/800/1*ru6Eh_JTfYgz9ooYcZqZ6w.png">&lt;/figure>&lt;p name="04a6" id="04a6" class="graf graf--p graf-after--figure graf--trailing">&lt;code class="markup--code markup--p-code">az group delete --name&lt;/code>- Apaga o Resource Group&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/7fa50d2ad129">&lt;time class="dt-published" datetime="2022-02-24T17:26:54.075Z">February 24, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/criando-azure-resource-group-com-azure-cli-7fa50d2ad129" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-02-25_the-entry-gate-to-azure--configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-02-25_the-entry-gate-to-azure--configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>The entry gate to Azure: Configuring your Azure subscription with Azure CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">The entry gate to Azure: Configuring your Azure subscription with Azure CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Azure CLI is a command line interface with Azure. It can be used in any command line prompt, including PowerShell and Bash, and it allows…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7f71" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f3ee" id="f3ee" class="graf graf--h3 graf--leading graf--title">The entry gate to Azure: Configuring your Azure subscription with Azure CLI&lt;/h3>&lt;p name="31b5" id="31b5" class="graf graf--p graf-after--h3">Azure CLI is a command line interface with Azure. It can be used in any command line prompt, including PowerShell and Bash, and it allows the creation of resources and resource groups, executing actions like an Azure Data Factory pipeline, and much more possibilities. In this post, I will show the basic commands to connect and configure your Azure Subscription.&lt;/p>&lt;figure name="6f75" id="6f75" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*WUN0NX9YOBytDa6iXLB5BQ.jpeg" data-width="2739" data-height="1826" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*WUN0NX9YOBytDa6iXLB5BQ.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@craft_ear?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@craft_ear?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Jan Tinneberg&lt;/a> on &lt;a href="https://unsplash.com/s/photos/door-open?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/door-open?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="35ec" id="35ec" class="graf graf--h3 graf-after--figure">How to set an Azure Subscription with Azure CLI&lt;/h3>&lt;h4 name="5236" id="5236" class="graf graf--h4 graf-after--h3">Azure CLI commands for Login and Account&lt;/h4>&lt;p name="a7d0" id="a7d0" class="graf graf--p graf-after--h4">Below is a summary of all commands used&lt;/p>&lt;figure name="89c2" id="89c2" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/a379c126d3eb87930ab7aa19b21615a6?file=LoginAndSetAccount.ps1.js">&lt;/script>&lt;/figure>&lt;p name="fe2b" id="fe2b" class="graf graf--p graf-after--figure">Now let’s see the details of execution for each command.&lt;/p>&lt;h4 name="9b5f" id="9b5f" class="graf graf--h4 graf-after--p">How to know which commands to use in Azure CLI&lt;/h4>&lt;p name="9ffb" id="9ffb" class="graf graf--p graf-after--h4">At least in the beginning until you get familiar with the commands a very useful tip is to make use of the help command. It’s quite simple and you just need to add &lt;code class="markup--code markup--p-code">--help&lt;/code> or &lt;code class="markup--code markup--p-code">-h&lt;/code> after the command. The most basic would be to run it after &lt;code class="markup--code markup--p-code">az&lt;/code> like &lt;code class="markup--code markup--p-code">az --help&lt;/code> . It will show all subgroups and commands available for the tool.&lt;/p>&lt;figure name="3a15" id="3a15" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Ghwg5Wn9fm0PpMfY.png" data-width="700" data-height="438" src="https://cdn-images-1.medium.com/max/800/0*Ghwg5Wn9fm0PpMfY.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h4 name="aca4" id="aca4" class="graf graf--h4 graf-after--figure">How to login into Azure with Azure CLI&lt;/h4>&lt;p name="fb87" id="fb87" class="graf graf--p graf-after--h4">The easiest way to login into Azure is using the interactive mode. It will open a new tab on your browser with the authentication page.&lt;/p>&lt;p name="81f5" id="81f5" class="graf graf--p graf-after--p">To do it run the command &lt;code class="markup--code markup--p-code">az login&lt;/code> and choose your account:&lt;/p>&lt;figure name="06d0" id="06d0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cFaJ-sa-gDYIgWNEKGGXOA.png" data-width="464" data-height="595" src="https://cdn-images-1.medium.com/max/800/1*cFaJ-sa-gDYIgWNEKGGXOA.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;p name="0f7e" id="0f7e" class="graf graf--p graf-after--figure">By default, after choosing your account it will prompt a list of available subscriptions on that account. These subscriptions can also be listed with the command az account list, described below.&lt;/p>&lt;h4 name="0c11" id="0c11" class="graf graf--h4 graf-after--p">How to set a subscription with Azure CLI&lt;/h4>&lt;p name="5f5e" id="5f5e" class="graf graf--p graf-after--h4">First, we need to see which subscriptions are available. To do it run the command &lt;code class="markup--code markup--p-code">az account list&lt;/code> , this command will display all subscriptions available in your logged accounts.&lt;/p>&lt;figure name="4432" id="4432" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*u7pxouSyHjtGeWysTrJMWQ.png" data-width="1032" data-height="820" src="https://cdn-images-1.medium.com/max/800/1*u7pxouSyHjtGeWysTrJMWQ.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;p name="f6f9" id="f6f9" class="graf graf--p graf-after--figure">Once you have your subscriptions id, you can connect to it through the command &lt;code class="markup--code markup--p-code">az account set --subscription&lt;/code> . After this command, you can confirm if the subscription was settled by running the command &lt;code class="markup--code markup--p-code">az account show&lt;/code>&lt;/p>&lt;figure name="8f78" id="8f78" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*GxY7TQADhWhLRz4y.png" data-width="700" data-height="373" src="https://cdn-images-1.medium.com/max/800/0*GxY7TQADhWhLRz4y.png">&lt;figcaption class="imageCaption">Ìmage by author&lt;/figcaption>&lt;/figure>&lt;h3 name="4c96" id="4c96" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="ece5" id="ece5" class="graf graf--p graf-after--h3">Although the commands are simple, they are very important, as they are an entry gate to interact with Azure.&lt;/p>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--p">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/22c2c68ce4d9">&lt;time class="dt-published" datetime="2022-02-25T15:51:35.743Z">February 25, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-03-07_first-steps-with-azure--creating-an-azure-resource-group-with-azure-cli-6b60b3331461/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-03-07_first-steps-with-azure--creating-an-azure-resource-group-with-azure-cli-6b60b3331461/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>First steps with Azure: Creating an Azure Resource Group with Azure CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">First steps with Azure: Creating an Azure Resource Group with Azure CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
An Azure Resource Group is a container that holds related resources for an Azure solution. This is an important resource in Azure and in…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5492" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="c279" id="c279" class="graf graf--h3 graf--leading graf--title">First steps with Azure: Creating an Azure Resource Group with Azure CLI&lt;/h3>&lt;p name="b0ca" id="b0ca" class="graf graf--p graf-after--h3">An Azure Resource Group is a container that holds related resources for an Azure solution. This is an important resource in Azure and in this post, I will continue the series of Basic commands for Azure CLI and show how it is possible to create Azure Resource Groups using Azure CLI.&lt;/p>&lt;figure name="bb55" id="bb55" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*EERoSBDh5ydWiIxF4MQ_mw.jpeg" data-width="4898" data-height="3265" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*EERoSBDh5ydWiIxF4MQ_mw.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@photosimon?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@photosimon?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Simon Infanger&lt;/a> on &lt;a href="https://unsplash.com/s/photos/baby-steps-sand?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/baby-steps-sand?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="590c" id="590c" class="graf graf--h3 graf-after--figure">What is Az CLI?&lt;/h3>&lt;p name="b045" id="b045" class="graf graf--p graf-after--h3">Az CLI or Azure CLI is a command line interface with Azure. It can be used in any command line prompt, including PowerShell and Bash, and it allows the creation of resources and resource groups, executing actions, and much more possibilities. In the previous post, I showed the basic commands to connect and configure your Azure Subscription using Azure CLI, if you don’t know how to configure your Azure CLI local environment you can &lt;a href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" data-href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">check it here&lt;/a>.&lt;/p>&lt;h3 name="b095" id="b095" class="graf graf--h3 graf-after--p">What is an Azure Resource Group&lt;/h3>&lt;p name="027a" id="027a" class="graf graf--p graf-after--h3">According to Microsoft documentation, this is the definition of an Azure Resource Group:&lt;/p>&lt;blockquote name="0853" id="0853" class="graf graf--blockquote graf-after--p">A resource group is a container that holds related resources for an Azure solution. The resource group can include all the resources for the solution, or only those resources that you want to manage as a group. You decide how you want to allocate resources to resource groups based on what makes the most sense for your organization. Generally, add resources that share the same lifecycle to the same resource group so you can easily deploy, update, and delete them as a group.&lt;/blockquote>&lt;p name="85db" id="85db" class="graf graf--p graf-after--blockquote">In practice, we can consider it as a “Directory” on Azure where you can group your resources. There are many ways to organize it, the most common is to make them small with resources of the same context.&lt;/p>&lt;p name="0a10" id="0a10" class="graf graf--p graf-after--p">For more information, you can check the official documentation &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#what-is-a-resource-group" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#what-is-a-resource-group" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>.&lt;/p>&lt;h3 name="2a34" id="2a34" class="graf graf--h3 graf-after--p">Az CLI commands for Azure Resource Group&lt;/h3>&lt;h4 name="53a1" id="53a1" class="graf graf--h4 graf-after--h3">Azure Resource Group - Summary of commands&lt;/h4>&lt;p name="7111" id="7111" class="graf graf--p graf-after--h4">Below there is a summary of all commands used in this tutorial. You can copy it and replace the values between &amp;lt;&amp;gt; to your own values :)&lt;/p>&lt;figure name="f400" id="f400" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/59a7822c2c679f651511f5774d892f8c?file=ResourceGroups.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="0aed" id="0aed" class="graf graf--h4 graf-after--figure">How to use Az CLI Help?&lt;/h4>&lt;p name="98e9" id="98e9" class="graf graf--p graf-after--h4">It is also possible to check all commands related to resource groups with the command &lt;code class="markup--code markup--p-code">az --help&lt;/code> . For more details about how to use the help check&lt;a href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" data-href="https://faun.pub/an-entry-gate-to-azure-configuring-your-azure-subscription-with-azure-cli-22c2c68ce4d9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank"> this post&lt;/a> where I also show how to login into Azure Subscription with Azure CLI.&lt;/p>&lt;figure name="3646" id="3646" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*qzsCZn6P4B_IGE7aNc54Xw.png" data-width="972" data-height="508" src="https://cdn-images-1.medium.com/max/800/1*qzsCZn6P4B_IGE7aNc54Xw.png">&lt;figcaption class="imageCaption">az group help — Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="007f" id="007f" class="graf graf--h3 graf-after--figure">How to list existing Azure Resource Groups with Az CLI&lt;/h3>&lt;p name="e29d" id="e29d" class="graf graf--p graf-after--h3">The command used to list Azure Resource Groups is &lt;code class="markup--code markup--p-code">az group list&lt;/code> . It will return a JSON by default. To have a more human understandable output you can add &lt;code class="markup--code markup--p-code">--output table&lt;/code>in front of the command or any other output of your choice. The final command would be&lt;code class="markup--code markup--p-code">az group list --output table&lt;/code> .&lt;/p>&lt;figure name="f4e9" id="f4e9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Jg2D1lp2XIK4jOkssyQKqA.png" data-width="992" data-height="360" src="https://cdn-images-1.medium.com/max/800/1*Jg2D1lp2XIK4jOkssyQKqA.png">&lt;figcaption class="imageCaption">az group list — Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="ccc0" id="ccc0" class="graf graf--h3 graf-after--figure">How to create an Azure Resource Group with Az CLI&lt;/h3>&lt;p name="0f17" id="0f17" class="graf graf--p graf-after--h3">To create a new Azure Resource Group, it is necessary to provide two required information:&lt;/p>&lt;ul class="postList">&lt;li name="395c" id="395c" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Location&lt;/strong>: The Azure Region where your resource group will be created.&lt;/li>&lt;li name="0625" id="0625" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Name: &lt;/strong>The name of your Resource Group&lt;/li>&lt;/ul>&lt;p name="d501" id="d501" class="graf graf--p graf-after--li">The final command is &lt;code class="markup--code markup--p-code">az group create --location &amp;lt;location of your resource group&amp;gt; --name &amp;lt;name of your resource group&amp;gt;&lt;/code> . Replace the content between &amp;lt;&amp;gt; with your own values .&lt;/p>&lt;figure name="32c9" id="32c9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Jyy_7GHOHiTDpqud7hGruw.png" data-width="992" data-height="500" src="https://cdn-images-1.medium.com/max/800/1*Jyy_7GHOHiTDpqud7hGruw.png">&lt;figcaption class="imageCaption">az group create — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="7afc" id="7afc" class="graf graf--p graf-after--figure">To check additional options use the command &lt;code class="markup--code markup--p-code">az group --help&lt;/code> .&lt;/p>&lt;p name="7064" id="7064" class="graf graf--p graf-after--p">After creation, run again the command &lt;code class="markup--code markup--p-code">az group list --output table&lt;/code>to check if the resource group is shown.&lt;/p>&lt;figure name="c47f" id="c47f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*u805NgHvFi7QjF5qTGfICw.png" data-width="992" data-height="388" src="https://cdn-images-1.medium.com/max/800/1*u805NgHvFi7QjF5qTGfICw.png">&lt;figcaption class="imageCaption">az group list — Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="58f8" id="58f8" class="graf graf--h3 graf-after--figure">How to show details of an Azure Resource Group with Az CLI&lt;/h3>&lt;p name="be72" id="be72" class="graf graf--p graf-after--h3">To check the details of a specific Resource Group, you can run the command &lt;code class="markup--code markup--p-code">az group show --name &amp;lt;your resource group name&amp;gt;&lt;/code> . This command returns basically the same information after the creation command.&lt;/p>&lt;figure name="a435" id="a435" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*p_zyDT4xi590b0oXXbIewQ.png" data-width="992" data-height="500" src="https://cdn-images-1.medium.com/max/800/1*p_zyDT4xi590b0oXXbIewQ.png">&lt;figcaption class="imageCaption">az group show — Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="56b5" id="56b5" class="graf graf--h3 graf-after--figure">How to delete an Azure Resource Group with Az CLI&lt;/h3>&lt;p name="4663" id="4663" class="graf graf--p graf-after--h3">The delete command will prompt if you are sure about executing the delete operation. This is because all resources created under this resource group will also be deleted, so run this command only when you want to delete them as well.&lt;/p>&lt;p name="5352" id="5352" class="graf graf--p graf-after--p">After the conclusion of the command, after running the list command the created resource group is not listed anymore.&lt;/p>&lt;figure name="8bae" id="8bae" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*sXlJmtY762m-Y74U2dVfHw.png" data-width="992" data-height="472" src="https://cdn-images-1.medium.com/max/800/1*sXlJmtY762m-Y74U2dVfHw.png">&lt;/figure>&lt;h3 name="a803" id="a803" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="107d" id="107d" class="graf graf--p graf-after--h3">The Resource Groups are an important part of Azure and automating its creation is a fundamental part of a DevOps process.&lt;/p>&lt;p name="632e" id="632e" class="graf graf--p graf-after--p">See you in the next post!&lt;/p>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--p">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/6b60b3331461">&lt;time class="dt-published" datetime="2022-03-07T17:25:56.473Z">March 7, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/first-steps-with-azure-creating-an-azure-resource-group-with-azure-cli-6b60b3331461" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-03-16_it-s-time-to-tidy-up-your-code--how-to-use-visual-studio-code-autoformat-20b0e32bc73e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-03-16_it-s-time-to-tidy-up-your-code--how-to-use-visual-studio-code-autoformat-20b0e32bc73e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>It’s time to tidy up your code: How to use Visual Studio Code Autoformat&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">It’s time to tidy up your code: How to use Visual Studio Code Autoformat&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you are like me and like to have consistency in formatting your code, this is definitely a must to have configuration.
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="4e04" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5d86" id="5d86" class="graf graf--h3 graf--leading graf--title">It’s time to tidy up your code: How to use Visual Studio Code Autoformat&lt;/h3>&lt;figure name="9ed7" id="9ed7" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="1*N_tA9AjjjsJm1w_h2pPghQ.jpeg" data-width="6000" data-height="4000" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*N_tA9AjjjsJm1w_h2pPghQ.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@hocza?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@hocza?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Jozsef Hocza&lt;/a> on &lt;a href="https://unsplash.com/s/photos/broom?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/broom?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="33c2" id="33c2" class="graf graf--p graf-after--figure">If you are like me and like to have consistency in formatting your code, this is definitely a must to have configuration.&lt;/p>&lt;p name="191e" id="191e" class="graf graf--p graf-after--p">By default, you can use VS code formatters with the shortcut &lt;code class="markup--code markup--p-code">Alt+Shift+F&lt;/code> but, you can also configure it to format every time you save your file, like this:&lt;/p>&lt;figure name="36df" id="36df" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*BGAaZ9S8L34Ju1fHOxV56Q.gif" data-width="964" data-height="542" src="https://cdn-images-1.medium.com/max/800/1*BGAaZ9S8L34Ju1fHOxV56Q.gif">&lt;/figure>&lt;h3 name="4a03" id="4a03" class="graf graf--h3 graf-after--figure">How to enable autoformat on Visual Studio Code&lt;/h3>&lt;p name="6551" id="6551" class="graf graf--p graf-after--h3">There are two options to enable autoformat by UI and editing settings.json file, let’s check both:&lt;/p>&lt;h4 name="2578" id="2578" class="graf graf--h4 graf-after--p">How to edit autoformat option on VS Code User Interface&lt;/h4>&lt;p name="ae27" id="ae27" class="graf graf--p graf-after--h4">Open the menu &lt;code class="markup--code markup--p-code">File-&amp;gt;Preferences-&amp;gt;Settings&lt;/code> and under Text Editor look for &lt;code class="markup--code markup--p-code">Formating&lt;/code> and enable the option &lt;code class="markup--code markup--p-code">Format On Save&lt;/code> choosing which option is better on &lt;code class="markup--code markup--p-code">Format On Save Mode&lt;/code> .&lt;/p>&lt;p name="79d0" id="79d0" class="graf graf--p graf-after--p">If you’re using version control, you can choose to format changes only, this is particularly useful if you’re working on legacy code and don’t want to change a large file at once. For this option choose &lt;code class="markup--code markup--p-code">modificationsIfAvailable&lt;/code> .&lt;/p>&lt;figure name="7946" id="7946" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*wet4EZdGEKs4L2FqZathyg.png" data-width="1024" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*wet4EZdGEKs4L2FqZathyg.png">&lt;/figure>&lt;h4 name="e211" id="e211" class="graf graf--h4 graf-after--figure">How to edit autoformat option on VS Code settings.json&lt;/h4>&lt;p name="b282" id="b282" class="graf graf--p graf-after--h4">To find settings.json file, open your Visual Studio Code and press F1:&lt;/p>&lt;figure name="e739" id="e739" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*6e0UH_No8bBsxSamdTcy2A.png" data-width="1024" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*6e0UH_No8bBsxSamdTcy2A.png">&lt;/figure>&lt;p name="6051" id="6051" class="graf graf--p graf-after--figure">Now type &lt;code class="markup--code markup--p-code">settings.json &lt;/code>, open the file and add the section:&lt;/p>&lt;figure name="2e85" id="2e85" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/cebb0f1a487e9ac9c3d985eda8d28693?file=formatOnSave.json.js">&lt;/script>&lt;/figure>&lt;p name="41d2" id="41d2" class="graf graf--p graf-after--figure">For the configuration&lt;code class="markup--code markup--p-code">Format On Save Mode&lt;/code> you can pick of the of the options below:&lt;/p>&lt;ul class="postList">&lt;li name="0e5c" id="0e5c" class="graf graf--li graf-after--p">file&lt;/li>&lt;li name="efd4" id="efd4" class="graf graf--li graf-after--li">modifications&lt;/li>&lt;li name="c856" id="c856" class="graf graf--li graf-after--li">modificationsIfAvailable&lt;/li>&lt;/ul>&lt;p name="f9d6" id="f9d6" class="graf graf--p graf-after--li">This is how your file should look like:&lt;/p>&lt;figure name="aa0d" id="aa0d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*NFY7b7pWnYaRY68q3Tsheg.png" data-width="613" data-height="172" src="https://cdn-images-1.medium.com/max/800/1*NFY7b7pWnYaRY68q3Tsheg.png">&lt;/figure>&lt;p name="48c4" id="48c4" class="graf graf--p graf-after--figure">This configuration applies to most part of the supported languages, like PowerShell, JSON, C#, and others.&lt;/p>&lt;h3 name="d363" id="d363" class="graf graf--h3 graf-after--p">How to autoformat Terraform files on Visual Studio Code&lt;/h3>&lt;p name="ecd4" id="ecd4" class="graf graf--p graf-after--h3">Although the configuration above works for most languages if you are using terraform you need additional configurations. The plugin also doesn’t have a UI for it, so we need to add the configuration manually in the file settings.json.&lt;/p>&lt;p name="4b0f" id="4b0f" class="graf graf--p graf-after--p">To do it, open again the &lt;code class="markup--code markup--p-code">settings.json&lt;/code> file and add the following sections:&lt;/p>&lt;figure name="d6a4" id="d6a4" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/cebb0f1a487e9ac9c3d985eda8d28693?file=terraformSave.json.js">&lt;/script>&lt;/figure>&lt;p name="a313" id="a313" class="graf graf--p graf-after--figure">Pay attention that you must add one section for Terraform, and one more for terraform-vars.&lt;/p>&lt;p name="0f82" id="0f82" class="graf graf--p graf-after--p">This is the final file:&lt;/p>&lt;figure name="e0ad" id="e0ad" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*61hu0VbbIpGNiVOXYJz29w.png" data-width="624" data-height="352" src="https://cdn-images-1.medium.com/max/800/1*61hu0VbbIpGNiVOXYJz29w.png">&lt;/figure>&lt;h3 name="6d28" id="6d28" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="e81b" id="e81b" class="graf graf--p graf-after--h3">Autoformatting is an easy and helpful option that will for sure help your team to have consistency and keep your codebase tidy and clean.&lt;/p>&lt;p name="b9e4" id="b9e4" class="graf graf--p graf-after--p">See you in the next post!&lt;/p>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--p">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/20b0e32bc73e">&lt;time class="dt-published" datetime="2022-03-16T11:25:13.093Z">March 16, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/its-time-to-tidy-up-your-code-how-to-use-visual-studio-code-autoformat-20b0e32bc73e" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-03-23_creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-03-23_creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating Infrastructure as Code for Azure with Azure Bicep step by step&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating Infrastructure as Code for Azure with Azure Bicep step by step&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
One of the natural steps towards DevOps and Cloud Adoption is to create your Infrastructure using Code. For Azure, the most convenient…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="2625" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="af08" id="af08" class="graf graf--h3 graf--leading graf--title">Creating Infrastructure as Code for Azure with Azure Bicep step by step&lt;/h3>&lt;figure name="b97e" id="b97e" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="1*opFga-VoKoV_iJ_UdsHyIQ.jpeg" data-width="4032" data-height="3024" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*opFga-VoKoV_iJ_UdsHyIQ.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@golfarisa?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@golfarisa?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Arisa Chattasa&lt;/a> on &lt;a href="https://unsplash.com/s/photos/boxing?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/boxing?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="2342" id="2342" class="graf graf--p graf-after--figure">One of the natural steps towards DevOps and Cloud Adoption is to create your Infrastructure using Code. For Azure, the most convenient language for this is Azure Bicep which abstracts several aspects of this complex process, and supports more resources available in Azure than any other tool, making it one of the most powerful Infrastructure as Code tools for Azure.&lt;/p>&lt;h3 name="f874" id="f874" class="graf graf--h3 graf-after--p">What is Azure Bicep?&lt;/h3>&lt;p name="a04e" id="a04e" class="graf graf--p graf-after--h3">According to &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" data-href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Microsoft Documentation&lt;/a>, this is the definition of Bicep:&lt;/p>&lt;blockquote name="c583" id="c583" class="graf graf--blockquote graf-after--p">Bicep is a domain-specific language (DSL) that uses declarative syntax to deploy Azure resources. In a Bicep file, you define the infrastructure you want to deploy to Azure, and then use that file throughout the development lifecycle to repeatedly deploy your infrastructure.&lt;/blockquote>&lt;p name="4758" id="4758" class="graf graf--p graf-after--blockquote">In summary, this is an abstraction over ARM templates which simplifies A LOT the development of Infrastructure as Code. Its syntax is much simpler and less verbose than ARM but still has all its capabilities.&lt;/p>&lt;p name="a00d" id="a00d" class="graf graf--p graf-after--p">As bicep is a DSL, we can consider ARM as an Intermediate Language and we can “build” bicep into ARM to perform our deployments. A curiosity is that the name bicep is a play on words for ARM (Azure Resource Manager) 😄.&lt;/p>&lt;figure name="5b42" id="5b42" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Xj6hKE461XITJs6O.gif" data-width="498" data-height="330" src="https://cdn-images-1.medium.com/max/800/0*Xj6hKE461XITJs6O.gif">&lt;/figure>&lt;h3 name="e71d" id="e71d" class="graf graf--h3 graf-after--figure">How to create an Azure Resource Group with Azure Bicep?&lt;/h3>&lt;p name="00d7" id="00d7" class="graf graf--p graf-after--h3">Usually, one of the firsts resources on Azure that we need to create is a Resource Group, as it will group all other resources, and make it easier to administrate.&lt;/p>&lt;p name="4710" id="4710" class="graf graf--p graf-after--p">Create an Azure Resource Group using Azure Bicep it is quite simple, you need just the name of the resource group and the location that it will be created. Additionally, it is necessary to define the &lt;code class="markup--code markup--p-code">&lt;em class="markup--em markup--p-em">targeScope &lt;/em>&lt;/code>as a subscription, it will be explained in more detail below.&lt;/p>&lt;figure name="ae5d" id="ae5d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/34f6ac600a5df7619b81d5b8f45fe714?file=00_ResourceGroup.bicep.js">&lt;/script>&lt;/figure>&lt;p name="ad28" id="ad28" class="graf graf--p graf-after--figure">It is possible to deploy it in different ways, using Azure PowerShell, Azure CLI, or even Azure API’s. In this example, we will use Azure CLI to execute the deployment.&lt;/p>&lt;h3 name="c624" id="c624" class="graf graf--h3 graf-after--p">How to execute an Azure Resource Group deployment with Azure Bicep and Azure CLI?&lt;/h3>&lt;p name="6063" id="6063" class="graf graf--p graf-after--h3">On the latest versions of Azure CLI, there are different commands to run deployments against different scopes on Azure. To create Azure Resource Groups, it is necessary to use the &lt;em class="markup--em markup--p-em">subscription &lt;/em>scope, which was also defined on the bicep template above.&lt;/p>&lt;p name="4e48" id="4e48" class="graf graf--p graf-after--p">The command used is &lt;code class="markup--code markup--p-code">az deployment sub create&lt;/code> :&lt;/p>&lt;figure name="c217" id="c217" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/34f6ac600a5df7619b81d5b8f45fe714?file=00_Deploy-ResourceGroup.ps1.js">&lt;/script>&lt;/figure>&lt;p name="c25d" id="c25d" class="graf graf--p graf-after--figure">After running the script, we can check the resource group with the command &lt;code class="markup--code markup--p-code">az group show --name rg-bicepdemo&lt;/code> :&lt;/p>&lt;figure name="4f03" id="4f03" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*VqjeZS9nGltwhUhh5dnfKw.png" data-width="920" data-height="310" src="https://cdn-images-1.medium.com/max/800/1*VqjeZS9nGltwhUhh5dnfKw.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;h3 name="df40" id="df40" class="graf graf--h3 graf-after--figure">How to create an Azure Storage Account with Azure Bicep and Azure CLI?&lt;/h3>&lt;p name="c321" id="c321" class="graf graf--p graf-after--h3">When we will create a “common” resource, like Storage Account, Resource Group scope must be used. This is the default behavior of bicep, so it is not necessary to specify like it was for Resource Group creation.&lt;/p>&lt;figure name="08c3" id="08c3" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/34f6ac600a5df7619b81d5b8f45fe714?file=00_StorageAccount.bicep.js">&lt;/script>&lt;/figure>&lt;p name="ace7" id="ace7" class="graf graf--p graf-after--figure">To create resources on Resource Group scope, the Azure CLI command used must be &lt;code class="markup--code markup--p-code">az deployment group create&lt;/code> :&lt;/p>&lt;figure name="547e" id="547e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/34f6ac600a5df7619b81d5b8f45fe714?file=00_Deploy-StorageAccount.ps1.js">&lt;/script>&lt;/figure>&lt;p name="e062" id="e062" class="graf graf--p graf-after--figure">To check the Storage Account creation run the command &lt;code class="markup--code markup--p-code">az storage account show --name stbicepdemo&lt;/code>&lt;/p>&lt;figure name="cd03" id="cd03" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cpJGnAWnd5Epc1NgkxxQ4A.png" data-width="617" data-height="526" src="https://cdn-images-1.medium.com/max/800/1*cpJGnAWnd5Epc1NgkxxQ4A.png">&lt;figcaption class="imageCaption">Image by author&lt;/figcaption>&lt;/figure>&lt;p name="8e62" id="8e62" class="graf graf--p graf-after--figure">As they are in different scopes, it is not possible to run both bicep files with one command, however, I prepared a PowerShell script to run them in sequence:&lt;/p>&lt;figure name="fabf" id="fabf" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.githubusercontent.com/wesleycamargo/34f6ac600a5df7619b81d5b8f45fe714?file=00_Deploy-Complete.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="0a67" id="0a67" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="2e74" id="2e74" class="graf graf--p graf-after--h3">Azure Bicep is one of the most promising Infra as Code tools for Azure, and it is quite simple to create new templates for it. Its syntax is very simple and easy to learn, so why not give it a chance? :)&lt;/p>&lt;p name="7c5f" id="7c5f" class="graf graf--p graf-after--p">See you in the next post!&lt;/p>&lt;figure name="8653" id="8653" class="graf graf--figure graf-after--p">&lt;a href="https://faun.to/bP1m5" data-href="https://faun.to/bP1m5" class="graf-imageAnchor" data-action="image-link" data-action-observe-only="true"rel="noopener"target="_blank">&lt;img class="graf-image" data-image-id="1*BCiLLad3dvZLwBa-B5cAVQ.png" data-width="1500" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*BCiLLad3dvZLwBa-B5cAVQ.png">&lt;/a>&lt;/figure>&lt;p name="3652" id="3652" class="graf graf--p graf-after--figure">Join FAUN: &lt;a href="https://faun.to/i9Pt9" data-href="https://faun.to/i9Pt9" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Website&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💻&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://faun.dev/podcast" data-href="https://faun.dev/podcast" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Podcast&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🎙️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://twitter.com/joinfaun" data-href="https://twitter.com/joinfaun" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Twitter&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🐦&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.facebook.com/faun.dev/" data-href="https://www.facebook.com/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>👥&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://instagram.com/fauncommunity/" data-href="https://instagram.com/fauncommunity/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Instagram&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📷|&lt;a href="https://www.facebook.com/groups/364904580892967/" data-href="https://www.facebook.com/groups/364904580892967/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Facebook Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>🗣️&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://www.linkedin.com/company/faundev" data-href="https://www.linkedin.com/company/faundev" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Linkedin Group&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>💬&lt;strong class="markup--strong markup--p-strong">|&lt;/strong> &lt;a href="https://faun.dev/chat" data-href="https://faun.dev/chat" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Slack&lt;/strong>&lt;/a> 📱&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://thechief.io" data-href="https://thechief.io" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">Cloud Native&lt;/strong> &lt;strong class="markup--strong markup--p-strong">News&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>📰&lt;strong class="markup--strong markup--p-strong">|&lt;/strong>&lt;a href="https://linktr.ee/faun.dev/" data-href="https://linktr.ee/faun.dev/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">More&lt;/strong>&lt;/a>&lt;strong class="markup--strong markup--p-strong">.&lt;/strong>&lt;/p>&lt;p name="3062" id="3062" class="graf graf--p graf-after--p graf--trailing">&lt;strong class="markup--strong markup--p-strong">If this post was helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/58f03cee75e1">&lt;time class="dt-published" datetime="2022-03-23T09:54:57.798Z">March 23, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-07-27_como-funcionam-os-loops---developer-br---corujinhas-beb8d4075336/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-07-27_como-funcionam-os-loops---developer-br---corujinhas-beb8d4075336/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Como funcionam os Loops — Developer BR — Corujinhas&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Como funcionam os Loops — Developer BR — Corujinhas&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Loops
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="cc2f" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ae86" id="ae86" class="graf graf--h3 graf--leading graf--title">Como funcionam os Loops — Developers BR — Corujinhas&lt;/h3>&lt;h3 name="231c" id="231c" class="graf graf--h3 graf-after--h3">Loops&lt;/h3>&lt;h4 name="e9d8" id="e9d8" class="graf graf--h4 graf-after--h3">O que é um loop ou laço?&lt;/h4>&lt;p name="ae5d" id="ae5d" class="graf graf--p graf-after--h4">Um loop é uma maneira de executar um trecho código repetidas vezes. É composto de uma condição e o código que será executado.&lt;/p>&lt;p name="b1dc" id="b1dc" class="graf graf--p graf-after--p">O loop é representado por um circuito fechado, e enquanto a condição não for satisfeita se repete infinitamente.&lt;/p>&lt;figure name="b19f" id="b19f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*hgbUwY6z642w44jS.png" data-width="420" data-height="414" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*hgbUwY6z642w44jS.png">&lt;/figure>&lt;h4 name="f74d" id="f74d" class="graf graf--h4 graf-after--figure">Condições de um loop&lt;/h4>&lt;p name="a040" id="a040" class="graf graf--p graf-after--h4">As condições são usadas para verificar quantas vezes o trecho de código será repetido. Antes de cada execução (ou depois, dependendo do tipo da estrutura de repetição usada), a condição é verificada e se continuar verdadeira o código é executado. Os tipo de condições podem ser:&lt;/p>&lt;ul class="postList">&lt;li name="e1ac" id="e1ac" class="graf graf--li graf-after--p">Verdadeiro ou Falso&lt;/li>&lt;li name="2251" id="2251" class="graf graf--li graf-after--li">Um número específico de vezes&lt;/li>&lt;li name="84a3" id="84a3" class="graf graf--li graf-after--li">O número de elementos em uma coleção&lt;/li>&lt;/ul>&lt;h4 name="3814" id="3814" class="graf graf--h4 graf-after--li">Código&lt;/h4>&lt;p name="2b1b" id="2b1b" class="graf graf--p graf-after--h4">Praticamente qualquer tipo de código pode ser executado em um loop, não há restrições! Em alguns casos, certos tipos de variáveis são usadas para ajudar a controlar o que está acontecendo durante as repetições. Essa variável é chamada de &lt;strong class="markup--strong markup--p-strong">contador&lt;/strong>.&lt;/p>&lt;h4 name="b374" id="b374" class="graf graf--h4 graf-after--p">Quando usar um loop&lt;/h4>&lt;p name="38f4" id="38f4" class="graf graf--p graf-after--h4">Usamos loops quando precisamos fazer a mesma coisa várias vezes. Vamos a um exemplo:&lt;/p>&lt;p name="116f" id="116f" class="graf graf--p graf-after--p">Imagine que estamos criando um sistema para uma cafeteria. Os requisitos para esse sistema são:&lt;/p>&lt;ul class="postList">&lt;li name="1c48" id="1c48" class="graf graf--li graf-after--p">Para cada novo café pedido escrever na tela o número do pedido que está sendo executado&lt;/li>&lt;li name="62a0" id="62a0" class="graf graf--li graf-after--li">Ao final exibir a quantidade total de cafés preparados&lt;/li>&lt;/ul>&lt;p name="cb60" id="cb60" class="graf graf--p graf-after--li">Para simplificar, vamos imaginar que temos 3 pedidos de café e precisamos executá-los. Como seria esse código?&lt;/p>&lt;pre name="1321" id="1321" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">int cafesPreparados = 0;&lt;/code>&lt;/pre>&lt;pre name="0834" id="0834" class="graf graf--pre graf-after--pre">&lt;code class="markup--code markup--pre-code">// Preparando o café&lt;br>cafesPreparados++;&lt;br>Console.WriteLine($&amp;quot;Preparando o 1° café&amp;quot;);&lt;/code>&lt;/pre>&lt;pre name="420e" id="420e" class="graf graf--pre graf-after--pre">&lt;code class="markup--code markup--pre-code">cafesPreparados++;&lt;br>Console.WriteLine($&amp;quot;Preparando o 2° café&amp;quot;);&lt;/code>&lt;/pre>&lt;pre name="4332" id="4332" class="graf graf--pre graf-after--pre">&lt;code class="markup--code markup--pre-code">cafesPreparados++;&lt;br>Console.WriteLine($&amp;quot;Preparando o 3° café&amp;quot;);&lt;/code>&lt;/pre>&lt;pre name="8d64" id="8d64" class="graf graf--pre graf-after--pre">&lt;code class="markup--code markup--pre-code">Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;);&lt;/code>&lt;/pre>&lt;p name="e23d" id="e23d" class="graf graf--p graf-after--pre">Não parece tão complicado, certo? Realmente, se tivermos poucos pedidos não é uma tarefa difícil, mas temos dois problemas:&lt;/p>&lt;ul class="postList">&lt;li name="92f1" id="92f1" class="graf graf--li graf-after--p">No caso de apenas 3 pedidos, foram apenas mais 6 linhas de código, mas e se fossem 100? Ou 1000? Teremos um programador bem entediado repetindo esse código tantas vezes…&lt;/li>&lt;li name="65f7" id="65f7" class="graf graf--li graf-after--li">Além do problema acima, de termos tarefas repetitivas, nós adicionamos dentro do código cada pedido feito - O que impede de recebermos pedidos dinamicamente e na pratica inviabiliza a aplicação.&lt;/li>&lt;/ul>&lt;p name="f856" id="f856" class="graf graf--p graf-after--li">Mas imagine que agora nossa cafeteria aceita pedidos online, e recebeu 10000 pedidos. Como fazer isso?&lt;/p>&lt;p name="6977" id="6977" class="graf graf--p graf-after--p">É nessa situação que os loops vão te ajudar!&lt;/p>&lt;h3 name="bfcc" id="bfcc" class="graf graf--h3 graf-after--p">Tipos de loops&lt;/h3>&lt;h4 name="af0a" id="af0a" class="graf graf--h4 graf-after--h3">While&lt;/h4>&lt;p name="dd86" id="dd86" class="graf graf--p graf-after--h4">É o tipo mais básico de loop. No while, a condição é verificada antes da execução, e se for verdadeira o código é executado. Normalmente é usado para comparações de verdadeiro e falso mas com um pouco mais de trabalho, ele consegue substituir algumas das outras estruturas de repetição, como for e forEach.&lt;/p>&lt;figure name="ed42" id="ed42" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*GaTv8RxkcfvejFwH.png" data-width="420" data-height="414" src="https://cdn-images-1.medium.com/max/800/0*GaTv8RxkcfvejFwH.png">&lt;/figure>&lt;p name="1457" id="1457" class="graf graf--p graf-after--figure">As principais características do while são:&lt;/p>&lt;ul class="postList">&lt;li name="eb85" id="eb85" class="graf graf--li graf-after--p">Enquanto uma condição for verdadeira(ou falsa), continue repetindo.&lt;/li>&lt;li name="ab98" id="ab98" class="graf graf--li graf-after--li">Executa o trecho de código uma vez, volta ao inicio e verifica se a condição continua verdadeira e executa novamente.&lt;/li>&lt;li name="0c1a" id="0c1a" class="graf graf--li graf-after--li">Atenção! Isso pode acontecer para sempre, desde que a condição continue verdadeira! Isso é chamado de loop infinito e na maioria dos casos não é desejado.&lt;/li>&lt;/ul>&lt;pre name="bd0a" id="bd0a" class="graf graf--pre graf-after--li">Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;);&lt;br>&lt;em class="markup--em markup--pre-em">int&lt;/em> devs = Convert.ToInt32(Console.ReadLine());&lt;/pre>&lt;pre name="b2bf" id="b2bf" class="graf graf--pre graf-after--pre">&lt;em class="markup--em markup--pre-em">int&lt;/em> cafesPreparados = 0;&lt;/pre>&lt;pre name="0ada" id="0ada" class="graf graf--pre graf-after--pre">while (cafesPreparados &amp;lt; devs)&lt;br>{&lt;br> cafesPreparados++;&lt;br> Console.WriteLine($&amp;quot;Preparando o {cafesPreparados}° café&amp;quot;);&lt;br>}&lt;/pre>&lt;pre name="a5eb" id="a5eb" class="graf graf--pre graf-after--pre">Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;);&lt;/pre>&lt;h4 name="a1a9" id="a1a9" class="graf graf--h4 graf-after--pre">Do While&lt;/h4>&lt;p name="d0ca" id="d0ca" class="graf graf--p graf-after--h4">Para do while, acontece o oposto, o código é executado e apenas após a condição é verificada. Isso pode ser útil em casos onde pelo menos uma execução é sempre necessária.&lt;/p>&lt;figure name="b8c7" id="b8c7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*7FpTKrY1o27XneqV.png" data-width="421" data-height="393" src="https://cdn-images-1.medium.com/max/800/0*7FpTKrY1o27XneqV.png">&lt;/figure>&lt;pre name="d775" id="d775" class="graf graf--pre graf-after--figure">Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;);&lt;br>&lt;em class="markup--em markup--pre-em">int&lt;/em> devs = Convert.ToInt32(Console.ReadLine());&lt;/pre>&lt;pre name="d221" id="d221" class="graf graf--pre graf-after--pre">&lt;em class="markup--em markup--pre-em">int&lt;/em> cafesPreparados = 0;&lt;/pre>&lt;pre name="b01c" id="b01c" class="graf graf--pre graf-after--pre">do&lt;br>{&lt;br> cafesPreparados++;&lt;br> Console.WriteLine($&amp;quot;Preparando o {cafesPreparados}° café&amp;quot;);&lt;br>} while (cafesPreparados &amp;lt; devs);&lt;/pre>&lt;pre name="9bc7" id="9bc7" class="graf graf--pre graf-after--pre">if (cafesPreparados &amp;gt; devs)&lt;br>{&lt;br> Console.WriteLine($&amp;quot;Oh não! O café está esfriando e nenhum dev está por perto!&amp;quot;);&lt;br>}&lt;br>else&lt;br>{&lt;br> Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;);&lt;br>}&lt;/pre>&lt;h4 name="be10" id="be10" class="graf graf--h4 graf-after--pre">For&lt;/h4>&lt;p name="8cbc" id="8cbc" class="graf graf--p graf-after--h4">O for funciona da mesma maneira que o while. É recomendado seu uso para casos em que a quantidade de vezes que a repetição deve acontecer é conhecida. Para declarar um for é necessária uma variável, chamada index ou i e são necessárias 3 declarações separadas por ponto e vírgula(;):&lt;/p>&lt;figure name="5cff" id="5cff" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*TcDDIvQkLXBxHr-T.png" data-width="406" data-height="72" src="https://cdn-images-1.medium.com/max/800/0*TcDDIvQkLXBxHr-T.png">&lt;/figure>&lt;ul class="postList">&lt;li name="0bd5" id="0bd5" class="graf graf--li graf-after--figure">Inicializar: Declaramos o valor inicial do índice&lt;/li>&lt;li name="7bd5" id="7bd5" class="graf graf--li graf-after--li">Condição: Adicionamos a comparação que será usada para parar o loop&lt;/li>&lt;li name="f089" id="f089" class="graf graf--li graf-after--li">Iterar: Incrementamos o índice, normalmente com ++&lt;/li>&lt;/ul>&lt;pre name="b9ab" id="b9ab" class="graf graf--pre graf-after--li">Console.WriteLine(&amp;quot;Quantos devs precisam de café?&amp;quot;);&lt;br>&lt;em class="markup--em markup--pre-em">int&lt;/em> devs = Convert.ToInt32(Console.ReadLine());&lt;/pre>&lt;pre name="3bdd" id="3bdd" class="graf graf--pre graf-after--pre">&lt;em class="markup--em markup--pre-em">int&lt;/em> cafesPreparados = 0;&lt;/pre>&lt;pre name="4f4c" id="4f4c" class="graf graf--pre graf-after--pre">for (&lt;em class="markup--em markup--pre-em">int&lt;/em> i = 0; i &amp;lt; devs; i++)&lt;br>{&lt;br> Console.WriteLine($&amp;quot;Preparando o {i}° café&amp;quot;);&lt;br> cafesPreparados = i;&lt;br>}&lt;/pre>&lt;pre name="3644" id="3644" class="graf graf--pre graf-after--pre">Console.WriteLine($&amp;quot;Total de devs felizes: {cafesPreparados}&amp;quot;);&lt;/pre>&lt;h4 name="0e48" id="0e48" class="graf graf--h4 graf-after--pre">Foreach&lt;/h4>&lt;p name="c202" id="c202" class="graf graf--p graf-after--h4">O foreach é recomendado quando trabalhamos com coleções ou listas. Sua tradução é “para cada”, o que significa o trecho de código será repetido uma vez para cada elemento da lista.&lt;/p>&lt;pre name="2c5e" id="2c5e" class="graf graf--pre graf-after--p">var developers = new List&amp;lt;&lt;em class="markup--em markup--pre-em">string&lt;/em>&amp;gt;();&lt;br>&lt;em class="markup--em markup--pre-em">string&lt;/em> maisdevs = &amp;quot;s&amp;quot;;&lt;/pre>&lt;pre name="3ed1" id="3ed1" class="graf graf--pre graf-after--pre">do&lt;br>{&lt;br> Console.WriteLine(&amp;quot;Digite o nome do dev:&amp;quot;);&lt;br> developers.Add(Console.ReadLine() as &lt;em class="markup--em markup--pre-em">string&lt;/em> ?? string.Empty);&lt;/pre>&lt;pre name="3364" id="3364" class="graf graf--pre graf-after--pre"> Console.WriteLine(&amp;quot;Mais algum dev precisa de café? [S/N]&amp;quot;);&lt;br> maisdevs = Console.ReadLine() as &lt;em class="markup--em markup--pre-em">string&lt;/em> ?? string.Empty;&lt;br>} while (maisdevs.ToLower().Equals(&amp;quot;s&amp;quot;));&lt;/pre>&lt;pre name="3f94" id="3f94" class="graf graf--pre graf-after--pre">foreach (var dev in developers)&lt;br>{&lt;br> Console.WriteLine($&amp;quot;Preparando café para o dev {dev}&amp;quot;);&lt;br>}&lt;/pre>&lt;pre name="e5a8" id="e5a8" class="graf graf--pre graf-after--pre">Console.WriteLine($&amp;quot;Total de devs felizes: {developers.Count}&amp;quot;);&lt;/pre>&lt;h3 name="602c" id="602c" class="graf graf--h3 graf-after--pre">GitHub do Corujinhas&lt;/h3>&lt;p name="b2a4" id="b2a4" class="graf graf--p graf-after--h3 graf--trailing">Para os exemplos completos, veja o repositório do corujinhas no GitHub!&lt;br>&lt;a href="https://github.com/Developers-BR/corujinhas" data-href="https://github.com/Developers-BR/corujinhas" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Developers-BR/corujinhas (github.com)&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/beb8d4075336">&lt;time class="dt-published" datetime="2022-07-27T21:48:29.893Z">July 27, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/como-funcionam-os-loops-developer-br-corujinhas-beb8d4075336" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-09-26_how-to-deploy-management-groups-with-azure-bicep-and-azure-devops-7a2e20240a6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-09-26_how-to-deploy-management-groups-with-azure-bicep-and-azure-devops-7a2e20240a6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to deploy Management Groups with Azure Bicep and Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to deploy Management Groups with Azure Bicep and Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you have several Subscriptions on your Azure Tenant, Management Groups can be very handy to organize them. Check in this post, on how to…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d73d" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="a7cd" id="a7cd" class="graf graf--h3 graf--leading graf--title">How to deploy Management Groups with Azure Bicep and Azure DevOps&lt;/h3>&lt;p name="1a32" id="1a32" class="graf graf--p graf-after--h3">If you have several Subscriptions on your Azure Tenant, Management Groups can be very handy to organize them. Check in this post, on how to deploy Management Groups using Azure Bicep.&lt;/p>&lt;figure name="f75b" id="f75b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*dpWnelmmdCalVRtcf1k5fQ.jpeg" data-width="2968" data-height="2969" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*dpWnelmmdCalVRtcf1k5fQ.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@ianjbattaglia?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@ianjbattaglia?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Ian Battaglia&lt;/a> on &lt;a href="https://unsplash.com/collections/16762197/data-center?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/collections/16762197/data-center?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="efae" id="efae" class="graf graf--h3 graf-after--figure">What are Azure Scopes?&lt;/h3>&lt;p name="96da" id="96da" class="graf graf--p graf-after--h3">According to official Microsoft documentation “&lt;em class="markup--em markup--p-em">Scope&lt;/em> is the set of resources that access applies to.” This is used to have granularity when assigning permission in your Azure resources. The majority of Azure resources are deployed into the Resource Group scope, and when we use Azure bicep, this is the default. But there are four levels of scopes in Azure as we can see in the image below:&lt;/p>&lt;figure name="77a4" id="77a4" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*7OACaXq6bHYTogMW.png" data-width="350" data-height="275" src="https://cdn-images-1.medium.com/max/800/0*7OACaXq6bHYTogMW.png">&lt;figcaption class="imageCaption">Azure Scope levels — Image from &lt;a href="https://learn.microsoft.com/en-us/azure/role-based-access-control/scope-overview?WT.mc_id=DT-MVP-5004039" data-href="https://learn.microsoft.com/en-us/azure/role-based-access-control/scope-overview?WT.mc_id=DT-MVP-5004039" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="66a2" id="66a2" class="graf graf--p graf-after--figure">With that said, when we are deploying a resource different than those deployed at the resource level, we need to specify against which scope we are running it. For Management groups, the scope must be the &lt;strong class="markup--strong markup--p-strong">tenant. &lt;/strong>In the following sessions, we will see how to set it up.&lt;/p>&lt;h4 name="e2de" id="e2de" class="graf graf--h4 graf-after--p">Bicep scope to deploy Azure Management Groups&lt;/h4>&lt;p name="3129" id="3129" class="graf graf--p graf-after--h4">As said before, the default scope in an Azure Bicep script is the resource group. For most traditional resources such as App Services, or Storage Accounts, it is not necessary to specify it, but to deploy management groups it is necessary to specify the tenant as the target scope:&lt;/p>&lt;figure name="0cdc" id="0cdc" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*9ubvxa-Zjx8xk4dz0iucFw.png" data-width="593" data-height="140" src="https://cdn-images-1.medium.com/max/800/1*9ubvxa-Zjx8xk4dz0iucFw.png">&lt;figcaption class="imageCaption">Image prepared by Author&lt;/figcaption>&lt;/figure>&lt;p name="7b2b" id="7b2b" class="graf graf--p graf-after--figure">Below it’s possible to see the code necessary for the most basic creation of a Management Group:&lt;/p>&lt;figure name="986d" id="986d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/8e00956ed6e0b187e297cf1c2ad760cc?file=managementGroup.bicep.js">&lt;/script>&lt;/figure>&lt;h4 name="a490" id="a490" class="graf graf--h4 graf-after--figure">How to call an Azure Bicep template at the Management Group scope with Azure CLI and Azure DevOps YAML pipelines&lt;/h4>&lt;p name="236c" id="236c" class="graf graf--p graf-after--h4">To run deployments against tenant scope it is also necessary to specify it in Azure CLI&lt;/p>&lt;figure name="47f4" id="47f4" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/8e00956ed6e0b187e297cf1c2ad760cc?file=Run-BicepAzCLI.ps1.js">&lt;/script>&lt;/figure>&lt;p name="b2c5" id="b2c5" class="graf graf--p graf-after--figure">Below there is an Azure DevOps YAML pipeline with the task configured to deploy the bicep file created above:&lt;/p>&lt;figure name="daed" id="daed" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/8e00956ed6e0b187e297cf1c2ad760cc?file=azure-pipelines.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="c93d" id="c93d" class="graf graf--h3 graf-after--figure">SPN permissions to deploy Azure Management Groups&lt;/h3>&lt;p name="9747" id="9747" class="graf graf--p graf-after--h3">By default, the Service Principal Name does not have permission to deploy tenant resources. You need to grant it at the root scope “/” to make it work.&lt;/p>&lt;p name="b6bf" id="b6bf" class="graf graf--p graf-after--p">In this case, the error below will show up:&lt;/p>&lt;pre name="4e63" id="4e63" class="graf graf--pre graf-after--p">AuthorizationFailed: The client with object id does not have authorization to perform action &amp;#39;Microsoft.Resources/deployments/validate/action&amp;#39; over scope &amp;#39;/providers/Microsoft.Resources/deployments/main&amp;#39; or the scope is invalid.&lt;/pre>&lt;h4 name="c23f" id="c23f" class="graf graf--h4 graf-after--pre">How to elevate user permissions as Azure AD Global Administrator&lt;/h4>&lt;p name="289c" id="289c" class="graf graf--p graf-after--h4">First, you need to elevate your permissions as user Global Administrator into Azure AD:&lt;/p>&lt;figure name="1940" id="1940" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/8e00956ed6e0b187e297cf1c2ad760cc?file=Set-UserPermission.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="7b6f" id="7b6f" class="graf graf--h4 graf-after--figure">How to grant Service Principal Name permissions to deploy Azure Management Groups&lt;/h4>&lt;p name="f86b" id="f86b" class="graf graf--p graf-after--h4">After setting up your permissions as Global Administrator, you are able to set your SPN with the correct permissions:&lt;/p>&lt;figure name="ecb7" id="ecb7" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/8e00956ed6e0b187e297cf1c2ad760cc?file=Set-SPNPermission.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="d8ea" id="d8ea" class="graf graf--h3 graf-after--figure">The best Azure Management Groups naming convention&lt;/h3>&lt;p name="b608" id="b608" class="graf graf--p graf-after--h3">It is also crucial to properly name your Management Groups, making them easy to maintain, especially if you are adopting Infrastructure as Code with automated pipelines. Also, if you have multiple directories, you also need to efficiently identify which directory a particular management group belongs to.&lt;/p>&lt;p name="d0cc" id="d0cc" class="graf graf--p graf-after--p">My friend &lt;a href="https://twitter.com/DevJevNL" data-href="https://twitter.com/DevJevNL" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">@DevJevNL&lt;/a> has an excellent proposal to tackle the naming convention in a series of posts, here is his suggestion for &lt;a href="https://www.devjev.nl/posts/2022/the-ideal-management-group-naming-convention/" data-href="https://www.devjev.nl/posts/2022/the-ideal-management-group-naming-convention/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Management Groups.&lt;/a>&lt;/p>&lt;h3 name="5dd1" id="5dd1" class="graf graf--h3 graf-after--p">Conclusion&lt;/h3>&lt;p name="3294" id="3294" class="graf graf--p graf-after--h3">Although it is a very simple process, there are some tricks to deploying management groups. In this post, I tried to clarify all the necessary steps to deploy it. Below it is possible to visualize the management group deployed in our Azure Tenant.&lt;/p>&lt;figure name="ba98" id="ba98" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*v7ss3g8wQRZUMN4XuXvs8w.png" data-width="922" data-height="166" src="https://cdn-images-1.medium.com/max/800/1*v7ss3g8wQRZUMN4XuXvs8w.png">&lt;figcaption class="imageCaption">Image prepared by Author&lt;/figcaption>&lt;/figure>&lt;h3 name="44ba" id="44ba" class="graf graf--h3 graf-after--figure">References&lt;/h3>&lt;p name="2831" id="2831" class="graf graf--p graf-after--h3">&lt;a href="https://learn.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin?WT.mc_id=DT-MVP-5004039" data-href="https://learn.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin?WT.mc_id=DT-MVP-5004039" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">https://learn.microsoft.com/en-us/azure/role-based-access-control/elevate-access-global-admin&lt;/a>&lt;/p>&lt;div name="014e" id="014e" class="graf graf--mixtapeEmbed graf-after--p">&lt;a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md" data-href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md" class="markup--anchor markup--mixtapeEmbed-anchor" title="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md">&lt;strong class="markup--strong markup--mixtapeEmbed-strong">Enterprise-Scale/EnterpriseScale-Setup-azure.md at main · Azure/Enterprise-Scale&lt;/strong>&lt;br>&lt;em class="markup--em markup--mixtapeEmbed-em">This article will guide you through the process of configuring permissions in your Azure environment to enable ARM…&lt;/em>github.com&lt;/a>&lt;a href="https://github.com/Azure/Enterprise-Scale/blob/main/docs/EnterpriseScale-Setup-azure.md" class="js-mixtapeImage mixtapeImage u-ignoreBlock" data-media-id="43dadb4f5e13d2f831767220097b010a" data-thumbnail-img-id="0*FQu-TbB_eCQkbnrp" style="background-image: url(https://cdn-images-1.medium.com/fit/c/160/160/0*FQu-TbB_eCQkbnrp);">&lt;/a>&lt;/div>&lt;figure name="2518" id="2518" class="graf graf--figure graf-after--mixtapeEmbed">&lt;img class="graf-image" data-image-id="0*VUK1-iKIQ90xUlTO.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*VUK1-iKIQ90xUlTO.png">&lt;/figure>&lt;p name="b55c" id="b55c" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/strong>&lt;/p>&lt;h4 name="4f65" id="4f65" class="graf graf--h4 graf-after--p graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener noopener" target="_blank">Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/7a2e20240a6">&lt;time class="dt-published" datetime="2022-09-26T13:04:40.269Z">September 26, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-deploy-management-groups-with-azure-bicep-and-azure-devops-7a2e20240a6" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-10-10_how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-10-10_how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to setup your environment with git and VS Code with choco&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to setup your environment with git and VS Code with choco&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Configuring your git environment is something very important to begin using version control. In this post, I will show you, step by step…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="333c" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f425" id="f425" class="graf graf--h3 graf--leading graf--title">How to setup your environment with git and VS Code with choco&lt;/h3>&lt;p name="d436" id="d436" class="graf graf--p graf-after--h3">Configuring your git environment is something very important to begin using version control. In this post, I will show you, step by step, how to install and configure git correctly and also how to use Visual Studio Code as a default editor, And at the end of the post, there are the full scripts to help you set up your environment, &lt;strong class="markup--strong markup--p-strong">with a bonus &lt;/strong>in it ;).&lt;/p>&lt;figure name="05c6" id="05c6" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*fLG0WrzYU-ZuAkqAKqT__A.jpeg" data-width="5000" data-height="3313" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*fLG0WrzYU-ZuAkqAKqT__A.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Yancy Min&lt;/a> on &lt;a href="https://unsplash.com/s/photos/git?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/git?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="f746" id="f746" class="graf graf--h3 graf-after--figure">How to install git and Visual Studio Code with PowerShell and Choco&lt;/h3>&lt;h4 name="ee89" id="ee89" class="graf graf--h4 graf-after--h3">How to install Chocolatey with PowerShell&lt;/h4>&lt;p name="732e" id="732e" class="graf graf--p graf-after--h4">Before we proceed with git and VSCode, first we need to install the Chocolatey. &lt;a href="https://community.chocolatey.org/" data-href="https://community.chocolatey.org/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Chocolatey&lt;/a>, or simply Choco, is a package installer designed for work with PowerShell.&lt;/p>&lt;p name="c38c" id="c38c" class="graf graf--p graf-after--p">The easiest way to install choco is by running a PowerShell script in your terminal. Below I have prepared a script that calls the official Choco script on its site:&lt;/p>&lt;figure name="1063" id="1063" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=00-choco-install.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="b36e" id="b36e" class="graf graf--h3 graf-after--figure">How to install git on Windows using choco&lt;/h3>&lt;p name="c289" id="c289" class="graf graf--p graf-after--h3">After installing Choco, we will be able to install the git package available there. To install, the command is very straightforward as we can see below (might be necessary to run the command with administrative privileges):&lt;/p>&lt;figure name="0647" id="0647" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=01.1-git-install-choco.ps1.js">&lt;/script>&lt;/figure>&lt;p name="e5c6" id="e5c6" class="graf graf--p graf-after--figure">After the installation, check if git was correctly installed with the command &lt;code class="markup--code markup--p-code">git -v&lt;/code> :&lt;/p>&lt;figure name="30a1" id="30a1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*n_lAcHewgubjgsb-KeoXLw.png" data-width="482" data-height="187" src="https://cdn-images-1.medium.com/max/800/1*n_lAcHewgubjgsb-KeoXLw.png">&lt;/figure>&lt;p name="50df" id="50df" class="graf graf--p graf-after--figure">If you receive an error saying that git is not installed, close and reopen your terminal, it will reload the environment variables with the correct git path.&lt;/p>&lt;h3 name="d2b5" id="d2b5" class="graf graf--h3 graf-after--p">How to install Visual Studio Code with choco and PowerShell&lt;/h3>&lt;p name="7d21" id="7d21" class="graf graf--p graf-after--h3">As well we saw to install git, the command to install VSCode with choco and PowerShell is also very simple:&lt;/p>&lt;figure name="f982" id="f982" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=01.2-vscode-install-choco.ps1.js">&lt;/script>&lt;/figure>&lt;p name="8e46" id="8e46" class="graf graf--p graf-after--figure">To check the installation, use the command &lt;code class="markup--code markup--p-code">code -v&lt;/code> . Again, in case of any problem, close and reopen your terminal.&lt;/p>&lt;h3 name="28a1" id="28a1" class="graf graf--h3 graf-after--p">How to setup git credentials&lt;/h3>&lt;h4 name="1fdc" id="1fdc" class="graf graf--h4 graf-after--h3">How to setup git username and email&lt;/h4>&lt;p name="9b07" id="9b07" class="graf graf--p graf-after--h4">To associate your identity with your commits, it is necessary to define your git user name and email. You can configure it in different scopes, below we can see how to configure it globally:&lt;/p>&lt;figure name="4877" id="4877" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=02.1-git-config-user.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="b137" id="b137" class="graf graf--h3 graf-after--figure">How to setup Visual Studio Code as the default git editor&lt;/h3>&lt;p name="7c43" id="7c43" class="graf graf--p graf-after--h3">The default editor for git is nano. Personally, I prefer VS Code, as it has several extensions that can improve productivity. In the script below, we are setting up the VSCode as the default tool for the command diff and merge and also as the default editor:&lt;/p>&lt;figure name="ecc9" id="ecc9" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=02.2-vscode-config.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="ae4d" id="ae4d" class="graf graf--h3 graf-after--figure">How to install and configure Git and VS Code with PowerShell Script&lt;/h3>&lt;h4 name="ec3e" id="ec3e" class="graf graf--h4 graf-after--h3">Installation&lt;/h4>&lt;p name="3ff8" id="3ff8" class="graf graf--p graf-after--h4">To install all necessary tools, you can simply run the script below. Might be necessary to have administrator permissions for that. In the first 6 lines, the script installs choco, and then uses choco to install git and vscode:&lt;/p>&lt;figure name="7125" id="7125" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=01-complete-install-choco.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="d174" id="d174" class="graf graf--h4 graf-after--figure">Configuration&lt;/h4>&lt;p name="ac2c" id="ac2c" class="graf graf--p graf-after--h4">After installing the tools, you may need to reload your terminal, as I said above, so to make it easier I created two different scripts 😉. As a &lt;strong class="markup--strong markup--p-strong">Bonus,&lt;/strong> I also added an alias to a command &lt;code class="markup--code markup--p-code">git lg&lt;/code>, which is an alias for &lt;code class="markup--code markup--p-code">git log&lt;/code> , but using prettier options. You can check more about it on this post &lt;a href="https://faun.pub/creating-a-pretty-git-log-61f312f45201" data-href="https://faun.pub/creating-a-pretty-git-log-61f312f45201" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Creating a pretty git log&lt;/a>:&lt;/p>&lt;figure name="8589" id="8589" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=02-complete-config.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="2159" id="2159" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="0d0a" id="0d0a" class="graf graf--p graf-after--h3">Source control is the basis of any DevOps process, and git is currently the most used tool for it. Using the right configuration together with VS Code will help to start this journey!&lt;/p>&lt;h3 name="1f92" id="1f92" class="graf graf--h3 graf-after--p">References&lt;/h3>&lt;p name="3db8" id="3db8" class="graf graf--p graf-after--h3">&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" data-href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Git — Installing Git (git-scm.com)&lt;/a>&lt;/p>&lt;p name="bd85" id="bd85" class="graf graf--p graf-after--p">&lt;a href="https://docs.chocolatey.org/en-us/" data-href="https://docs.chocolatey.org/en-us/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Chocolatey Software Docs | Chocolatey — Software Management for Windows&lt;/a>&lt;/p>&lt;figure name="a95f" id="a95f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*3ahp0-lW18WfoBhc.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*3ahp0-lW18WfoBhc.png">&lt;/figure>&lt;p name="8972" id="8972" class="graf graf--p graf-after--figure">If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>&lt;h3 name="d82d" id="d82d" class="graf graf--h3 graf-after--p graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h3-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/23d90f598d24">&lt;time class="dt-published" datetime="2022-10-10T13:10:04.918Z">October 10, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-10-19_how-to-create-commits-with-different-users-in-git-1679c80ae47d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-10-19_how-to-create-commits-with-different-users-in-git-1679c80ae47d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to create commits with different users in git&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to create commits with different users in git&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In my previous post, I showed among other stuff how to configure your git credentials. But in case you need to use different users in…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="a56f" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="31b0" id="31b0" class="graf graf--h3 graf--leading graf--title">How to create commits with different users in git&lt;/h3>&lt;p name="b72b" id="b72b" class="graf graf--p graf-after--h3">In my previous &lt;a href="https://faun.pub/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" data-href="https://faun.pub/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">post&lt;/a>, I showed among other stuff how to configure your git credentials. But in case you need to use different users in different projects or repositories, you need to be sure that your commits are using the correct credentials. Check on this post how to configure it properly and stop messing up your repos ;)&lt;/p>&lt;figure name="5d43" id="5d43" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*fLG0WrzYU-ZuAkqAKqT__A.jpeg" data-width="5000" data-height="3313" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*fLG0WrzYU-ZuAkqAKqT__A.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Yancy Min&lt;/a> on &lt;a href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@yancymin?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="2e5c" id="2e5c" class="graf graf--p graf-after--figure">I know a lot of people that already made a commit using the wrong credentials in either work or personal repos. Having to remember to configure this in every new repository is not the best way to do that.&lt;/p>&lt;p name="c246" id="c246" class="graf graf--p graf-after--p">For this, we can use &lt;a href="https://git-scm.com/docs/git-config#_conditional_includes" data-href="https://git-scm.com/docs/git-config#_conditional_includes" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Conditional Includes&lt;/a> when creating our config file. This is a bit more complex than just setting the user and email, but it will help you to avoid a lot of work, in case you need to rewrite your commit history later :).&lt;/p>&lt;h3 name="8a91" id="8a91" class="graf graf--h3 graf-after--p">Understanding the git configuration&lt;/h3>&lt;p name="9cc1" id="9cc1" class="graf graf--p graf-after--h3">The git configuration is used to introduce customized behaviors on git and it has three different scopes of settings:&lt;/p>&lt;ul class="postList">&lt;li name="df4d" id="df4d" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">System &lt;/strong>— In this scope, the settings are applied to all users and all repositories. To edit this scope use the parameter &lt;code class="markup--code markup--li-code">--system&lt;/code> . To verify which configurations are in the system scope, type the command &lt;code class="markup--code markup--li-code">git config --system -l&lt;/code>&lt;/li>&lt;li name="9ca7" id="9ca7" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Global &lt;/strong>— This is the user scope, where it is possible to customize settings using the parameter &lt;code class="markup--code markup--li-code">--global&lt;/code> , and it is applied to all repositories of that user. The global configuration file sits in the user directory on your computer.&lt;/li>&lt;li name="aa88" id="aa88" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Local&lt;/strong>— Each repository can also have its own customized settings. It is possible to find the configuration file in the git directory inside each repository &lt;code class="markup--code markup--li-code">./.git/config&lt;/code> , or it is also possible to check with the parameter&lt;code class="markup--code markup--li-code">--local&lt;/code> .&lt;/li>&lt;/ul>&lt;p name="e3be" id="e3be" class="graf graf--p graf-after--li">The lower the scope, the higher the priority, so it means that the local scope overrides the global scope, and the global overrides the system scope. With that said, the precedence is in the following order: &lt;strong class="markup--strong markup--p-strong">System&lt;/strong>&amp;gt; &lt;strong class="markup--strong markup--p-strong">Global &lt;/strong>&amp;gt; &lt;strong class="markup--strong markup--p-strong">Local&lt;/strong>&lt;/p>&lt;p name="af0e" id="af0e" class="graf graf--p graf-after--p">It is possible to trace back from where the configuration is coming from: &lt;code class="markup--code markup--p-code">git config -l --show-origin&lt;/code>&lt;/p>&lt;figure name="be04" id="be04" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Y_rGL86RNTws8Z7qeAD59Q.png" data-width="914" data-height="519" src="https://cdn-images-1.medium.com/max/800/1*Y_rGL86RNTws8Z7qeAD59Q.png">&lt;figcaption class="imageCaption">Different scopes of configuration — Image by author&lt;/figcaption>&lt;/figure>&lt;p name="64b1" id="64b1" class="graf graf--p graf-after--figure">In our case, we will play around with the user&amp;#39;s configurations. These configurations are stored in a file &lt;code class="markup--code markup--p-code">.gitconfig&lt;/code> that sits in your user directory, as mentioned above. To easily access it, you can type &lt;code class="markup--code markup--p-code">~/.gitconfig&lt;/code> in your terminal and you will be able to see something similar to this:&lt;/p>&lt;figure name="ff6e" id="ff6e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/209eb494dd36212df44d8788c22a464c?file=initial.gitconfig.js">&lt;/script>&lt;/figure>&lt;h3 name="b484" id="b484" class="graf graf--h3 graf-after--figure">Creating the conditional includes in gitconfig&lt;/h3>&lt;p name="8d26" id="8d26" class="graf graf--p graf-after--h3">For each user we want to use, it is necessary to create a separate folder, where the repositories will sit. This is because we will use the directory that git specifies in its configuration to identify where we are. In my example, I will configure my global email, which will be used for all repositories, except those under the folder &lt;code class="markup--code markup--p-code">c:\repos\work&lt;/code> .&lt;/p>&lt;figure name="3039" id="3039" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*rW4Zp3L7W8fYOY94dmpV5w.png" data-width="743" data-height="272" src="https://cdn-images-1.medium.com/max/800/1*rW4Zp3L7W8fYOY94dmpV5w.png">&lt;/figure>&lt;p name="0cb4" id="0cb4" class="graf graf--p graf-after--figure">With our work repositories under the correct folder, we need to create a specific configuration file for that “profile”. You can type the command &lt;code class="markup--code markup--p-code">echo [user] &amp;gt; ~/work.gitconfig&lt;/code>to create it under your user directory. After creation, populate with needed information for the profile, as per below:&lt;/p>&lt;figure name="7955" id="7955" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/209eb494dd36212df44d8788c22a464c?file=work.gitconfig.js">&lt;/script>&lt;/figure>&lt;p name="a943" id="a943" class="graf graf--p graf-after--figure">After creating the &lt;code class="markup--code markup--p-code">work.gitconfig&lt;/code> file, in your main file (&lt;code class="markup--code markup--p-code">.gitconfig&lt;/code>), include the &lt;code class="markup--code markup--p-code">[includeIf]&lt;/code> session. The command &lt;code class="markup--code markup--p-code">gitdir/i&lt;/code> will return the directory of your repository, and if it matches the directory that you specified, it will load the &lt;code class="markup--code markup--p-code">work.gitconfig&lt;/code> .&lt;/p>&lt;figure name="2878" id="2878" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/209eb494dd36212df44d8788c22a464c?file=.gitconfig.js">&lt;/script>&lt;/figure>&lt;h3 name="b8f0" id="b8f0" class="graf graf--h3 graf-after--figure">Concluding…&lt;/h3>&lt;p name="2ec4" id="2ec4" class="graf graf--p graf-after--h3">This configuration is quite simple, but can be very helpful if you work in many projects simultaneously . I hope it can help somehow and see you in the next post!&lt;/p>&lt;figure name="946c" id="946c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*nTpwFrWVp057bnqw.png" src="https://cdn-images-1.medium.com/max/800/0*nTpwFrWVp057bnqw.png">&lt;/figure>&lt;p name="0479" id="0479" class="graf graf--p graf-after--figure">If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>&lt;h3 name="44c2" id="44c2" class="graf graf--h3 graf-after--p graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h3-anchor" rel="noopener ugc nofollow noopener noopener noopener" target="_blank">Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/1679c80ae47d">&lt;time class="dt-published" datetime="2022-10-19T21:12:09.015Z">October 19, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-create-commits-with-different-users-in-git-1679c80ae47d" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-10-26_how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-10-26_how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to create a dotnet core project with command line&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to create a dotnet core project with command line&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In this post, we will see how to simply create a dotnet core application using the command line. For that, we will use Windows Terminal…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="a741" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="b560" id="b560" class="graf graf--h3 graf--leading graf--title">How to create a dotnet core project with command line&lt;/h3>&lt;p name="1776" id="1776" class="graf graf--p graf-after--h3">In this post, we will see how to simply create a dotnet core application using the command line. For that, we will use Windows Terminal with PowerShell, but it is possible to use any terminal for it :)&lt;/p>&lt;figure name="adf1" id="adf1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*bpTSYTtQASQsZBf1" data-width="4075" data-height="3056" data-unsplash-photo-id="a4X1cdC1QAc" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*bpTSYTtQASQsZBf1">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@lordarcadius?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@lordarcadius?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">Vipul Jha&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="eac4" id="eac4" class="graf graf--h3 graf-after--figure">Installing dotnet core with command line&lt;/h3>&lt;p name="a4bd" id="a4bd" class="graf graf--p graf-after--h3">Install dotnet core with the command line is quite simple. For that, we will use Winget with the command below:&lt;/p>&lt;figure name="ed2d" id="ed2d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/0629125feadceaa8f46a615f95391b81?file=install-dotnetcore.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="49cd" id="49cd" class="graf graf--h3 graf-after--figure">Creating dotnet project in Windows Terminal&lt;/h3>&lt;p name="0026" id="0026" class="graf graf--p graf-after--h3">For this post, we will use Windows Terminal, but you can use any terminal that you want.&lt;/p>&lt;p name="a173" id="a173" class="graf graf--p graf-after--p">Open the terminal in the directory that you want to create your project and type the command &lt;code class="markup--code markup--p-code">dotnet new webapp -n demo&lt;/code> . It will generate a directory called “&lt;strong class="markup--strong markup--p-strong">demo” &lt;/strong>within the project structure.&lt;/p>&lt;figure name="df64" id="df64" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*08bKMGd2HDp7FNVYBkk1FA.png" data-width="958" data-height="508" src="https://cdn-images-1.medium.com/max/800/1*08bKMGd2HDp7FNVYBkk1FA.png">&lt;/figure>&lt;p name="0cad" id="0cad" class="graf graf--p graf-after--figure">Enter into the directory created and type &lt;code class="markup--code markup--p-code">code .&lt;/code> . This command will open the Visual Studio Code in your project directory:&lt;/p>&lt;figure name="c602" id="c602" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*TXv2VCIEUCL6IB1HJ1Z9hg.png" data-width="958" data-height="581" src="https://cdn-images-1.medium.com/max/800/1*TXv2VCIEUCL6IB1HJ1Z9hg.png">&lt;/figure>&lt;p name="879a" id="879a" class="graf graf--p graf-after--figure">In the VS Code is possible to see the project structure, as we can see below:&lt;/p>&lt;figure name="391b" id="391b" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*40oFqCrIUrJMRJjI0txVOA.png" data-width="1024" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*40oFqCrIUrJMRJjI0txVOA.png">&lt;/figure>&lt;h3 name="1ecf" id="1ecf" class="graf graf--h3 graf-after--figure">How to build and run a dotnet core project locally&lt;/h3>&lt;p name="8be8" id="8be8" class="graf graf--p graf-after--h3">Now let’s build our dotnet project to ensure everything is working properly. The easiest way to do that is using the integrated terminal in VS Code.&lt;/p>&lt;p name="fb8f" id="fb8f" class="graf graf--p graf-after--p">To open the terminal type &lt;code class="markup--code markup--p-code">ctrl + `&lt;/code> or go to &lt;strong class="markup--strong markup--p-strong">View &amp;gt; Terminal. &lt;/strong>In the terminal that will appear at the bottom of your VS Code, type the command &lt;code class="markup--code markup--p-code">dotnet build&lt;/code> . If everything goes well you should see the &lt;strong class="markup--strong markup--p-strong">Build succeeded &lt;/strong>message.&lt;/p>&lt;figure name="8e60" id="8e60" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Ay0Vk78CsEux4r2KuxV2PQ.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*Ay0Vk78CsEux4r2KuxV2PQ.png">&lt;/figure>&lt;p name="9924" id="9924" class="graf graf--p graf-after--figure">We can now run our web app with the command &lt;code class="markup--code markup--p-code">dotnet run&lt;/code> . It will start the web app locally in some ports. You can copy one of them and open it on your browser:&lt;/p>&lt;figure name="f858" id="f858" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Jtan4uZ740glcB0y3OXBEg.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*Jtan4uZ740glcB0y3OXBEg.png">&lt;/figure>&lt;figure name="8b1d" id="8b1d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*N21SjaR9uc_j1XBD2xOfpQ.png" data-width="1070" data-height="475" src="https://cdn-images-1.medium.com/max/800/1*N21SjaR9uc_j1XBD2xOfpQ.png">&lt;/figure>&lt;h3 name="b8a2" id="b8a2" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="e995" id="e995" class="graf graf--p graf-after--h3">In further posts, we will see more about DevOps practices, and having a real application to start with is crucial to understand all the steps that will be applied in a real-life scenario.&lt;/p>&lt;p name="cc24" id="cc24" class="graf graf--p graf-after--p graf--trailing">I hope this post could be useful and see you in the next one!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/11f7cc142e2e">&lt;time class="dt-published" datetime="2022-10-26T16:21:02.381Z">October 26, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-10-27_git-basic-commands-in-a-nutshell-fc911c9f350a/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-10-27_git-basic-commands-in-a-nutshell-fc911c9f350a/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Git Basic commands in a nutshell&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Git Basic commands in a nutshell&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Without a doubt, git is the most popular Version Control System nowadays. There is a big chance that everyone who works with IT already…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="26b9" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="be1d" id="be1d" class="graf graf--h3 graf--leading graf--title">Git Basic commands in a nutshell&lt;/h3>&lt;p name="d058" id="d058" class="graf graf--p graf-after--h3">Without a doubt, git is the most popular Version Control System nowadays. There is a big chance that everyone who works with IT already heard about it, or even already used git. In this post, I gathered the most common git commands in one place and a brief explanation about them.&lt;/p>&lt;figure name="85e0" id="85e0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Fuhc6LIKQ3NiJEDU.png" data-width="686" data-height="396" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*Fuhc6LIKQ3NiJEDU.png">&lt;figcaption class="imageCaption">Commit workflow — Image from &lt;a href="https://git-scm.com/about/staging-area" data-href="https://git-scm.com/about/staging-area" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Git Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="f8a9" id="f8a9" class="graf graf--p graf-after--figure">At the end of the post, I will let all commands used with the description of them.&lt;/p>&lt;h3 name="2f99" id="2f99" class="graf graf--h3 graf-after--p">Prerequisites&lt;/h3>&lt;p name="7005" id="7005" class="graf graf--p graf-after--h3">To demonstrate in a more realistic scenario, in this post we will use a dotnet core project and, of course, the git tool. Right below, you can see all the prerequisites to follow it, and after there are links for previous posts showing how to configure git and VS Code, as well as how to install dotnet core and create a project with it.&lt;/p>&lt;ul class="postList">&lt;li name="71d9" id="71d9" class="graf graf--li graf-after--p">git&lt;/li>&lt;li name="9670" id="9670" class="graf graf--li graf-after--li">Visual Studio Code&lt;/li>&lt;li name="8614" id="8614" class="graf graf--li graf-after--li">dotnet core&lt;/li>&lt;li name="4827" id="4827" class="graf graf--li graf-after--li">Windows Terminal&lt;/li>&lt;/ul>&lt;h4 name="136d" id="136d" class="graf graf--h4 graf-after--li">Git and Visual Studio Code&lt;/h4>&lt;p name="42b3" id="42b3" class="graf graf--p graf-after--h4">Git and Visual Studio Code are the main tools that we will be using in this post, so if you do not have it already configured, in &lt;a href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" data-href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>, I describe how to set it up.&lt;/p>&lt;h4 name="e770" id="e770" class="graf graf--h4 graf-after--p">Creating a dotnet core project&lt;/h4>&lt;p name="bf58" id="bf58" class="graf graf--p graf-after--h4">To demonstrate in a more realistic scenario, we will create a simple dotnet core project. In this &lt;a href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" data-href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">post&lt;/a>, I show how to configure dotnet core on your computer, and also how to create a web app project to be used as an example.&lt;/p>&lt;h3 name="bcfd" id="bcfd" class="graf graf--h3 graf-after--p">How to configure git locally&lt;/h3>&lt;h4 name="b8a2" id="b8a2" class="graf graf--h4 graf-after--h3">Initializing a git repository&lt;/h4>&lt;p name="61dd" id="61dd" class="graf graf--p graf-after--h4">Initializing the git repository is the first step to start working with git. It will create the git structure, and allow you to start versioning your files. It is possible to initialize either an empty directory or a directory with files inside already. In our case, we already created the project files previously following this &lt;a href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" data-href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">post&lt;/a>.&lt;/p>&lt;p name="8975" id="8975" class="graf graf--p graf-after--p">It is possible to initialize the git repository by either the user interface or the command line, which one is better, depending on your personal preferences. Below you can see both options:&lt;/p>&lt;figure name="62ad" id="62ad" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*a9Ym0PL-XMeIMNAnBT4aHA.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*a9Ym0PL-XMeIMNAnBT4aHA.png">&lt;/figure>&lt;p name="df12" id="df12" class="graf graf--p graf-after--figure">For the command line, simply type the command &lt;code class="markup--code markup--p-code">git init&lt;/code> . And that’s it! Quite simple as I promised :).&lt;/p>&lt;h4 name="4c61" id="4c61" class="graf graf--h4 graf-after--p">What is the .git directory?&lt;/h4>&lt;p name="6745" id="6745" class="graf graf--p graf-after--h4">.git directory is a hidden directory that git creates to keep its files inside. You rarely need to change something in these files, but it’s worth knowing that git uses &lt;code class="markup--code markup--p-code">.git&lt;/code> a directory to identify and control your repository. Due to the fact this is hidden, you need to run a special command to see it. With PowerShell, you can see with the command &lt;code class="markup--code markup--p-code">Get-ChildItem -Hidden&lt;/code>&lt;/p>&lt;figure name="ec5c" id="ec5c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*c9xJW-cSEhtYjljWwKCFAA.png" data-width="734" data-height="221" src="https://cdn-images-1.medium.com/max/800/1*c9xJW-cSEhtYjljWwKCFAA.png">&lt;figcaption class="imageCaption">.git directory — Image prepared by Author&lt;/figcaption>&lt;/figure>&lt;p name="a451" id="a451" class="graf graf--p graf-after--figure">To verify how the files are being tracked by git, click on the git icon on the left menu. After that, it is possible to see all files under “Changes”&lt;/p>&lt;figure name="8e79" id="8e79" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*kOv7KudC4OCvilsM8AoVdA.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*kOv7KudC4OCvilsM8AoVdA.png">&lt;/figure>&lt;h3 name="c2bf" id="c2bf" class="graf graf--h3 graf-after--figure">What are the basic git commands for local repositories&lt;/h3>&lt;h4 name="a240" id="a240" class="graf graf--h4 graf-after--h3">ignoring files&lt;/h4>&lt;p name="1180" id="1180" class="graf graf--p graf-after--h4">Before we go to the commands themselves, it is important to understand that in some cases, it is not desirable to keep certain files under source control. For example, when we work with compiled languages, it generates binary files that you don’t want to keep under version control, as they can always be generated using the code that is already versioned.&lt;/p>&lt;p name="d072" id="d072" class="graf graf--p graf-after--p">To solve this problem you need to create a .gitignore file, with instructions on which files you don’t want to keep versioned.&lt;/p>&lt;p name="4edd" id="4edd" class="graf graf--p graf-after--p">To create this file, as we are using a dotnet core application as an example, in the VS Code terminal, ensure that you are in the root directory of your repository and type &lt;code class="markup--code markup--p-code">dotnet new gitignore&lt;/code>.&lt;/p>&lt;figure name="ddae" id="ddae" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*rgiVE7dvpIlT5CrLezoBpw.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*rgiVE7dvpIlT5CrLezoBpw.png">&lt;/figure>&lt;p name="d3ff" id="d3ff" class="graf graf--p graf-after--figure">You can see that among others, the folders &lt;code class="markup--code markup--p-code">bin&lt;/code>and &lt;code class="markup--code markup--p-code">obj&lt;/code> are listed, which is what we want in our case.&lt;/p>&lt;h4 name="0b81" id="0b81" class="graf graf--h4 graf-after--p">stage — Adding files to stage with git&lt;/h4>&lt;p name="1726" id="1726" class="graf graf--p graf-after--h4">Staging is an intermediate area where you keep your changed files before you finish the commit. It allows you to review and format them, and also makes it easy to commit your files partially.&lt;/p>&lt;figure name="e1aa" id="e1aa" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Fuhc6LIKQ3NiJEDU.png" data-width="686" data-height="396" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*Fuhc6LIKQ3NiJEDU.png">&lt;figcaption class="imageCaption">Commit workflow — Image from &lt;a href="https://git-scm.com/about/staging-area" data-href="https://git-scm.com/about/staging-area" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Git Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="ea27" id="ea27" class="graf graf--p graf-after--figure">The command &lt;code class="markup--code markup--p-code">git add&lt;/code> is used to add the files to the staging area. You can add file by file specifying the name &lt;code class="markup--code markup--p-code">git add &amp;lt;your file name&amp;gt;&lt;/code>, or you can add all files at once with &lt;code class="markup--code markup--p-code">git add .&lt;/code>&lt;/p>&lt;p name="f267" id="f267" class="graf graf--p graf-after--p">In our project, let’s first add the gitignore that we created in the session above. It will prevent adding any undesired files that are already generated.&lt;/p>&lt;p name="6129" id="6129" class="graf graf--p graf-after--p">For this type the command &lt;code class="markup--code markup--p-code">git add .\.gitignore&lt;/code>. You will notice that on VS Code the letter in front of the file name changed from U(Untracked) to A(index Added) and also it slightly changed the color. It means that this file is under the staging area.&lt;/p>&lt;figure name="7166" id="7166" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ExLkWcOnrGycDacgiftVyg.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*ExLkWcOnrGycDacgiftVyg.png">&lt;/figure>&lt;p name="35b3" id="35b3" class="graf graf--p graf-after--figure">Now that the gitignore is already there, we can add the remaining files with &lt;code class="markup--code markup--p-code">git add .&lt;/code> .&lt;/p>&lt;h4 name="4043" id="4043" class="graf graf--h4 graf-after--p">Recording your changes with git commit&lt;/h4>&lt;p name="1d6e" id="1d6e" class="graf graf--p graf-after--h4">Finally, we will be able to create our first commit! It will record our changes in the version control. It always requires a comment, to identify what had changed in this commit. To do so, use the command &lt;code class="markup--code markup--p-code">git commit -m &amp;quot;my first commit&amp;quot;&lt;/code> . Notice that all files under the source control menu disappeared, but no worries, it means that there are no more files in the staging area, and they are already “safe”.&lt;/p>&lt;figure name="74d6" id="74d6" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*WWe1X1lVtUuQmyIzE47fWw.png" data-width="440" data-height="458" src="https://cdn-images-1.medium.com/max/800/1*WWe1X1lVtUuQmyIzE47fWw.png">&lt;/figure>&lt;h4 name="049b" id="049b" class="graf graf--h4 graf-after--figure">Finding the status of your changed files&lt;/h4>&lt;p name="e780" id="e780" class="graf graf--p graf-after--h4">Before, we checked the files in the staging area by the user interface. But it’s also possible to use the command &lt;code class="markup--code markup--p-code">git status&lt;/code> for that. Notice that is possible to visualize either the Staged and Untracked files:&lt;/p>&lt;figure name="e794" id="e794" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*J3B6lmtSlSvvBFwOxAputw.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*J3B6lmtSlSvvBFwOxAputw.png">&lt;/figure>&lt;h4 name="5067" id="5067" class="graf graf--h4 graf-after--figure">Using git log to show your history&lt;/h4>&lt;p name="abb6" id="abb6" class="graf graf--p graf-after--h4">The command&lt;code class="markup--code markup--p-code">git log&lt;/code> is used to show the commits history, and brings useful information. By default, it shows the commit hash, which helps to track in which branches, or environments the changes are, the author and date of commits, which helps to identify who made those changes, and finally the comment of the commits that shows (if used correctly🙃) the purpose of that commit.&lt;/p>&lt;p name="c766" id="c766" class="graf graf--p graf-after--p">You can also customize the results, one of my favorites is to show all commits in one line, for this you can use &lt;code class="markup--code markup--p-code">git log — pretty=oneline&lt;/code>.&lt;/p>&lt;figure name="62c1" id="62c1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*bRS7QOz3KK4cBgHWbRUEiw.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*bRS7QOz3KK4cBgHWbRUEiw.png">&lt;/figure>&lt;p name="42d0" id="42d0" class="graf graf--p graf-after--figure">If you followed the &lt;a href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" data-href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">first post&lt;/a> of the version control series to set up your git environment, I also included the configuration of an alias for a log command with some formats I like to use. You can also see all details of this in &lt;a href="https://camargo-wes.medium.com/creating-a-pretty-git-log-61f312f45201" data-href="https://camargo-wes.medium.com/creating-a-pretty-git-log-61f312f45201" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>.&lt;/p>&lt;h4 name="b28b" id="b28b" class="graf graf--h4 graf-after--p">Creating and moving among git branches&lt;/h4>&lt;p name="cd86" id="cd86" class="graf graf--p graf-after--h4">There are several ways to work with git and organize your branches, which is called &lt;strong class="markup--strong markup--p-strong">branch strategy&lt;/strong>. In the most common it is necessary to create branches to apart your code from the stable branch.&lt;/p>&lt;p name="5c44" id="5c44" class="graf graf--p graf-after--p">In the DevOps community, there are polemic discussions that branching is a bad practice that avoids real continuous integration, but this is not the topic that we are approaching today.&lt;/p>&lt;p name="9c04" id="9c04" class="graf graf--p graf-after--p">Independent if it is a good practice or not, branches are very useful for many situations and it’s worth having it in your toolbox.&lt;/p>&lt;p name="5e57" id="5e57" class="graf graf--p graf-after--p">When a repository is created, it always creates a default branch, which can be called &lt;code class="markup--code markup--p-code">master&lt;/code> or &lt;code class="markup--code markup--p-code">main&lt;/code> depending on your preferences, and both can be used as stable branches or baselines.&lt;/p>&lt;p name="65ae" id="65ae" class="graf graf--p graf-after--p">It is fairly common to create branches called &lt;code class="markup--code markup--p-code">&lt;strong class="markup--strong markup--p-strong">features&lt;/strong>&lt;/code>, so it is possible to work without interfering with the stable branch.&lt;/p>&lt;p name="07cb" id="07cb" class="graf graf--p graf-after--p">To list the branches on your repository, simply type &lt;code class="markup--code markup--p-code">git branch&lt;/code>, and it will show all local branches that you have. If you have a remote repository you can also list the remote branches with the command &lt;code class="markup--code markup--p-code">git branch -r&lt;/code>.&lt;/p>&lt;p name="f6a4" id="f6a4" class="graf graf--p graf-after--p">To create a new branch use the command &lt;code class="markup--code markup--p-code">git branch &amp;lt;branch name&amp;gt;&lt;/code> or &lt;code class="markup--code markup--p-code">git checkout -b &amp;lt;branch name&amp;gt;&lt;/code> . Personally, I prefer the second option, as it already switches to the newlywed-created branch.&lt;/p>&lt;figure name="504f" id="504f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*-kVWZXyyymzr93tN1j3CtA.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*-kVWZXyyymzr93tN1j3CtA.png">&lt;/figure>&lt;p name="cbc9" id="cbc9" class="graf graf--p graf-after--figure">Imagine that after some commits on your feature branch for some reason you want to move back to master, so the &lt;code class="markup--code markup--p-code">git checkout &amp;lt;branch name&amp;gt;&lt;/code>command will be moving from one branch to another.&lt;/p>&lt;h3 name="95fc" id="95fc" class="graf graf--h3 graf-after--p">All basic git commands gathered&lt;/h3>&lt;p name="ddcc" id="ddcc" class="graf graf--p graf-after--h3">As promised, below are all commands used in this post:&lt;/p>&lt;figure name="86ce" id="86ce" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/f3e4f68e3b856b5b32bdf894452c9cdf?file=gitcommands.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="370e" id="370e" class="graf graf--h3 graf-after--figure">Key take aways&lt;/h3>&lt;p name="6af7" id="6af7" class="graf graf--p graf-after--h3">Git is a foundation of mostly modern development, and starting with it is quite simple. I hope that with this commands list you will help you move forward with the IT world!&lt;/p>&lt;h4 name="6b78" id="6b78" class="graf graf--h4 graf-after--p">Related posts&lt;/h4>&lt;p name="f243" id="f243" class="graf graf--p graf-after--h4">&lt;a href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" data-href="https://camargo-wes.medium.com/how-to-create-a-dotnet-core-project-with-command-line-11f7cc142e2e" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">How to create a dotnet core project with command line | by Wesley Camargo | Oct, 2022 | Medium&lt;/a>&lt;/p>&lt;p name="f1f1" id="f1f1" class="graf graf--p graf-after--p">&lt;a href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" data-href="https://camargo-wes.medium.com/how-to-setup-your-environment-with-git-and-vs-code-with-choco-23d90f598d24" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">How to setup your environment with git and VS Code with choco | by Wesley Camargo | Oct, 2022&lt;/a>&lt;/p>&lt;figure name="b930" id="b930" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Ibsvh13DKfhQqsj3.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*Ibsvh13DKfhQqsj3.png">&lt;/figure>&lt;p name="74db" id="74db" class="graf graf--p graf-after--figure">If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/p>&lt;h3 name="09da" id="09da" class="graf graf--h3 graf-after--p graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h3-anchor" rel="noopener ugc nofollow noopener" target="_blank">Join FAUN &amp;amp; get similar stories in your inbox each week&lt;/a>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/fc911c9f350a">&lt;time class="dt-published" datetime="2022-10-27T12:55:13.421Z">October 27, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/git-basic-commands-in-a-nutshell-fc911c9f350a" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-11-07_stop-breaking-your-environment--how-to-get-started-with-azure-devops-pipelines-4c684dd914c8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-11-07_stop-breaking-your-environment--how-to-get-started-with-azure-devops-pipelines-4c684dd914c8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Stop breaking your environment: How to get started with Azure DevOps Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Stop breaking your environment: How to get started with Azure DevOps Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Have you ever had problems with manual deployments? It is not about if but when an error will happen. I even saw entire sites being…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="48a7" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4682" id="4682" class="graf graf--h3 graf--leading graf--title">Stop breaking your environment: How to get started with Azure DevOps Pipelines&lt;/h3>&lt;p name="a761" id="a761" class="graf graf--p graf-after--h3">Have you ever had problems with manual deployments? It is not about if but when an error will happen. I even saw entire sites being replaced wrongly! It is scary, isn’t it? Azure DevOps Pipelines will help you to avoid such mistakes, so check on this post how to deploy your application in minutes, taking advantage of all benefits that automated pipelines can bring to you!&lt;/p>&lt;figure name="81ab" id="81ab" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*EkiWY-eBH6JhvNEU" data-width="5184" data-height="3363" data-unsplash-photo-id="Rf9eElW3Qxo" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*EkiWY-eBH6JhvNEU">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@louishansel?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@louishansel?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">Louis Hansel&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="286d" id="286d" class="graf graf--h3 graf-after--figure">What is Azure DevOps Pipelines?&lt;/h3>&lt;p name="1fb0" id="1fb0" class="graf graf--p graf-after--h3">A Deployment Pipeline is an automated process that combines Continuous Integration (CI) and Continuous Delivery (CD), deploying your application in a given environment. In other words, it automatically builds, tests, and deploys your code to make them available to other people.&lt;/p>&lt;h3 name="7136" id="7136" class="graf graf--h3 graf-after--p">Prerequisites&lt;/h3>&lt;p name="b4d3" id="b4d3" class="graf graf--p graf-after--h3">Before we start creating the pipelines, there are configurations that we need to prepare in advance. My friend &lt;a href="https://www.devjev.nl/" data-href="https://www.devjev.nl/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Jev Suchoi&lt;/a> and I have already created a series of posts covering all these topics:&lt;/p>&lt;ul class="postList">&lt;li name="1b4b" id="1b4b" class="graf graf--li graf-after--p">&lt;a href="https://www.devjev.nl/posts/2022/how-to-create-an-organization-in-azure-devops/" data-href="https://www.devjev.nl/posts/2022/how-to-create-an-organization-in-azure-devops/" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--li-strong">How to create an Azure DevOps organization&lt;/strong>&lt;/a>&lt;/li>&lt;li name="a610" id="a610" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">How to configure your Azure DevOps project&lt;/strong>&lt;/li>&lt;li name="51ba" id="51ba" class="graf graf--li graf-after--li">&lt;a href="http://Git%20Basic%20commands%20in%20a%20nutshell" data-href="http://Git Basic commands in a nutshell" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--li-strong">Basic git commands you need to know&lt;/strong>&lt;/a>&lt;/li>&lt;li name="c863" id="c863" class="graf graf--li graf-after--li">&lt;a href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" data-href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--li-strong">Pushing code to git&lt;/strong>&lt;/a>&lt;/li>&lt;li name="72ce" id="72ce" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Connecting Azure DevOps with Azure&lt;/strong>&lt;/li>&lt;li name="7f63" id="7f63" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Creating a variable group on Azure DevOps&lt;/strong>&lt;/li>&lt;/ul>&lt;h3 name="1447" id="1447" class="graf graf--h3 graf-after--li">How to create an Azure DevOps pipeline&lt;/h3>&lt;p name="0aa4" id="0aa4" class="graf graf--p graf-after--h3">Azure DevOps Pipelines are an implementation of deployment pipelines that supports multiple programming languages and clouds. Basically, everything can be deployed using this tool.&lt;/p>&lt;p name="19bc" id="19bc" class="graf graf--p graf-after--p">So let’s create our first pipeline!&lt;/p>&lt;p name="2047" id="2047" class="graf graf--p graf-after--p">First of all, we need our application under a Version Control System. In &lt;a href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" data-href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">&lt;strong class="markup--strong markup--p-strong">this post&lt;/strong>&lt;/a>, I showed how to create a local repository for a dotnet core application, and &lt;a href="https://medium.com/@camargo-wes/azure-devops-remote-repositories-in-a-nutshell-how-to-create-and-push-your-code-to-git-219d3e1df71" data-href="https://medium.com/@camargo-wes/azure-devops-remote-repositories-in-a-nutshell-how-to-create-and-push-your-code-to-git-219d3e1df71" class="markup--anchor markup--p-anchor" target="_blank">&lt;strong class="markup--strong markup--p-strong">here &lt;/strong>&lt;/a>I show how to push the code to a remote repository on Azure Repos.&lt;/p>&lt;p name="4015" id="4015" class="graf graf--p graf-after--p">With the repo in place, go to Pipelines on the left menu, and then click on &lt;strong class="markup--strong markup--p-strong">New pipeline&lt;/strong>:&lt;/p>&lt;figure name="3cdc" id="3cdc" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*zW4FBgtDLNby8FJinT8teQ.png" data-width="1098" data-height="477" src="https://cdn-images-1.medium.com/max/800/1*zW4FBgtDLNby8FJinT8teQ.png">&lt;figcaption class="imageCaption">Image by Author&lt;/figcaption>&lt;/figure>&lt;p name="fdf2" id="fdf2" class="graf graf--p graf-after--figure">In the new window, choose your repository. In this example we are using the Azure Repo that we created on the post mentioned above:&lt;/p>&lt;figure name="fff3" id="fff3" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*M1g7_hmhSaBOQJs6-TzG2w.png" data-width="506" data-height="519" src="https://cdn-images-1.medium.com/max/800/1*M1g7_hmhSaBOQJs6-TzG2w.png">&lt;figcaption class="imageCaption">Image by Author&lt;/figcaption>&lt;/figure>&lt;figure name="0f6f" id="0f6f" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*IJZAmr6glzC5EW9PvB1DOg.png" data-width="725" data-height="275" src="https://cdn-images-1.medium.com/max/800/1*IJZAmr6glzC5EW9PvB1DOg.png">&lt;figcaption class="imageCaption">Image by Author&lt;/figcaption>&lt;/figure>&lt;p name="4243" id="4243" class="graf graf--p graf-after--figure">Choose the &lt;strong class="markup--strong markup--p-strong">Starter pipeline. &lt;/strong>If you already have your own YAML, you can choose the Existing option.&lt;/p>&lt;figure name="050f" id="050f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*7dKmLb-LGN8neBcanVm9Eg.png" data-width="663" data-height="371" src="https://cdn-images-1.medium.com/max/800/1*7dKmLb-LGN8neBcanVm9Eg.png">&lt;figcaption class="imageCaption">Image by Author&lt;/figcaption>&lt;/figure>&lt;h4 name="9771" id="9771" class="graf graf--h4 graf-after--figure">Azure DevOps Pipeline anatomy&lt;/h4>&lt;p name="41fa" id="41fa" class="graf graf--p graf-after--h4">Azure DevOps will create a skeleton of a pipeline. It is quite simple, but enough to start. Let’s see what we have there:&lt;/p>&lt;ol class="postList">&lt;li name="c757" id="c757" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Trigger — &lt;/strong>This is the configuration about which branch(or branches) our pipeline will be triggered if we have new commits. Normally this is tied to your branch strategy, by default it is created to the default branch in the chosen repository.&lt;/li>&lt;li name="c356" id="c356" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Pool &lt;/strong>— The pools are a set of machines that run our build inside. Azure DevOps has two pools when it’s created. The &lt;strong class="markup--strong markup--li-strong">Default &lt;/strong>is a pool in which you can add your own agents. &lt;strong class="markup--strong markup--li-strong">Azure Pipelines &lt;/strong>on the other hand is a SaaS agent that Microsoft provisions.&lt;/li>&lt;li name="1bdc" id="1bdc" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Steps &lt;/strong>— Finally it starts to be fun, we have the steps! They are instructions that we send to agents in order to complete our pipeline. In some cases, they can be simple command-line scripts, but we can also make use of “packaged scripts” in the Microsoft marketplace, also known as &lt;strong class="markup--strong markup--li-strong">Tasks&lt;/strong>.&lt;/li>&lt;/ol>&lt;figure name="6c32" id="6c32" class="graf graf--figure graf-after--li">&lt;img class="graf-image" data-image-id="1*ioGI-irRd-PRszOq7ZfqOQ.png" data-width="787" data-height="668" src="https://cdn-images-1.medium.com/max/800/1*ioGI-irRd-PRszOq7ZfqOQ.png">&lt;figcaption class="imageCaption">Image by Author&lt;/figcaption>&lt;/figure>&lt;p name="3bdc" id="3bdc" class="graf graf--p graf-after--figure">To prepare the pipeline for dotnet core, we will change the pool to &lt;strong class="markup--strong markup--p-strong">windows-latest&lt;/strong>, as I am using a Windows machine, I want to keep the same.&lt;/p>&lt;p name="d4d8" id="d4d8" class="graf graf--p graf-after--p">And we will also use a &lt;strong class="markup--strong markup--p-strong">dotnet core task&lt;/strong>, with the publish command. It will prepare all the artifacts necessary to deploy our application.&lt;/p>&lt;p name="bc2f" id="bc2f" class="graf graf--p graf-after--p">In the next step, we will use an Azure Web App task, that will deploy in deploy in App Service previously created in Azure. Pay attention that a service connection is required here, so make sure that the name matches yours.&lt;/p>&lt;p name="3a25" id="3a25" class="graf graf--p graf-after--p">Below there is all you need to create this pipeline. Simply delete the content created automatically and replace it.&lt;/p>&lt;figure name="026b" id="026b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/45d9a756f72a9c213f1ca972864636be?file=steps-pipeline.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="2d4d" id="2d4d" class="graf graf--h3 graf-after--figure">How to create an Azure DevOps pipeline with stages&lt;/h3>&lt;p name="f2ee" id="f2ee" class="graf graf--p graf-after--h3">Now let&amp;#39;s make it a bit more complex :). The pipeline above will cover some simple scenarios, mostly for testing and learning. However, if you need something more robust, you will need to organize it in a better way.&lt;/p>&lt;p name="1cb1" id="1cb1" class="graf graf--p graf-after--p">There are two resources on Azure Pipelines that will enable it: &lt;strong class="markup--strong markup--p-strong">Stages&lt;/strong> and &lt;strong class="markup--strong markup--p-strong">jobs.&lt;/strong>&lt;/p>&lt;h4 name="dd4c" id="dd4c" class="graf graf--h4 graf-after--p">What are Jobs in Azure DevOps?&lt;/h4>&lt;p name="756a" id="756a" class="graf graf--p graf-after--h4">In a few words, &lt;strong class="markup--strong markup--p-strong">Jobs &lt;/strong>are sets of &lt;strong class="markup--strong markup--p-strong">Steps &lt;/strong>that run together. Every pipeline has at least one job, even if you do not specify one, by default your steps will be encapsulated in a job.&lt;/p>&lt;p name="2520" id="2520" class="graf graf--p graf-after--p">There are multiple scenarios where the use of multiple jobs is beneficial, as per separate responsibilities, running different jobs in parallel, and so on.&lt;/p>&lt;p name="62fb" id="62fb" class="graf graf--p graf-after--p">There is one special type of job for deployments. It is recommended to use it as brings some benefits as Deployment history and the possibility to use pre-configured strategies, such as canary, blue-green, etc.&lt;/p>&lt;p name="93a3" id="93a3" class="graf graf--p graf-after--p">To specify a job, you can simply add this to your pipeline:&lt;/p>&lt;figure name="31e6" id="31e6" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/45d9a756f72a9c213f1ca972864636be?file=job.yml.js">&lt;/script>&lt;/figure>&lt;h4 name="a3f9" id="a3f9" class="graf graf--h4 graf-after--figure">What are Stages in Azure DevOps?&lt;/h4>&lt;p name="bb92" id="bb92" class="graf graf--p graf-after--h4">As we saw above that Jobs are sets of Steps, so guess what? Stages are sets of… Jobs!&lt;/p>&lt;p name="fd92" id="fd92" class="graf graf--p graf-after--p">To determine the boundaries of your deployment, pausing and validating before moving on, Stages must be used.&lt;/p>&lt;p name="399f" id="399f" class="graf graf--p graf-after--p">I recommend structuring your pipelines in the following manner:&lt;/p>&lt;ul class="postList">&lt;li name="1412" id="1412" class="graf graf--li graf-after--p">One stage to gather all artifacts that will be used during the deployment, also known as a “build stage” (in some cases, you don’t need a real build generating binaries, as some languages don’t produce them, as IaC languages or even PHP for example).&lt;/li>&lt;li name="905e" id="905e" class="graf graf--li graf-after--li">Different deployment stages for different environments, for example, Development, UAT, and Production. It will allow you to validate the quality of your code during the journey toward production.&lt;/li>&lt;/ul>&lt;p name="7824" id="7824" class="graf graf--p graf-after--li">The stage structure is similar to the job syntax, and contains one or more jobs:&lt;/p>&lt;figure name="e091" id="e091" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/45d9a756f72a9c213f1ca972864636be?file=stage.yml.js">&lt;/script>&lt;/figure>&lt;p name="d47b" id="d47b" class="graf graf--p graf-after--figure">Below we can see the conversion of the simple pipeline to a complete pipeline using &lt;strong class="markup--strong markup--p-strong">Jobs &lt;/strong>and &lt;strong class="markup--strong markup--p-strong">Stages:&lt;/strong>&lt;/p>&lt;figure name="1109" id="1109" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/45d9a756f72a9c213f1ca972864636be?file=complete-pipeline.yml.js">&lt;/script>&lt;/figure>&lt;h3 name="3832" id="3832" class="graf graf--h3 graf-after--figure">Key takeaways&lt;/h3>&lt;p name="e9c9" id="e9c9" class="graf graf--p graf-after--h3">Azure Pipelines is a powerful and very flexible tool that can technically support all programming languages, clouds, and technologies. It is part of Azure DevOps ecosystem, having native integration with with the other tools, do not require external integrations, however it also supports if required, and it makes quite easy to configure and increase productivity from the first moment you start to use it.&lt;/p>&lt;p name="8b2d" id="8b2d" class="graf graf--p graf-after--p">I hope this would help you, and see you in the next post!&lt;/p>&lt;figure name="d153" id="d153" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*rbBIrAtLWWmh60Qi.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*rbBIrAtLWWmh60Qi.png">&lt;/figure>&lt;h4 name="9116" id="9116" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="fb27" id="fb27" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/4c684dd914c8">&lt;time class="dt-published" datetime="2022-11-07T14:17:27.923Z">November 7, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/stop-breaking-your-environment-how-to-get-started-with-azure-devops-pipelines-4c684dd914c8" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2022-11-28_don-t-repeat-yourself--creating-azure-bicep-modules----70414b86e3ce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2022-11-28_don-t-repeat-yourself--creating-azure-bicep-modules----70414b86e3ce/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Don’t repeat yourself! Creating Azure Bicep modules 💪&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Don’t repeat yourself! Creating Azure Bicep modules 💪&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Since our Infrastructure is Code now, why don’t we leverage the best software development practices? Check out this post on achieving…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f8cf" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ffab" id="ffab" class="graf graf--h3 graf--leading graf--title">Don’t repeat yourself! Creating Azure Bicep modules 💪&lt;/h3>&lt;p name="3f92" id="3f92" class="graf graf--p graf-after--h3">Since our Infrastructure is Code now, why don’t we leverage the best software development practices? Check out this post on achieving reusability on your IaC templates using Bicep Modules!&lt;/p>&lt;figure name="6ad2" id="6ad2" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*ZB8clYDcM2jGQj71" data-width="6000" data-height="4000" src="https://cdn-images-1.medium.com/max/800/0*ZB8clYDcM2jGQj71">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@prateekkatyal?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@prateekkatyal?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener noopener" target="_blank">Prateek Katyal&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="fe16" id="fe16" class="graf graf--h3 graf-after--figure">What are Azure Bicep Modules?&lt;/h3>&lt;p name="671e" id="671e" class="graf graf--p graf-after--h3">Bicep Modules are the application of the &lt;strong class="markup--strong markup--p-strong">Don’t Repeat Yourself &lt;/strong>principle, where a Bicep template calls another Bicep template. As a result, this practice enables the reusability of existing code and can speed up the creation of future resources.&lt;/p>&lt;p name="9109" id="9109" class="graf graf--p graf-after--p">Imagine, for example, that you need to control how infrastructure resources are created. To accomplish this, you can implement rules in the bicep templates that, for example, restrict the size of virtual machines or the regions in which they can be created.&lt;/p>&lt;p name="0161" id="0161" class="graf graf--p graf-after--p graf--trailing">Since the definition has already been created and the rules, will probably remain the same in the next project, it is not necessary to create a new definition. We can create a module that allows us to save valuable time and money by reusing these definitions.&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="129c" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="522c" id="522c" class="graf graf--h3 graf--leading">How to create an Azure Bicep Module?&lt;/h3>&lt;p name="5bd8" id="5bd8" class="graf graf--p graf-after--h3">If you are already familiar with Bicep Templates, creating a Bicep Module is effortless, as a module has exactly the same structure and it is not necessary to add any special configuration. It is possible, inclusive, to reuse existing templates as modules.&lt;/p>&lt;figure name="7e36" id="7e36" class="graf graf--figure graf--iframe graf-after--p graf--trailing">&lt;script src="https://gist.github.com/wesleycamargo/5f61af396a55d284c91bbc70bd06bf85?file=storage.bicep.js">&lt;/script>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="1651" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="44ae" id="44ae" class="graf graf--h3 graf--leading">How to consume an Azure Bicep Module?&lt;/h3>&lt;h4 name="1ac9" id="1ac9" class="graf graf--h4 graf-after--h3">&lt;strong class="markup--strong markup--h4-strong">&lt;em class="markup--em markup--h4-em">Declaring a Bicep Module&lt;/em>&lt;/strong>&lt;/h4>&lt;p name="555b" id="555b" class="graf graf--p graf-after--h4">When working with Bicep Modules, the syntax changes compared to resources. Instead of declaring &lt;code class="markup--code markup--p-code">resource&lt;/code>the declaration is now &lt;code class="markup--code markup--p-code">module&lt;/code>&lt;strong class="markup--strong markup--p-strong">. &lt;/strong>Additionally, it is necessary to reference the module path, which can be local or remote.&lt;/p>&lt;figure name="2fef" id="2fef" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*qtbw9GCE45MafTDjuJ_6vg.png" data-width="523" data-height="229" src="https://cdn-images-1.medium.com/max/800/1*qtbw9GCE45MafTDjuJ_6vg.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;p name="9be4" id="9be4" class="graf graf--p graf-after--figure">It is also mandatory to add a symbolic name to the resource. The symbolic name can be used to recover an output from the module to be used in another part of the template.&lt;/p>&lt;figure name="7167" id="7167" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*dvcRYdnC-LfnI9eJGBiCwA.png" data-width="523" data-height="229" src="https://cdn-images-1.medium.com/max/800/1*dvcRYdnC-LfnI9eJGBiCwA.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;p name="fb50" id="fb50" class="graf graf--p graf-after--figure">The property &lt;code class="markup--code markup--p-code">name&lt;/code>&lt;strong class="markup--strong markup--p-strong"> &lt;/strong>is mandatory. It will become the nested template name in the final template.&lt;/p>&lt;figure name="6229" id="6229" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*6W6RH47RoNV7GF6CfzRC-w.png" data-width="523" data-height="229" src="https://cdn-images-1.medium.com/max/800/1*6W6RH47RoNV7GF6CfzRC-w.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;h4 name="38ac" id="38ac" class="graf graf--h4 graf-after--figure">&lt;strong class="markup--strong markup--h4-strong">&lt;em class="markup--em markup--h4-em">Passing parameters to Bicep modules&lt;/em>&lt;/strong>&lt;/h4>&lt;p name="b233" id="b233" class="graf graf--p graf-after--h4">The parameters on modules follow the same syntax and contain the same features as regular templates. However, to send the parameters to a module it must be under the &lt;code class="markup--code markup--p-code">params&lt;/code> node. It must match those declared in the module, including the validations.&lt;/p>&lt;figure name="2f75" id="2f75" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*QOZF4MK2Y5SfT6AuO2m2jg.png" data-width="523" data-height="229" src="https://cdn-images-1.medium.com/max/800/1*QOZF4MK2Y5SfT6AuO2m2jg.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;figure name="7bd2" id="7bd2" class="graf graf--figure graf--iframe graf-after--figure graf--trailing">&lt;script src="https://gist.github.com/wesleycamargo/5f61af396a55d284c91bbc70bd06bf85?file=main.bicep.js">&lt;/script>&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="96c5" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="8bc2" id="8bc2" class="graf graf--h3 graf--leading">How to deploy an Azure Bicep Module?&lt;/h3>&lt;p name="84e8" id="84e8" class="graf graf--p graf-after--h3">Deployment of Bicep Modules works exactly like Bicep Templates. It is possible to use &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-cli?WT.mc_id=DT-MVP-5004039" data-href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-cli?WT.mc_id=DT-MVP-5004039" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure CLI&lt;/a>, &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-powershell?WT.mc_id=DT-MVP-5004039" data-href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-powershell?WT.mc_id=DT-MVP-5004039" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure PowerShell&lt;/a>, or even through &lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-rest?WT.mc_id=DT-MVP-5004039" data-href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-rest?WT.mc_id=DT-MVP-5004039" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure API.&lt;/a>&lt;/p>&lt;p name="4dd9" id="4dd9" class="graf graf--p graf-after--p">I explain in more detail in &lt;a href="https://medium.com/faun/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" data-href="https://medium.com/faun/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" class="markup--anchor markup--p-anchor" target="_blank">this post&lt;/a> how to deploy using Azure CLI. Below we can see the script used to deploy the templates and modules created above.&lt;/p>&lt;figure name="0e5b" id="0e5b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/5f61af396a55d284c91bbc70bd06bf85?file=deploy.ps1.js">&lt;/script>&lt;/figure>&lt;p name="00e4" id="00e4" class="graf graf--p graf-after--figure">After running it is possible to see in the deployments of Azure Resource Group the main.bicep deployment:&lt;/p>&lt;figure name="6be0" id="6be0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*4QSoI-AuLcjYe9zxF6iiiQ.png" data-width="872" data-height="468" src="https://cdn-images-1.medium.com/max/800/1*4QSoI-AuLcjYe9zxF6iiiQ.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;p name="1346" id="1346" class="graf graf--p graf-after--figure">And if we click on the nested storage deployment we can observe the resource storageAccount being deployed :&lt;/p>&lt;figure name="df7e" id="df7e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*gqdrDwcLHLaVUXVLbG31_Q.png" data-width="884" data-height="477" src="https://cdn-images-1.medium.com/max/800/1*gqdrDwcLHLaVUXVLbG31_Q.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;h3 name="0d5b" id="0d5b" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="9ed4" id="9ed4" class="graf graf--p graf-after--h3">Reusability is one of the main advantages that we can leverage from modularization in any programming language and with Infrastructure as Code templates, it wouldn’t be different. Another benefit is that it also will ensure that your environment is more stable as your templates will be already tested by others, and most importantly, will also save implementation time.&lt;/p>&lt;p name="9b5a" id="9b5a" class="graf graf--p graf-after--p">I hope this helps you, and see you at the next one!&lt;/p>&lt;figure name="fa4a" id="fa4a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*JSaWL5U0fpZZ0xeP.png" src="https://cdn-images-1.medium.com/max/800/0*JSaWL5U0fpZZ0xeP.png">&lt;/figure>&lt;h4 name="b917" id="b917" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="453a" id="453a" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/70414b86e3ce">&lt;time class="dt-published" datetime="2022-11-28T17:34:16.089Z">November 28, 2022&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/dont-repeat-yourself-creating-azure-bicep-modules-70414b86e3ce" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-02-12_optimize-your-cloud-environment-with-azure-platform-landing-zones-607b4222e3c9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-02-12_optimize-your-cloud-environment-with-azure-platform-landing-zones-607b4222e3c9/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Optimize Your Cloud Environment with Azure Platform Landing Zones&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Optimize Your Cloud Environment with Azure Platform Landing Zones&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
What are Azure Landing Zones and why are they important?
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e3ca" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="babe" id="babe" class="graf graf--h3 graf--leading graf--title">Optimize Your Cloud Environment with Azure Platform Landing Zones&lt;/h3>&lt;figure name="440b" id="440b" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="0*z0nVJG-R4dKvqap4" data-width="5046" data-height="3364" data-unsplash-photo-id="UYiesSO4FiM" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*z0nVJG-R4dKvqap4">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/de/@zhpix?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/de/@zhpix?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener noopener" target="_blank">Pascal Meier&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="b843" id="b843" class="graf graf--h3 graf-after--figure">What are Azure Landing Zones and why are they important?&lt;/h3>&lt;p name="dd81" id="dd81" class="graf graf--p graf-after--h3">Imagine that you are building a house, it is necessary to prepare the ground and have a solid foundation to grow your walls. Moreover, it is also necessary to prepare essential services, for instance, plumbing, heating and insulation, and electric cables in this foundation, otherwise, it will be more complicated and expensive (although possible) to do it later.&lt;/p>&lt;p name="2afe" id="2afe" class="graf graf--p graf-after--p">An Azure Landing Zone is the same as the house foundation, with essential services to support your platform or applications.&lt;/p>&lt;p name="7610" id="7610" class="graf graf--p graf-after--p">We can say that Azure Landing Zone is a standardized and repeatable framework for deploying and managing resources in Microsoft Azure. It provides a set of best practices and policies, that helps to improve the cloud deployment process and ensure that resources are deployed in a consistent, scalable, and secure manner.&lt;/p>&lt;h3 name="9714" id="9714" class="graf graf--h3 graf-after--p">Azure Platform Landing Zones&lt;/h3>&lt;p name="0a09" id="0a09" class="graf graf--p graf-after--h3">The set of essential services that are shared by multiple applications is also called Platform Landing Zone. These services, such as Networking and Identity management, are typically managed and centralized by dedicated teams, allowing application teams to concentrate on their core business objectives.&lt;/p>&lt;figure name="3048" id="3048" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*et3Q_YBVoZ62rNaL-yKKJQ.png" data-width="1122" data-height="632" src="https://cdn-images-1.medium.com/max/800/1*et3Q_YBVoZ62rNaL-yKKJQ.png">&lt;figcaption class="imageCaption">Azure Platform Landing Zone&lt;/figcaption>&lt;/figure>&lt;p name="9aae" id="9aae" class="graf graf--p graf-after--figure">Microsoft divided the Platform Landing Zones into 8 design areas. These design areas are topics that must be carefully planned to ensure the security and performance of the platform:&lt;/p>&lt;ul class="postList">&lt;li name="a944" id="a944" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Billing and Active Directory &lt;/strong>—Billing is the process of tracking and paying for the resources used in an Azure environment. The Azure billing and cost management platform provide the ability to monitor usage and costs, set budgets and alerts, and optimize spending. Azure Active Directory is a cloud-based identity and access management service that provides centralized identity management and robust security features.&lt;/li>&lt;li name="6248" id="6248" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Identity and access management &lt;/strong>— IAM controls access to Azure resources. Azure Active Directory is the main service used for IAM and helps manage user identities, groups, and access to cloud-based apps.&lt;/li>&lt;li name="688b" id="688b" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Network topology and connectivity&lt;/strong> — It deals with the design and communication between virtual network resources. A good design ensures secure and efficient communication and access to the internet and external resources.&lt;/li>&lt;li name="0976" id="0976" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Resource organization&lt;/strong> — It involves grouping and managing resources within an Azure environment. It provides structure and scalability, making it easier to manage and control resource access. Resource groups, subscriptions, and policies to improve efficiency are used to reduce complexity, making it easy to adminstrate and ensure policy compliance in the platform.&lt;/li>&lt;li name="99bc" id="99bc" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Security&lt;/strong> — This is one of the most important design areas when planning the landing zone. It involves protecting resources with a multi-layered approach, including access control, network security, encryption, and incident response planning.&lt;/li>&lt;li name="32d8" id="32d8" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Management — &lt;/strong>Management in Azure Landing Zones covers processes and tools used to manage and maintain resources. A well-managed landing zone needs clear roles, a change management process, and a structured approach to resource management.&lt;/li>&lt;li name="1df9" id="1df9" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Governance &lt;/strong>— This is about setting the rules to keep your Azure environment organized and secure. Azure has tools like Policy and Role-Based Access Control to enforce your policies. To make things easy, make sure roles are clear and have a plan for making changes.&lt;/li>&lt;li name="dd5d" id="dd5d" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Platform automation and DevOps&lt;/strong> — As I am a DevOps guy for almost 10 years, I am suspicious to talk about this topic :D. It basically ensures that tools and processes make the deployment and management of applications and infrastructure easier and faster.&lt;/li>&lt;/ul>&lt;h3 name="8020" id="8020" class="graf graf--h3 graf-after--li">Conclusion&lt;/h3>&lt;p name="0ded" id="0ded" class="graf graf--p graf-after--h3">Azure Platform Landing Zones are the perfect solution for businesses looking to streamline their cloud deployment and management processes. With its centralized services, specialized teams, and powerful tools for automation and DevOps, it makes it easier than ever to bring new applications and services to market. Not to mention, the added security and governance features give peace of mind when it comes to managing resources in the cloud. So, whether you’re just starting your cloud journey or looking to optimize your existing operations, Azure Landing Zones are the way to go! So why wait? Get on board and start experiencing the benefits for yourself!&lt;/p>&lt;figure name="3376" id="3376" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*f97d9JzKyDdTtruJ.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*f97d9JzKyDdTtruJ.png">&lt;/figure>&lt;h4 name="74df" id="74df" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="241c" id="241c" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/607b4222e3c9">&lt;time class="dt-published" datetime="2023-02-12T19:36:00.051Z">February 12, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/optimize-your-cloud-environment-with-azure-platform-landing-zones-607b4222e3c9" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-02-17_from-terraform-to-azure-bicep--what-you-need-to-know-about-syntax-bb1c404b7603/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-02-17_from-terraform-to-azure-bicep--what-you-need-to-know-about-syntax-bb1c404b7603/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>From Terraform to Azure Bicep: What You Need to Know about syntax&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">From Terraform to Azure Bicep: What You Need to Know about syntax&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Hey there Terraform experts! I am confident that you know the power of infrastructure as Code in managing and provisioning IT…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7081" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9ac3" id="9ac3" class="graf graf--h3 graf--leading graf--title">From Terraform to Azure Bicep: What You Need to Know about syntax&lt;/h3>&lt;figure name="2fde" id="2fde" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="1*TaDCxnnAcZb53Fi-ToztNg.jpeg" data-width="5184" data-height="3456" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*TaDCxnnAcZb53Fi-ToztNg.jpeg">&lt;figcaption class="imageCaption">Photo by Botond Czapp: &lt;a href="https://www.pexels.com/photo/birds-flying-on-blue-sky-7255793/" data-href="https://www.pexels.com/photo/birds-flying-on-blue-sky-7255793/" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">https://www.pexels.com/photo/birds-flying-on-blue-sky-7255793/&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="86ff" id="86ff" class="graf graf--p graf-after--figure">Hey there Terraform experts! I am confident that you know the power of infrastructure as Code in managing and provisioning IT infrastructure and have been applying it with the famous HashiCorp tool. But have you heard about Azure Bicep, the newer Microsoft IaC language for managing Azure resources? If you’re curious about the differences between Terraform and Bicep, and how Bicep can help you better manage your Azure resources, you’ve come to the right place. Let’s dive in and explore the world of Infra as Code with Azure Bicep! In this first post, I’m going to break down the basic differences between Terraform and Bicep file structures. These infrastructure-as-code tools have their own unique syntax and components, so it’s important to know what sets them apart. By the end of this post, you’ll have a solid grasp of what makes them tick.&lt;/p>&lt;h3 name="fe21" id="fe21" class="graf graf--h3 graf-after--p">Introducing Terraform and Bicep&lt;/h3>&lt;p name="0673" id="0673" class="graf graf--p graf-after--h3">Terraform and Azure Bicep are two popular Infra as Code (IaC) tools that allow developers and operations teams to manage and provision cloud infrastructure using development practices.&lt;/p>&lt;p name="fa73" id="fa73" class="graf graf--p graf-after--p">Terraform is a tool developed by HashiCorp that supports multiple cloud platforms, including Azure, while Azure Bicep is a newer tool developed by Microsoft specifically for managing Azure resources. Both tools have their own syntax and language for defining Infrastructure as Code and offer benefits such as consistency, scalability, and version control. However, there are also some differences between the two, such as how they handle state management and the availability of community-built providers. In the following sessions, we’ll explore the similarities and differences between Terraform and Azure Bicep, and help you decide which tool is best for your infrastructure management needs.&lt;/p>&lt;h3 name="c81f" id="c81f" class="graf graf--h3 graf-after--p">Language and Syntax&lt;/h3>&lt;p name="1bc3" id="1bc3" class="graf graf--p graf-after--h3">Terraform and Bicep has a lot in common. Both use their own domain-specific languages, with a declarative approach, support modularization, and are designed to be human-friendly(I am looking at you, ARM Templates 🙃). Terraform uses HashiCorp Configuration Language, also known as HCL, developed by HashiCorp and has several providers, supporting not only Azure, but AWS, GCP, and even VMWare. Bicep is developed by Microsoft with the intention to abstract the usage of ARM Templates and was developed specifically for Azure, which gave a great integration.&lt;/p>&lt;p name="7024" id="7024" class="graf graf--p graf-after--p">The structure of both languages is similar, within the same building blocks, with the main components being resources, inputs, and outputs, and as I said above, quite easy to read. Below we can see a comparison of the creation of an Azure Storage Account:&lt;/p>&lt;figure name="de25" id="de25" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*StyddfWR0evZ6TjZ4MKRNQ.png" data-width="1342" data-height="624" src="https://cdn-images-1.medium.com/max/800/1*StyddfWR0evZ6TjZ4MKRNQ.png">&lt;figcaption class="imageCaption">Image prepared by the author&lt;/figcaption>&lt;/figure>&lt;p name="f728" id="f728" class="graf graf--p graf-after--figure">Now let’s analyze the main differences:&lt;/p>&lt;h4 name="4cf7" id="4cf7" class="graf graf--h4 graf-after--p">Provider&lt;/h4>&lt;p name="359e" id="359e" class="graf graf--p graf-after--h4">The first and biggest difference that note is that in the Terraform example, we have a section called “provider”. As Terraform supports not only Azure but also other providers, it is required to declare the provider that we want to use.&lt;/p>&lt;p name="0a45" id="0a45" class="graf graf--p graf-after--p">As Bicep is designed specifically for Azure, the provider statement is not required.&lt;/p>&lt;h4 name="703f" id="703f" class="graf graf--h4 graf-after--p">Input&lt;/h4>&lt;p name="c365" id="c365" class="graf graf--p graf-after--h4">Another difference is that the input parameters have different reserved words. In Terraform it’s called &lt;code class="markup--code markup--p-code">variable&lt;/code>, the default values are declared with a &lt;code class="markup--code markup--p-code">default&lt;/code> statement and its syntax require curly brackets.&lt;/p>&lt;p name="b055" id="b055" class="graf graf--p graf-after--p">Bicep, in turn, declares the inputs by the reserved word &lt;code class="markup--code markup--p-code">param&lt;/code> , the attribution of a default value can be done with the equals sign and it’s not required any brackets. Bicep also has a &lt;code class="markup--code markup--p-code">variable&lt;/code> reserved world, but it’s used not for inputs, below we can see more about it.&lt;/p>&lt;h4 name="0a56" id="0a56" class="graf graf--h4 graf-after--p">Local variables&lt;/h4>&lt;p name="0491" id="0491" class="graf graf--p graf-after--h4">Local variables in Terraform have a special section called &lt;code class="markup--code markup--p-code">locals&lt;/code>. All necessary variables must be declared in this section and must be accessed by the syntax &lt;code class="markup--code markup--p-code">local.&amp;lt;variable name&amp;gt;&lt;/code> and can be used to create combinations and complex operations.&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="python" name="0560" id="0560" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-built_in">locals&lt;/span> {&lt;br /> resource_group_name = &lt;span class="hljs-string">&amp;quot;myTerraformResourceGroup&amp;quot;&lt;/span>&lt;br /> location = &lt;span class="hljs-string">&amp;quot;West Europe&amp;quot;&lt;/span>&lt;br />}&lt;/span>&lt;/pre>&lt;p name="4426" id="4426" class="graf graf--p graf-after--pre">On Bicep, it is not necessary to have a specific session, being possible to declare anywhere in the file (although is recommended to do in the beginning to make it more readable). It also makes the syntax a little simpler than in terraform &lt;code class="markup--code markup--p-code">var location = ‘westeurope’&lt;/code>&lt;/p>&lt;h4 name="21a8" id="21a8" class="graf graf--h4 graf-after--p">Resources&lt;/h4>&lt;p name="dc23" id="dc23" class="graf graf--p graf-after--h4">Finally something in common! For both, Terraform and Bicep, the resource is declared by the reserved word… &lt;code class="markup--code markup--p-code">resource&lt;/code>! And there is more in common, in both cases, when declaring the resource you need to declare which resource is desired and you also need to create an alias to this resource, so it will be possible to access information from it, even in the case that you have several resources of the same type. The internal properties will be different depending on each resource type, but in general, you need to provide the resource name, SKU, location, and so on.&lt;/p>&lt;p name="18e0" id="18e0" class="graf graf--p graf-after--p">Although the concepts are quite the same, the syntax is slightly different as we can see below:&lt;/p>&lt;p name="bab3" id="bab3" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Terraform resource:&lt;/strong>&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="java" name="6509" id="6509" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">resource &lt;span class="hljs-string">&amp;quot;azurerm_storage_account&amp;quot;&lt;/span> &lt;span class="hljs-string">&amp;quot;storage&amp;quot;&lt;/span> {&lt;br /> name = &lt;span class="hljs-keyword">var&lt;/span>.&lt;span class="hljs-type">storage_account_name&lt;/span>&lt;br /> &lt;span class="hljs-variable">resource_group_name&lt;/span> &lt;span class="hljs-operator">=&lt;/span> local.&lt;span class="hljs-type">resource_group_name&lt;/span>&lt;br /> &lt;span class="hljs-variable">location&lt;/span> &lt;span class="hljs-operator">=&lt;/span> local.&lt;span class="hljs-type">location&lt;/span>&lt;br /> &lt;span class="hljs-variable">account_tier&lt;/span> &lt;span class="hljs-operator">=&lt;/span> &lt;span class="hljs-string">&amp;quot;Standard&amp;quot;&lt;/span>&lt;br /> account_replication_type = &lt;span class="hljs-string">&amp;quot;LRS&amp;quot;&lt;/span>&lt;br />}&lt;/span>&lt;/pre>&lt;p name="219c" id="219c" class="graf graf--p graf-after--pre">&lt;strong class="markup--strong markup--p-strong">Bicep resource:&lt;/strong>&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="yaml" name="3298" id="3298" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-string">resource&lt;/span> &lt;span class="hljs-string">storage&lt;/span> &lt;span class="hljs-string">&amp;#x27;Microsoft.Storage/storageAccounts@2022-09-01&amp;#x27;&lt;/span> &lt;span class="hljs-string">=&lt;/span> {&lt;br /> &lt;span class="hljs-attr">kind:&lt;/span> &lt;span class="hljs-string">&amp;#x27;StorageV2&amp;#x27;&lt;/span>&lt;br /> &lt;span class="hljs-attr">location:&lt;/span> &lt;span class="hljs-string">location&lt;/span>&lt;br /> &lt;span class="hljs-attr">name:&lt;/span> &lt;span class="hljs-string">storageAccountName&lt;/span>&lt;br /> &lt;span class="hljs-attr">sku:&lt;/span> {&lt;br /> &lt;span class="hljs-attr">name:&lt;/span> &lt;span class="hljs-string">&amp;#x27;Standard_LRS&amp;#x27;&lt;/span>&lt;br /> }&lt;br />}&lt;/span>&lt;/pre>&lt;h4 name="1467" id="1467" class="graf graf--h4 graf-after--pre">Output&lt;/h4>&lt;p name="3812" id="3812" class="graf graf--p graf-after--h4">The outputs follow a similar logic as the inputs. Terraform requires curly brackets, Bicep no. In terraform, it is necessary to specify the resource type first, then the alias, and finally the property. It is also important to highlight that is not possible to assign a type to an output in Terraform.&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="lua" name="c3f4" id="c3f4" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-built_in">output&lt;/span> &lt;span class="hljs-string">&amp;quot;storage_account_name&amp;quot;&lt;/span> {&lt;br /> value = azurerm_storage_account.storage.name&lt;br />}&lt;/span>&lt;/pre>&lt;p name="fa08" id="fa08" class="graf graf--p graf-after--pre">Bicep is again, slightly simple. No brackets and you can reference by the alias directly, without having to declare the resource type. In Bicep is also possible to assign a type in the output, which is useful in some cases.&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="lua" name="5fa9" id="5fa9" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-built_in">output&lt;/span> storageName &lt;span class="hljs-built_in">string&lt;/span> = storage.name&lt;/span>&lt;/pre>&lt;h4 name="d908" id="d908" class="graf graf--h4 graf-after--pre">Terraform storage account example&lt;/h4>&lt;figure name="1fe7" id="1fe7" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/9d96b7c5208636ec56072711c2329a2a?file=terraform-storage.tf.js">&lt;/script>&lt;/figure>&lt;h4 name="b11b" id="b11b" class="graf graf--h4 graf-after--figure">Bicep storage account example&lt;/h4>&lt;figure name="d58e" id="d58e" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/9d96b7c5208636ec56072711c2329a2a?file=bicep-storage.bicep.js">&lt;/script>&lt;/figure>&lt;h3 name="9920" id="9920" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="6ac9" id="6ac9" class="graf graf--p graf-after--h3">In conclusion, while Terraform and Bicep share some similarities in their purpose and functionality, they have significant differences in syntax, which can affect the user experience and overall efficiency in deploying infrastructure as code. Understanding these syntax differences is crucial for developers to effectively utilize the benefits of each tool and to determine which one is the best fit for a particular project or organization.&lt;/p>&lt;p name="08d5" id="08d5" class="graf graf--p graf-after--p">In the upcoming posts, we will dive deeper into other differences between both tools, exploring their impact on various aspects of infrastructure deployment and management, and offering practical tips and solutions to common challenges. Stay tuned to learn more about how to optimize your infrastructure as code with Terraform and Bicep!&lt;/p>&lt;figure name="d740" id="d740" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*XC6gJ9HR_xbxqqSp.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*XC6gJ9HR_xbxqqSp.png">&lt;/figure>&lt;h4 name="da64" id="da64" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="3689" id="3689" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/bb1c404b7603">&lt;time class="dt-published" datetime="2023-02-17T17:31:38.471Z">February 17, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/from-terraform-to-azure-bicep-what-you-need-to-know-bb1c404b7603" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-05-31_happy-to-help-thiago--f5584a674db9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-05-31_happy-to-help-thiago--f5584a674db9/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Happy to help Thiago!&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Happy to help Thiago!&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="b513" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="7129" id="7129" class="graf graf--p graf--leading graf--trailing">Happy to help Thiago!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/f5584a674db9">&lt;time class="dt-published" datetime="2023-05-31T09:15:46.202Z">May 31, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/happy-to-help-thiago-f5584a674db9" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-06-14_this-is-what-you-should-do-to-make-your-ci-cd-more-secure-2b6b40c26032/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-06-14_this-is-what-you-should-do-to-make-your-ci-cd-more-secure-2b6b40c26032/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>This is what you should do to make your CI/CD more secure&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">This is what you should do to make your CI/CD more secure&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Security is now a trending topic in the IT industry, with data leaks and breaches happening left and right, so it’s super important to…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="c780" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1d09" id="1d09" class="graf graf--h3 graf--leading graf--title">This is what you should do to make your CI/CD more secure&lt;/h3>&lt;p name="bb1f" id="bb1f" class="graf graf--p graf-after--h3">Security is now a trending topic in the IT industry, with data leaks and breaches happening left and right, so it’s super important to tackle any risks in our environments. One of these risks is the management of Service Principal secrets to connect to workloads running outside Azure, such as other clouds or external CI/CD tools. In this post, we will learn how to use Workload Identity Federation to tackle this and make our DevOps process more secure and efficient.&lt;/p>&lt;h3 name="fa44" id="fa44" class="graf graf--h3 graf-after--p">Making your CI/CD more secure with Passwordless Authentication on Azure&lt;/h3>&lt;figure name="93cc" id="93cc" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="0*HQSrqlfb4u0sFQe6" data-width="2978" data-height="2234" data-unsplash-photo-id="j7mGBT2hyM8" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*HQSrqlfb4u0sFQe6">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@moneyphotos?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@moneyphotos?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">regularguy.eth&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="a0c8" id="a0c8" class="graf graf--h3 graf-after--figure">Pre-requisites&lt;/h3>&lt;ul class="postList">&lt;li name="04f9" id="04f9" class="graf graf--li graf-after--h3">Azure Service Principal Name or Azure Managed Identity&lt;/li>&lt;li name="2a17" id="2a17" class="graf graf--li graf-after--li">GitLab repository&lt;/li>&lt;/ul>&lt;h3 name="2fc9" id="2fc9" class="graf graf--h3 graf-after--li">What is Workload Identity Federation?&lt;/h3>&lt;p name="8eaa" id="8eaa" class="graf graf--p graf-after--h3">WIF (Windows Identity Foundation) enables passwordless authentication, granting access to Azure AD and Azure Resources without the need to manage secrets or certificates.&lt;/p>&lt;p name="7ae3" id="7ae3" class="graf graf--p graf-after--p">Once configured, you establish trust with an external OpenID Connect (OIDC) identity provider such as GitHub, GitLab, Kubernetes, Google, and AWS, also known as &lt;strong class="markup--strong markup--p-strong">Issuer. &lt;/strong>It is also necessary to provide the &lt;strong class="markup--strong markup--p-strong">Subject Identifier&lt;/strong>, so Azure AD will be able to identify the resource when attempting to log in and establish a connection with the external application.&lt;/p>&lt;h3 name="fbd9" id="fbd9" class="graf graf--h3 graf-after--p">How to setup Workload Identity Federation on Azure&lt;/h3>&lt;p name="db82" id="db82" class="graf graf--p graf-after--h3">The process to set up is quite simple but requires permissions to manipulate Azure AD identities. It consists of appending an existing AAD, which can be a Service Principal or a Managed Identity with a Federated Credential.&lt;/p>&lt;p name="eb39" id="eb39" class="graf graf--p graf-after--p">In our example, I will configure it in a GitLab pipeline.&lt;/p>&lt;p name="c6c2" id="c6c2" class="graf graf--p graf-after--p">To do so, it is necessary to inform&lt;/p>&lt;ul class="postList">&lt;li name="f208" id="f208" class="graf graf--li graf-after--p">Issuer: The Identity Provider, in our case &lt;code class="markup--code markup--li-code">&lt;a href="https://gitlab.com" data-href="https://gitlab.com" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">https://gitlab.com&lt;/a>&lt;/code>&lt;/li>&lt;li name="5d28" id="5d28" class="graf graf--li graf-after--li">Subject Identifier: In the case of a GitLab pipeline, the repository name &lt;code class="markup--code markup--li-code">project_path:&amp;lt;project&amp;gt;/&amp;lt;repo name&amp;gt;:ref_type:branch:ref:main&lt;/code>&lt;/li>&lt;li name="bc90" id="bc90" class="graf graf--li graf-after--li">Audience: Service account tokens &lt;code class="markup--code markup--li-code">&lt;a href="https://gitlab.com" data-href="https://gitlab.com" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">https://gitlab.com&lt;/a>&lt;/code>&lt;/li>&lt;/ul>&lt;h4 name="5553" id="5553" class="graf graf--h4 graf-after--li">Creating an Azure User Managed Identity&lt;/h4>&lt;p name="e235" id="e235" class="graf graf--p graf-after--h4">If you don’t have a Service Principal or Managed Identity in place yet, you can run the Azure CLI script below. It creates the MI and sets Contributor permission in the current subscription.&lt;/p>&lt;figure name="7c4e" id="7c4e" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/e3f28e2cd65b95f56554af52ec92e1d4?file=01-create-managed-identity.ps1.js">&lt;/script>&lt;/figure>&lt;p name="ee3d" id="ee3d" class="graf graf--p graf-after--figure">The script will also print out the TenantId a ClientID that will be necessary to connect on the GitLab pipeline.&lt;/p>&lt;h4 name="0bdd" id="0bdd" class="graf graf--h4 graf-after--p">Setting up an Azure Federated Credential&lt;/h4>&lt;p name="ed09" id="ed09" class="graf graf--p graf-after--h4">The script below creates the Federated Credential in an existing Manage Identity. It can also be replaced by a Service Principal.&lt;/p>&lt;figure name="d045" id="d045" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/e3f28e2cd65b95f56554af52ec92e1d4?file=02-create-federated-credential.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="c91f" id="c91f" class="graf graf--h3 graf-after--figure">Configuring GitLab CI/CD Settings&lt;/h3>&lt;p name="e7ec" id="e7ec" class="graf graf--p graf-after--h3">On the GitLab side, you just need to inform the TenantId and ClientId that were prompted in the creation of the Managed Identity.&lt;/p>&lt;p name="ad06" id="ad06" class="graf graf--p graf-after--p">The pipeline below demonstrates how to connect and create a resource group in an Azure Subscription:&lt;/p>&lt;figure name="b816" id="b816" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/e3f28e2cd65b95f56554af52ec92e1d4?file=03-.gitlab-ci.yml.js">&lt;/script>&lt;/figure>&lt;p name="e142" id="e142" class="graf graf--p graf-after--figure">After running the pipeline, you can see that the connection was successful:&lt;/p>&lt;figure name="4230" id="4230" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*iwJ-Vzmm0Nti_Ju2R_rykw.png" data-width="1204" data-height="830" src="https://cdn-images-1.medium.com/max/800/1*iwJ-Vzmm0Nti_Ju2R_rykw.png">&lt;/figure>&lt;figure name="05d5" id="05d5" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*NDaQ7lVOrIQVhEGs.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*NDaQ7lVOrIQVhEGs.png">&lt;/figure>&lt;h4 name="3a45" id="3a45" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="c4b6" id="c4b6" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/2b6b40c26032">&lt;time class="dt-published" datetime="2023-06-14T16:04:59.782Z">June 14, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/making-your-ci-cd-more-secure-with-passwordless-authentication-on-azure-2b6b40c26032" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-11-21_getting-started-with-azure--what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-11-21_getting-started-with-azure--what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Azure VMs are like your own computer on the cloud. You can choose between different Operational Systems, such as Linux and Windows, and…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="c06d" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="215d" id="215d" class="graf graf--h3 graf--leading graf--title">Getting Started with Azure: What are Azure Virtual Machines and how to create it using Terraform&lt;/h3>&lt;p name="245d" id="245d" class="graf graf--p graf-after--h3">Azure VMs are like your own computer on the cloud. You can choose between different Operational Systems, such as Linux and Windows, and they can be used for different goals, like hosting a website for example.&lt;/p>&lt;figure name="2918" id="2918" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*SbgJGQvFOAmWJQfV" data-width="4408" data-height="2628" data-unsplash-photo-id="klWUhr-wPJ8" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*SbgJGQvFOAmWJQfV">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@imgix?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@imgix?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">imgix&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="b816" id="b816" class="graf graf--p graf-after--figure">Virtual Machines are part of a category called Infrastructure as Code, and they are still relevant in many scenarios, even with the advent of Platform as Code, where you are in control of many aspects, such as security, identity and access, high availability, and others.&lt;/p>&lt;h3 name="689d" id="689d" class="graf graf--h3 graf-after--p">What do I need to create a Virtual Machine on Azure?&lt;/h3>&lt;p name="6606" id="6606" class="graf graf--p graf-after--h3">To create the VM there are a few Azure resources that are necessary to be created before, as we can see in the image below:&lt;/p>&lt;figure name="57d7" id="57d7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*B2QjgH9A_DVlS9HMakuKTA.png" data-width="521" data-height="411" src="https://cdn-images-1.medium.com/max/800/1*B2QjgH9A_DVlS9HMakuKTA.png">&lt;/figure>&lt;h4 name="142d" id="142d" class="graf graf--h4 graf-after--figure">Resources that are Pre-requisites&lt;/h4>&lt;p name="4e66" id="4e66" class="graf graf--p graf-after--h4">There are some resources that are not necessarily part of the same life cycle of your VM, and you might have already created them on your Azure environment. On the script that I am providing below, they are being created, but you might decide to use a resource that already exists.&lt;/p>&lt;p name="4b86" id="4b86" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Resource Group: &lt;/strong>A resource group works similarly to a folder, where you can group the resources that have something in common. It can be resources of the same type, such as VMs, or the most recommended, resources that share the same life cycle.&lt;/p>&lt;p name="9acc" id="9acc" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Virtual Network: &lt;/strong>In an Azure VNet, you are able to create a private space, where your resources can communicate securely. It works similarly to the network that you are connected to right now to read this post, but it sits on Azure.&lt;/p>&lt;p name="6209" id="6209" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Subnet:&lt;/strong> They are subdivisions of a Virtual Network, helping to keep organized and segmented by different types of resources, like Databases, Front and Backend applications.&lt;/p>&lt;h4 name="fc79" id="fc79" class="graf graf--h4 graf-after--p">Resources that are part of the Virtual Machine life cycle&lt;/h4>&lt;p name="ce10" id="ce10" class="graf graf--p graf-after--h4">&lt;strong class="markup--strong markup--p-strong">Disks: &lt;/strong>Disks are used to store operating systems, applications, or data. Each VM created on Azure has at least one OS Disk, but it can have multiple.&lt;/p>&lt;p name="c3c0" id="c3c0" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Network Interface Card:&lt;/strong> Also known as NIC, a Network Interface Card is responsible for connecting the VM with the network that we saw earlier. Similar to disks, each VM must have at least one, but also multiple NICs are supported.&lt;/p>&lt;p name="e507" id="e507" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Public IP:&lt;/strong> A Public IP is the communication between the VM and the world. This resource is not mandatory, and in most cases inside a business context, it should be created very cautiously, to avoid any security risk. However, as it is a simple test and I don’t want to complicate it, we need the Public IP to be able to connect to our VM. It is connected to the Network Interface.&lt;/p>&lt;h3 name="e794" id="e794" class="graf graf--h3 graf-after--p">Terraform Script&lt;/h3>&lt;h4 name="85d6" id="85d6" class="graf graf--h4 graf-after--h3">Pre-requisites&lt;/h4>&lt;p name="6218" id="6218" class="graf graf--p graf-after--h4">Below is the section of Terraform that creates the pre-requisites. As I mentioned before, it is possible to use existing resources, however, you need to adapt the script to use them.&lt;/p>&lt;figure name="79a9" id="79a9" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/319c7c0acf168ec66b00ab4305c51701?file=pre-reqs.tf.js">&lt;/script>&lt;/figure>&lt;p name="5cca" id="5cca" class="graf graf--p graf-after--figure">In this script, we are creating the resource group, virtual network, and subnet.&lt;/p>&lt;h4 name="8e7e" id="8e7e" class="graf graf--h4 graf-after--p">Virtual Machine&lt;/h4>&lt;p name="7f58" id="7f58" class="graf graf--p graf-after--h4">Finally, this is the script to create the VM resources. Here we create first a Public IP, the Network Interface Card, and associate the PIP on it, and a VM. Note that the Terraform VM resource already abstracts the disk internally. It’s also interesting to highlight that the VM associates the NIC created before, creating a dependency, which Terraform will identify and create in the correct order.&lt;/p>&lt;figure name="f86d" id="f86d" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/319c7c0acf168ec66b00ab4305c51701?file=vm.tf.js">&lt;/script>&lt;/figure>&lt;p name="4f72" id="4f72" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Complete Script&lt;/strong>&lt;/p>&lt;p name="09ba" id="09ba" class="graf graf--p graf-after--p">Below is the complete script, including provider, variables, and outputs:&lt;/p>&lt;figure name="09b3" id="09b3" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/319c7c0acf168ec66b00ab4305c51701?file=complete-script.tf.js">&lt;/script>&lt;/figure>&lt;h3 name="76a0" id="76a0" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="51dc" id="51dc" class="graf graf--p graf-after--h3">Below it is the link to my GitHub repository where I am creating a library to have all references related to Terraform. I hope that this post despite being simple might be helpful! &lt;br>&lt;a href="https://github.com/wesleycamargo/terraform" data-href="https://github.com/wesleycamargo/terraform" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">wesleycamargo/terraform (github.com)&lt;/a>&lt;/p>&lt;figure name="1cd8" id="1cd8" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*0rM_F_9XoS3sP5GW.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*0rM_F_9XoS3sP5GW.png">&lt;/figure>&lt;h4 name="ce7e" id="ce7e" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="070e" id="070e" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/254c1cb6642b">&lt;time class="dt-published" datetime="2023-11-21T17:45:11.354Z">November 21, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/2023-12-06_don-t-run-out-of-credits-on-azure--5ed491bc117d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/2023-12-06_don-t-run-out-of-credits-on-azure--5ed491bc117d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Don’t run out of credits on Azure!&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Don’t run out of credits on Azure!&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you are distracted and forgetful like me, you probably already forgot an Azure Virtual Machine running without need and just figured it…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7dfd" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="0d95" id="0d95" class="graf graf--h3 graf--leading graf--title">Don’t run out of credits on Azure! How to shutdown Azure Virtual Machines automatically with Terraform&lt;/h3>&lt;p name="ac3d" id="ac3d" class="graf graf--p graf-after--h3">If you are distracted and forgetful like me, you probably already forgot an Azure Virtual Machine running without need and just figured it out when your Azure credits were gone. To avoid this, check a simple tip on how to solve this problem with Terraform.&lt;/p>&lt;figure name="596a" id="596a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*yQ4GvCZbwp2mH6sc" data-width="5184" data-height="3456" data-unsplash-photo-id="ulTMKa88rEM" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/0*yQ4GvCZbwp2mH6sc">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@tristangassert?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@tristangassert?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">Tristan Gassert&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="06b1" id="06b1" class="graf graf--p graf-after--figure">In my&lt;a href="https://medium.com/@camargo-wes/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b" data-href="https://medium.com/@camargo-wes/getting-started-with-azure-what-are-azure-virtual-machines-and-how-to-create-it-using-terraform-254c1cb6642b" class="markup--anchor markup--p-anchor" target="_blank"> previous post&lt;/a>, I have already shown how to create an Azure Virtual Machine using Terraform, now I’m adding this feature, which, for me, is very important and helps me to not spend all my Azure Credits in a forgotten VM 🙃.&lt;/p>&lt;h3 name="0d69" id="0d69" class="graf graf--h3 graf-after--p">What is Azure VM Auto-Shutdown?&lt;/h3>&lt;p name="96c2" id="96c2" class="graf graf--p graf-after--h3">Azure VM Auto-Shutdown is like setting a timer for your Azure VM. Auto-shutdown allows you to set a specific time so your Virtual Machine will turn off. This is a handful when you create VMs for tests, or even in development/QA environments, where you don’t need your VMs running at night when your team is not working.&lt;/p>&lt;h3 name="96cf" id="96cf" class="graf graf--h3 graf-after--p">Terraform resource for auto-shutdown of an Azure VM&lt;/h3>&lt;p name="2574" id="2574" class="graf graf--p graf-after--h3">To make it work, we will use the Terraform resource &lt;code class="markup--code markup--p-code">azurerm_dev_test_global_vm_shutdown_schedule&lt;/code>. This is part of the Azure &lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/dev_test_global_vm_shutdown_schedule" data-href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/dev_test_global_vm_shutdown_schedule" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Terraform provider&lt;/a>. The usage is quite simple, as we can see below:&lt;/p>&lt;figure name="efc5" id="efc5" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/319c7c0acf168ec66b00ab4305c51701?file=auto-shutdown.tf.js">&lt;/script>&lt;/figure>&lt;p name="cf39" id="cf39" class="graf graf--p graf-after--figure">The most important information required are the VM id, daily_recurrence_time, and timezone. Based on this information your VM will be shut down at the time you have defined.&lt;/p>&lt;h3 name="5ec2" id="5ec2" class="graf graf--h3 graf-after--p">Complete Terraform to create an Azure VM with auto-shutdown&lt;/h3>&lt;p name="2249" id="2249" class="graf graf--p graf-after--h3">To facilitate the understanding of how to integrate it in a real-life scenario, I have implemented the shutdown process in the following complete Terraform file:&lt;/p>&lt;figure name="6e69" id="6e69" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/319c7c0acf168ec66b00ab4305c51701?file=vm-autoshutdown.tf.js">&lt;/script>&lt;/figure>&lt;h3 name="9dc6" id="9dc6" class="graf graf--h3 graf-after--figure">Conclusion&lt;/h3>&lt;p name="7eb6" id="7eb6" class="graf graf--p graf-after--h3">Below it is the link to my GitHub repository where I am creating a library to have all references related to Terraform. I hope that this post despite being simple might be helpful!&lt;br>&lt;a href="https://github.com/wesleycamargo/terraform" data-href="https://github.com/wesleycamargo/terraform" class="markup--anchor markup--p-anchor" rel="noopener ugc nofollow noopener" target="_blank">wesleycamargo/terraform (github.com)&lt;/a>&lt;/p>&lt;figure name="1cd8" id="1cd8" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*0rM_F_9XoS3sP5GW.png" data-width="700" data-height="40" src="https://cdn-images-1.medium.com/max/800/0*0rM_F_9XoS3sP5GW.png">&lt;/figure>&lt;h4 name="ce7e" id="ce7e" class="graf graf--h4 graf-after--figure">👋 If you find this helpful, please click the clap 👏 button below a few times to show your support for the author 👇&lt;/h4>&lt;h4 name="070e" id="070e" class="graf graf--h4 graf-after--h4 graf--trailing">🚀&lt;a href="http://from.faun.to/r/8zxxd" data-href="http://from.faun.to/r/8zxxd" class="markup--anchor markup--h4-anchor" rel="noopener ugc nofollow noopener noopener noopener" target="_blank">Join FAUN Developer Community &amp;amp; Get Similar Stories in your Inbox Each Week&lt;/a>&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>By &lt;a href="https://medium.com/@camargo-wes" class="p-author h-card">Wesley Camargo&lt;/a> on &lt;a href="https://medium.com/p/5ed491bc117d">&lt;time class="dt-published" datetime="2023-12-06T18:01:04.288Z">December 6, 2023&lt;/time>&lt;/a>.&lt;/p>&lt;p>&lt;a href="https://medium.com/@camargo-wes/dont-run-out-of-credits-on-azure-5ed491bc117d" class="p-canonical">Canonical link&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_5-best-vs-code-extensions-for-devops-in-2022-69aa9c5b7935/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_5-best-vs-code-extensions-for-devops-in-2022-69aa9c5b7935/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>5 best vs code extensions for DevOps in 2022&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">5 best vs code extensions for DevOps in 2022&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Azure
Peacock
Rainbow
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f4ae" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="a049" id="a049" class="graf graf--p graf--leading">5 best vs code extensions for DevOps in 2022&lt;/p>&lt;p name="7859" id="7859" class="graf graf--p graf-after--p">Azure&lt;br>Peacock&lt;br>Rainbow&lt;/p>&lt;p name="aafa" id="aafa" class="graf graf--p graf-after--p">Terraform &lt;/p>&lt;p name="98c8" id="98c8" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/69aa9c5b7935">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_5-vs-code-tips-for-cloud-admins-to-put-your-productivity-on-the-next-level-e719294ab4a2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_5-vs-code-tips-for-cloud-admins-to-put-your-productivity-on-the-next-level-e719294ab4a2/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>5 VS Code tips for cloud admins to put your Productivity on the next level&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">5 VS Code tips for cloud admins to put your Productivity on the next level&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Autoformat your files on save
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="776e" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1f12" id="1f12" class="graf graf--h3 graf--leading graf--title">5 VS Code tips for cloud admins to put your Productivity on the next level&lt;/h3>&lt;p name="2889" id="2889" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="366b" id="366b" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h3 name="805f" id="805f" class="graf graf--h3 graf-after--p">Autoformat your files on save&lt;/h3>&lt;p name="065e" id="065e" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="88e8" id="88e8" class="graf graf--h3 graf-after--p">Integrated Terminal&lt;/h3>&lt;p name="2d32" id="2d32" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="78e9" id="78e9" class="graf graf--h3 graf-after--p">Debug your PowerShell scripts&lt;/h3>&lt;p name="3823" id="3823" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="905a" id="905a" class="graf graf--h3 graf-after--p">Improve your git log&lt;/h3>&lt;p name="69cc" id="69cc" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="22f9" id="22f9" class="graf graf--h3 graf-after--p">Live Share&lt;/h3>&lt;p name="e66c" id="e66c" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="a1a0" id="a1a0" class="graf graf--h3 graf--empty graf-after--p">&lt;br>&lt;/h3>&lt;p name="ffd8" id="ffd8" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/e719294ab4a2">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_5-vs-code-tips-to-put-your-productivity-on-next-level-54833c2e395c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_5-vs-code-tips-to-put-your-productivity-on-next-level-54833c2e395c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>5 vs code tips to put your Productivity on next level&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">5 vs code tips to put your Productivity on next level&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
PowerShell format on save
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="01e9" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="547b" id="547b" class="graf graf--p graf--empty graf--leading">&lt;br>&lt;/p>&lt;p name="821b" id="821b" class="graf graf--p graf-after--p">5 vs code tips to put your Productivity on next level&lt;/p>&lt;h3 name="9802" id="9802" class="graf graf--h3 graf-after--p">PowerShell format on save&lt;/h3>&lt;p name="2932" id="2932" class="graf graf--p graf-after--h3">&lt;br>&lt;br>If you are like me and like to have consistency in formating your code, this is definitely a must to have configuration.&lt;/p>&lt;p name="191e" id="191e" class="graf graf--p graf-after--p">Although vs code already have a formatter shortcut, which is alt + shift + f, you can configure to format every time you gave your file.&lt;/p>&lt;p name="b282" id="b282" class="graf graf--p graf-after--p">To configure it press F1, type settings.json and add the following section&lt;br>&lt;br>&lt;/p>&lt;p name="6f8f" id="6f8f" class="graf graf--p graf-after--p">It’s also possible to choose which changes will be formatted, the option … is particularly useful if you are working on legacy code and don’t want to change a big file at once.&lt;br>&lt;br>&lt;/p>&lt;p name="48c4" id="48c4" class="graf graf--p graf-after--p graf--trailing">This configuration applies to most part of supported languages.&lt;br>&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="b23b" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2fee" id="2fee" class="graf graf--h3 graf--leading">Terraform auto format&lt;/h3>&lt;p name="c829" id="c829" class="graf graf--p graf-after--h3">The tip above works for must part of languages, but not for terraform.&lt;/p>&lt;p name="dbf9" id="dbf9" class="graf graf--p graf-after--p">To configure once again press F1, type settings.json and add the section below&lt;br>&lt;br>&lt;/p>&lt;p name="ba1e" id="ba1e" class="graf graf--p graf-after--p">It will work for tf files but not for variables.&lt;/p>&lt;p name="be5f" id="be5f" class="graf graf--p graf-after--p graf--trailing">To configure it for variable files, add this section&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="158c" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5c83" id="5c83" class="graf graf--h3 graf--leading">Git lg&lt;br>&lt;br>&lt;/h3>&lt;h4 name="8c46" id="8c46" class="graf graf--h4 graf-after--h3">Git lg&lt;/h4>&lt;p name="8079" id="8079" class="graf graf--p graf--empty graf-after--h4 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="8940" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="ab56" id="ab56" class="graf graf--p graf--empty graf--leading">&lt;br>&lt;/p>&lt;h3 name="59f7" id="59f7" class="graf graf--h3 graf-after--p graf--trailing">Git commit/push&lt;br>&lt;br>&lt;br>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>&lt;section name="9b70" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="165b" id="165b" class="graf graf--h3 graf--leading graf--trailing">PowerShell debug&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/54833c2e395c">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_7-ways-to-create-resources-on-azure-f968930bd79f/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_7-ways-to-create-resources-on-azure-f968930bd79f/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>7 ways to create resources on Azure&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">7 ways to create resources on Azure&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Portal
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5e72" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4a41" id="4a41" class="graf graf--h3 graf--leading graf--title">7 ways to create resources on Azure&lt;/h3>&lt;h3 name="dc22" id="dc22" class="graf graf--h3 graf-after--h3">Portal&lt;/h3>&lt;h3 name="baff" id="baff" class="graf graf--h3 graf-after--h3">Azure CLI&lt;/h3>&lt;h3 name="69cd" id="69cd" class="graf graf--h3 graf-after--h3">Azure Powershell&lt;/h3>&lt;h3 name="02ff" id="02ff" class="graf graf--h3 graf-after--h3">Azure API’s&lt;/h3>&lt;h3 name="a868" id="a868" class="graf graf--h3 graf-after--h3">Bicep&lt;/h3>&lt;p name="a7f8" id="a7f8" class="graf graf--p graf-after--h3">&lt;a href="https://camargo-wes.medium.com/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" data-href="https://camargo-wes.medium.com/creating-infrastructure-as-code-for-azure-with-azure-bicep-step-by-step-58f03cee75e1" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Creating Infrastructure as Code for Azure with Azure Bicep step by step | by Wesley Camargo | Mar, 2022 | Medium&lt;/a>&lt;/p>&lt;h3 name="6ac3" id="6ac3" class="graf graf--h3 graf-after--p">Terraform&lt;/h3>&lt;h3 name="4a77" id="4a77" class="graf graf--h3 graf-after--h3">Pulumi&lt;/h3>&lt;p name="eff1" id="eff1" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="91c5" id="91c5" class="graf graf--h3 graf-after--p">Bonus&lt;/h3>&lt;p name="fbb3" id="fbb3" class="graf graf--p graf-after--h3">Other alternative tools&lt;/p>&lt;p name="bcbf" id="bcbf" class="graf graf--p graf-after--p graf--trailing">Open shift&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/f968930bd79f">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_8-reasons-why-you-should-consider-bicep-instead-of-terraform-in-azure-9220ca213107/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_8-reasons-why-you-should-consider-bicep-instead-of-terraform-in-azure-9220ca213107/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>8 reasons why you should consider Bicep instead of Terraform in Azure&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">8 reasons why you should consider Bicep instead of Terraform in Azure&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Resource validation is not complete
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="9f4e" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="3c8e" id="3c8e" class="graf graf--h3 graf--leading graf--title">8 reasons why you should consider Bicep instead of Terraform in Azure&lt;/h3>&lt;p name="a431" id="a431" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="a159" id="a159" class="graf graf--h3 graf-after--p">Resource validation is not complete&lt;/h3>&lt;h4 name="39b8" id="39b8" class="graf graf--h4 graf-after--h3">Doesn’t check global unique resources&lt;/h4>&lt;h4 name="4a9f" id="4a9f" class="graf graf--h4 graf-after--h4">CosmosDB SQL Server throughput &lt;/h4>&lt;p name="a280" id="a280" class="graf graf--p graf-after--h4">Terraform doesn’t check during plan if throughput property is valid, it breaks during apply&lt;/p>&lt;p name="7c05" id="7c05" class="graf graf--p graf-after--p">Check if it happens also with bicep&lt;/p>&lt;h3 name="02fe" id="02fe" class="graf graf--h3 graf-after--p">No deployment information into Azure&lt;/h3>&lt;figure name="aad3" id="aad3" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="1*oL8fi6608BfMyB428-AJHw.png" data-width="1132" data-height="479" src="https://cdn-images-1.medium.com/max/800/1*oL8fi6608BfMyB428-AJHw.png">&lt;/figure>&lt;h3 name="3fbb" id="3fbb" class="graf graf--h3 graf-after--figure">You need to control the state of your resources&lt;/h3>&lt;h3 name="ff6c" id="ff6c" class="graf graf--h3 graf-after--h3">Wait for providers for new resources&lt;/h3>&lt;h3 name="a214" id="a214" class="graf graf--h3 graf-after--h3">Terraform is multi-cloud, but not like you are thinking&lt;/h3>&lt;h3 name="1bc8" id="1bc8" class="graf graf--h3 graf-after--h3">Different property names&lt;/h3>&lt;h3 name="b35a" id="b35a" class="graf graf--h3 graf-after--h3">Use of Variables inside modules — needs to map as local&lt;/h3>&lt;h3 name="4519" id="4519" class="graf graf--h3 graf-after--h3">Validate in an empty directory&lt;/h3>&lt;p name="1d18" id="1d18" class="graf graf--p graf-after--h3 graf--trailing">&lt;a href="https://github.com/hashicorp/terraform/issues/23731" data-href="https://github.com/hashicorp/terraform/issues/23731" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">terraform validate returns success in a directory with no tf files · Issue #23731 · hashicorp/terraform (github.com)&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/9220ca213107">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_associating-an-azure-devops-service-connection-manually-bee5ef8c5841/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_associating-an-azure-devops-service-connection-manually-bee5ef8c5841/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Associating an Azure DevOps service connection manually&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Associating an Azure DevOps service connection manually&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Open App Registration in your Active Directory menu and click on New registration. Then name your service connection and click in Register
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="3907" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1295" id="1295" class="graf graf--h3 graf--leading graf--title">Associating an Azure DevOps service connection manually&lt;/h3>&lt;p name="bf9c" id="bf9c" class="graf graf--p graf-after--h3">Open App Registration in your Active Directory menu and click on &lt;em class="markup--em markup--p-em">New registration. &lt;/em>Then name your service connection and click in&lt;em class="markup--em markup--p-em"> Register&lt;/em>&lt;/p>&lt;figure name="c617" id="c617" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*264eiN526CpU6lgHOViTFg.png" data-width="572" data-height="722" src="https://cdn-images-1.medium.com/max/800/1*264eiN526CpU6lgHOViTFg.png">&lt;/figure>&lt;p name="e4f5" id="e4f5" class="graf graf--p graf-after--figure">After creation, click on &lt;em class="markup--em markup--p-em">Certificates &amp;amp; secrets &lt;/em>and &lt;em class="markup--em markup--p-em">New client secret&lt;/em>&lt;/p>&lt;figure name="8dbf" id="8dbf" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*RKOUZWPBqgWtHCXq-i8kTw.png" data-width="781" data-height="557" src="https://cdn-images-1.medium.com/max/800/1*RKOUZWPBqgWtHCXq-i8kTw.png">&lt;/figure>&lt;p name="f6f8" id="f6f8" class="graf graf--p graf-after--figure">Give a name to your secret and click in &lt;em class="markup--em markup--p-em">add:&lt;/em>&lt;/p>&lt;figure name="07c5" id="07c5" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*-TrQAmbMz4GwVGLnBix94w.png" data-width="321" data-height="305" src="https://cdn-images-1.medium.com/max/800/1*-TrQAmbMz4GwVGLnBix94w.png">&lt;/figure>&lt;p name="8c10" id="8c10" class="graf graf--p graf-after--figure">Copy the value generated. It will not be available for copy again. If you need it later, it will be necessary to generate a new secret.&lt;/p>&lt;figure name="e22d" id="e22d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Xa4rqtYdCN0j1UBgeuA30Q.png" data-width="1037" data-height="206" src="https://cdn-images-1.medium.com/max/800/1*Xa4rqtYdCN0j1UBgeuA30Q.png">&lt;/figure>&lt;p name="c0df" id="c0df" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="b628" id="b628" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*f3LGOLZHyCZsyN_qj2ul2g.png" data-width="395" data-height="294" src="https://cdn-images-1.medium.com/max/800/1*f3LGOLZHyCZsyN_qj2ul2g.png">&lt;/figure>&lt;p name="b19b" id="b19b" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/bee5ef8c5841">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_az-devops-pipelines-access-tokens-5382da372b82/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_az-devops-pipelines-access-tokens-5382da372b82/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Az Devops Pipelines Access Tokens&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Az Devops Pipelines Access Tokens&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Understand job access tokens — Azure Pipelines | Microsoft Docs
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e901" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="a99b" id="a99b" class="graf graf--h3 graf--leading graf--title">Az Devops Pipelines Access Tokens&lt;/h3>&lt;p name="f847" id="f847" class="graf graf--p graf-after--h3 graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/access-tokens?view=azure-devops&amp;amp;tabs=yaml#job-authorization-scope" data-href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/access-tokens?view=azure-devops&amp;amp;tabs=yaml#job-authorization-scope" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Understand job access tokens — Azure Pipelines | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/5382da372b82">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-dev-box-63934248a448/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-dev-box-63934248a448/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure Dev Box&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure Dev Box&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Announcing Microsoft Dev Box preview | Azure Blog and Updates | Microsoft Azure
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b0ac" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1665" id="1665" class="graf graf--h3 graf--leading graf--title">Azure Dev Box&lt;/h3>&lt;p name="eda9" id="eda9" class="graf graf--p graf-after--h3 graf--trailing">&lt;a href="https://azure.microsoft.com/en-us/blog/announcing-microsoft-dev-box-preview/" data-href="https://azure.microsoft.com/en-us/blog/announcing-microsoft-dev-box-preview/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Announcing Microsoft Dev Box preview | Azure Blog and Updates | Microsoft Azure&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/63934248a448">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-android-cicd-9d213de416e8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-android-cicd-9d213de416e8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure DevOps Android CICD&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure DevOps Android CICD&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Tests
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5caa" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2e22" id="2e22" class="graf graf--h3 graf--leading graf--title">Azure DevOps Android CICD&lt;/h3>&lt;p name="8605" id="8605" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="88b4" id="88b4" class="graf graf--h3 graf-after--p">Tests&lt;/h3>&lt;h4 name="f7bd" id="f7bd" class="graf graf--h4 graf-after--h3">Appium&lt;/h4>&lt;figure name="f81d" id="f81d" class="graf graf--figure graf-after--h4">&lt;img class="graf-image" data-image-id="1*ebrV3YioSSL3ilyaDAhZtQ.png" data-width="864" data-height="555" src="https://cdn-images-1.medium.com/max/800/1*ebrV3YioSSL3ilyaDAhZtQ.png">&lt;/figure>&lt;p name="f8c2" id="f8c2" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="10ec" id="10ec" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*wx_3itlkq-WRotVTAxRHMA.png" data-width="1873" data-height="1049" src="https://cdn-images-1.medium.com/max/800/1*wx_3itlkq-WRotVTAxRHMA.png">&lt;/figure>&lt;figure name="0bf0" id="0bf0" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*GQevuDqM0LePmOqLiKTwCg.png" data-width="1873" data-height="1049" src="https://cdn-images-1.medium.com/max/800/1*GQevuDqM0LePmOqLiKTwCg.png">&lt;/figure>&lt;figure name="f685" id="f685" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*dd_F1QzBF2TU-wA5ObNmSQ.png" data-width="490" data-height="642" src="https://cdn-images-1.medium.com/max/800/1*dd_F1QzBF2TU-wA5ObNmSQ.png">&lt;/figure>&lt;p name="b803" id="b803" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;p name="76e6" id="76e6" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="1f0e" id="1f0e" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://appium.io/" data-href="https://appium.io/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Appium: Mobile App Automation Made Awesome.&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/9d213de416e8">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-for-beginners-a3eb36bd40f1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-for-beginners-a3eb36bd40f1/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure DevOps for beginners&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure DevOps for beginners&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Running PowerShell
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="ca67" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="826c" id="826c" class="graf graf--h3 graf--leading graf--title">Azure DevOps for beginners&lt;/h3>&lt;p name="f36e" id="f36e" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="d83d" id="d83d" class="graf graf--h3 graf-after--p">Running PowerShell&lt;/h3>&lt;h3 name="9548" id="9548" class="graf graf--h3 graf-after--h3">Azure PowerShell &amp;amp; Azure CLI&lt;/h3>&lt;h3 name="d465" id="d465" class="graf graf--h3 graf-after--h3">Creating PowerShell Modules&lt;/h3>&lt;h3 name="a932" id="a932" class="graf graf--h3 graf-after--h3">Publishing PowerShell Modules to Azure Artifacts&lt;/h3>&lt;h3 name="9258" id="9258" class="graf graf--h3 graf-after--h3 graf--trailing">Consuming PowerShell Modules from Azure Artifacts&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/a3eb36bd40f1">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-remote-repositories-in-a-nutshell---how-to-create-and-push-your-code-to-git-219d3e1df71/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-remote-repositories-in-a-nutshell---how-to-create-and-push-your-code-to-git-219d3e1df71/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure DevOps remote repositories in a nutshell — How to create and push your code to git&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure DevOps remote repositories in a nutshell — How to create and push your code to git&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
When we work on a project is fairly common that multiple people can be working and changing the same repository as you. Check on this post…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="596b" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="8257" id="8257" class="graf graf--p graf--empty graf--leading">&lt;br>&lt;/p>&lt;h3 name="4170" id="4170" class="graf graf--h3 graf-after--p graf--title">Azure DevOps remote repositories in a nutshell: How to create and push your code to git&lt;/h3>&lt;p name="eef1" id="eef1" class="graf graf--p graf-after--h3">When we work on a project is fairly common that multiple people can be working and changing the same repository as you. Check on this post how to create remote repositories on Azure DevOps, and how to link them with your local project.&lt;/p>&lt;figure name="5669" id="5669" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*YL7tHWIuVT_ffBYRarlxCw.jpeg" data-width="4032" data-height="3024" data-is-featured="true" src="https://cdn-images-1.medium.com/max/800/1*YL7tHWIuVT_ffBYRarlxCw.jpeg">&lt;figcaption class="imageCaption">&lt;a href="https://creativecommons.org/licenses/by-sa/4.0" data-href="https://creativecommons.org/licenses/by-sa/4.0" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Ladsgroup, CC BY-SA 4.0&lt;/a> , via Wikimedia Commons&lt;/figcaption>&lt;/figure>&lt;h3 name="962c" id="962c" class="graf graf--h3 graf-after--figure">Creating an Azure DevOps repository&lt;/h3>&lt;p name="0ac6" id="0ac6" class="graf graf--p graf-after--h3">To create the repository, it is necessary to go to the Repos area on Azure DevOps, clicking on the left menu icon. Now on the top of the screen, click on the git menu and then “&lt;strong class="markup--strong markup--p-strong">New repository”:&lt;/strong>&lt;/p>&lt;figure name="50ea" id="50ea" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*IgurkjFRmECkJFTyoqDoKQ.png" data-width="854" data-height="378" src="https://cdn-images-1.medium.com/max/800/1*IgurkjFRmECkJFTyoqDoKQ.png">&lt;/figure>&lt;p name="28a4" id="28a4" class="graf graf--p graf-after--figure">On the popup windows, insert the name of your repository. In our case, we will use an existing repository created locally on this post, it is not interesting to add the readme or the gitignore. If you are using it for a brand new repository with no local yet, add them both of them might be a good idea 🙂.&lt;/p>&lt;figure name="39c4" id="39c4" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*iXbL6qmq3nS_cIBDO-wLbg.png" data-width="483" data-height="506" src="https://cdn-images-1.medium.com/max/800/1*iXbL6qmq3nS_cIBDO-wLbg.png">&lt;/figure>&lt;h3 name="f059" id="f059" class="graf graf--h3 graf-after--figure">Pushing local repository to Azure DevOps&lt;/h3>&lt;p name="15a7" id="15a7" class="graf graf--p graf-after--h3">As a decentralized version control system, git has the possibility to work locally or remotely. In &lt;a href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" data-href="https://camargo-wes.medium.com/git-basic-commands-in-a-nutshell-fc911c9f350a" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>, I showed the basic git commands and how to initialize and commit your files into local git.&lt;/p>&lt;p name="b954" id="b954" class="graf graf--p graf-after--p">To take advantage of the collaboration capacity that git has, let’s send our local repository to a remote, so other people can be able to access it.&lt;/p>&lt;p name="6c5e" id="6c5e" class="graf graf--p graf-after--p">There are two ways to work with a remote repository, let&amp;#39;s explore them:&lt;/p>&lt;h4 name="191b" id="191b" class="graf graf--h4 graf-after--p">Pushing an existing repository to Azure DevOps&lt;/h4>&lt;p name="6648" id="6648" class="graf graf--p graf-after--h4">As mentioned above, we will use an already created local repository, so instead of cloning, we will add a new remote to this repository. Below the command will add the remote repo and push your commits to that.&lt;/p>&lt;figure name="d784" id="d784" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/cf3c0809a8d51b19e65a6a6339ea29f8?file=addremote.ps1.js">&lt;/script>&lt;/figure>&lt;p name="2dba" id="2dba" class="graf graf--p graf-after--figure">Azure DevOps make it easy and create that for you, you can simply copy the command generated and run it on your terminal:&lt;/p>&lt;figure name="0e8c" id="0e8c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*odJfLGjE_nCGDteSKpnG-A.png" data-width="989" data-height="805" src="https://cdn-images-1.medium.com/max/800/1*odJfLGjE_nCGDteSKpnG-A.png">&lt;/figure>&lt;figure name="4681" id="4681" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*-Cby3Dv-Lw9dYXf0MHZDlQ.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*-Cby3Dv-Lw9dYXf0MHZDlQ.png">&lt;/figure>&lt;p name="3aad" id="3aad" class="graf graf--p graf-after--figure">We can check the remote repositories with the command &lt;code class="markup--code markup--p-code">git remote -v&lt;/code> :&lt;/p>&lt;figure name="cdab" id="cdab" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*xIZUXxPBpgVEx8j-uzWDbQ.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*xIZUXxPBpgVEx8j-uzWDbQ.png">&lt;/figure>&lt;h4 name="e6bd" id="e6bd" class="graf graf--h4 graf-after--figure">Cloning the remote repository locally&lt;/h4>&lt;p name="17b0" id="17b0" class="graf graf--p graf-after--h4">It is also possible to clone the remote existing repo to your local computer. The command &lt;code class="markup--code markup--p-code">git clone &amp;lt;your repository url&amp;gt;&lt;/code> does that, and it is very straightforward. In our example, we are cloning the same repository that we pushed in the step above:&lt;/p>&lt;figure name="fdd3" id="fdd3" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*bBXgszV9JV1UrgAo7NYIrw.png" data-width="1167" data-height="768" src="https://cdn-images-1.medium.com/max/800/1*bBXgszV9JV1UrgAo7NYIrw.png">&lt;/figure>&lt;h3 name="b0cb" id="b0cb" class="graf graf--h3 graf-after--figure">Key takeaways&lt;/h3>&lt;p name="791e" id="791e" class="graf graf--p graf-after--h3 graf--trailing">Although one of the advantages of git is being a decentralized version control system, knowing how to work with remote repositories is crucial for anyone that uses git. It’s an easy way to work collaboratively and keep the continuous integration of your applications.&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/219d3e1df71">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-to-github-journey-6ceda1c29dd0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-devops-to-github-journey-6ceda1c29dd0/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure DevOps to GitHub Journey&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure DevOps to GitHub Journey&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
General comparison
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="7ec7" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f9b8" id="f9b8" class="graf graf--h3 graf--leading graf--title">Azure DevOps to GitHub Journey&lt;/h3>&lt;p name="d09f" id="d09f" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="d5ef" id="d5ef" class="graf graf--h3 graf-after--p">General comparison&lt;/h3>&lt;p name="1fc2" id="1fc2" class="graf graf--p graf-after--h3">Functionalities&lt;/p>&lt;p name="f164" id="f164" class="graf graf--p graf-after--p">New versions&lt;/p>&lt;p name="4085" id="4085" class="graf graf--p graf-after--p">Price&lt;/p>&lt;p name="5e7b" id="5e7b" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/6ceda1c29dd0">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-key-vault-for-beginners--5-ways-to-create-an-azure-key-vault-in-less-than-1-minute-91409c916728/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-key-vault-for-beginners--5-ways-to-create-an-azure-key-vault-in-less-than-1-minute-91409c916728/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure Key Vault for Beginners —5 ways to create an Azure Key Vault in less than 1 minute&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure Key Vault for Beginners —5 ways to create an Azure Key Vault in less than 1 minute&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
1- The easy, but not recommended way — Create an Azure Key Vault by Portal
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="bb78" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="faf2" id="faf2" class="graf graf--h3 graf--leading graf--title">Azure Key Vault for Beginners —5 ways to create an Azure Key Vault in less than 1 minute&lt;/h3>&lt;p name="1436" id="1436" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="a05b" id="a05b" class="graf graf--h3 graf-after--p">1- The easy, but not recommended way — Create an Azure Key Vault by Portal&lt;/h3>&lt;h3 name="264c" id="264c" class="graf graf--h3 graf-after--h3">2- The acceptable way — Using Scripts&lt;/h3>&lt;h4 name="5c57" id="5c57" class="graf graf--h4 graf-after--h3">Azure CLI &lt;/h4>&lt;figure name="8102" id="8102" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/ed715f64f71f30944ebe452367faab40?file=azure-cli.ps1.js">&lt;/script>&lt;/figure>&lt;figure name="f520" id="f520" class="graf graf--figure graf--iframe graf-after--figure">&lt;iframe src="https://www.youtube.com/embed/NiaTRuELV_o?feature=oembed" width="700" height="393" frameborder="0" scrolling="no">&lt;/iframe>&lt;/figure>&lt;h4 name="109c" id="109c" class="graf graf--h4 graf-after--figure">Azure PowerShell&lt;/h4>&lt;h3 name="f06c" id="f06c" class="graf graf--h3 graf-after--h4">How to create an Azure Key Vault with Bicep&lt;/h3>&lt;h3 name="e205" id="e205" class="graf graf--h3 graf-after--h3 graf--trailing">How to create an Azure Key Vault with Terraform&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/91409c916728">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_azure-landing-zone-fundamentals--a-guide-to-understanding-the-building-blocks-of-azure-58e7ec768f8e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_azure-landing-zone-fundamentals--a-guide-to-understanding-the-building-blocks-of-azure-58e7ec768f8e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Azure Landing Zone Fundamentals: A Guide to Understanding the Building Blocks of Azure&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Azure Landing Zone Fundamentals: A Guide to Understanding the Building Blocks of Azure&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
With the cloud infrastructure landscape rapidly changing, the implementation of Landing Zones is becoming a crucial aspect of cloud…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="15d7" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5221" id="5221" class="graf graf--h3 graf--leading graf--title">Azure Landing Zone Fundamentals: A Guide to Understanding the Building Blocks of Azure&lt;/h3>&lt;figure name="440b" id="440b" class="graf graf--figure graf-after--h3">&lt;img class="graf-image" data-image-id="0*z0nVJG-R4dKvqap4" data-width="5046" data-height="3364" data-unsplash-photo-id="UYiesSO4FiM" src="https://cdn-images-1.medium.com/max/800/0*z0nVJG-R4dKvqap4">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/de/@zhpix?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/de/@zhpix?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">Pascal Meier&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="a64f" id="a64f" class="graf graf--p graf-after--figure">With the cloud infrastructure landscape rapidly changing, the implementation of Landing Zones is becoming a crucial aspect of cloud infrastructure and increasingly important for organizations looking to maximize their cloud investments. In this post, we will understand the basics of Landing Zones in Azure, what they are, their purpose, and the significance they hold for modern businesses.&lt;/p>&lt;h3 name="4c40" id="4c40" class="graf graf--h3 graf-after--p">Introduction to Azure Landing Zones and their importance for cloud infrastructure&lt;/h3>&lt;h4 name="9157" id="9157" class="graf graf--h4 graf-after--h3">Platform Landing Zones&lt;/h4>&lt;p name="aab6" id="aab6" class="graf graf--p graf-after--h4">When a company decides to start using a new cloud platform, there are many aspects that need to be considered in the earlier stages. If not enough attention is paid to them, they might be a stone in the shoe in the future, bringing numerous problems and risks related to Security, Governance, Costs, and Scalability.&lt;/p>&lt;p name="481b" id="481b" class="graf graf--p graf-after--p">To solve these risks, mostly if not Cloud Providers have guides on how to prepare the fundamental resources that all future workloads and applications will run on top of, for instance, Networks, Users and Identities, Governance, Management, and Security. &lt;/p>&lt;p name="0ba5" id="0ba5" class="graf graf--p graf-after--p">These fundamental resources are then put in place, so we can “Land” our applications on top of it, giving the name “Platform Landing Zone”, enabling modernization and innovation at the enterprise scale supporting all necessary resources to keep client applications running.&lt;/p>&lt;figure name="f89c" id="f89c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*OfDaVcIV3597nUXb.png" data-width="941" data-height="564" src="https://cdn-images-1.medium.com/max/800/0*OfDaVcIV3597nUXb.png">&lt;figcaption class="imageCaption">Platform Landing Zone — &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/operating-model/compare?WT.mc_id=DT-MVP-5004039#centralized-operations" data-href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/operating-model/compare?WT.mc_id=DT-MVP-5004039#centralized-operations" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Learn&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h4 name="6dd9" id="6dd9" class="graf graf--h4 graf-after--figure">Application Landing Zones&lt;/h4>&lt;h4 name="42c5" id="42c5" class="graf graf--h4 graf--empty graf-after--h4">&lt;br>&lt;/h4>&lt;h4 name="eec4" id="eec4" class="graf graf--h4 graf--empty graf-after--h4">&lt;br>&lt;/h4>&lt;p name="9422" id="9422" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h3 name="23bf" id="23bf" class="graf graf--h3 graf-after--p">Setting up governance and compliance with Azure Landing Zones&lt;/h3>&lt;h3 name="7e98" id="7e98" class="graf graf--h3 graf-after--h3">Implementing security and network isolation with Azure Landing Zones&lt;/h3>&lt;h3 name="d257" id="d257" class="graf graf--h3 graf-after--h3">Automating deployment and scaling with Azure Landing Zones&lt;/h3>&lt;h3 name="af7c" id="af7c" class="graf graf--h3 graf-after--h3">Best practices for using Azure Landing Zones in your cloud deployment&lt;/h3>&lt;h3 name="6f42" id="6f42" class="graf graf--h3 graf-after--h3">Real-world examples of businesses successfully using Azure Landing Zones&lt;/h3>&lt;h3 name="d193" id="d193" class="graf graf--h3 graf-after--h3 graf--trailing">Conclusion and next steps for optimizing your Azure Landing Zone deployment and realizing its benefits.&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/58e7ec768f8e">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_config-development-environment-ddcb99152f9e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_config-development-environment-ddcb99152f9e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Config development environment&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Config development environment&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Windows Terminal Powerline Setup | Microsoft Docs
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="c9fb" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2282" id="2282" class="graf graf--h3 graf--leading graf--title">Config development environment&lt;/h3>&lt;p name="211c" id="211c" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="8148" id="8148" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup" data-href="https://docs.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Windows Terminal Powerline Setup | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="b6ea" id="b6ea" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="d617" id="d617" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">Import-Module posh-git&lt;/code>&lt;/p>&lt;p name="6acf" id="6acf" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">Import-Module oh-my-posh&lt;/code>&lt;/p>&lt;p name="2be0" id="2be0" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">Set-PoshPrompt -Theme paradox&lt;/code> -&amp;gt; replace by &lt;code class="markup--code markup--p-code">Set-Theme paradox&lt;/code>&lt;/p>&lt;p name="d67e" id="d67e" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="cfab" id="cfab" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/windows/terminal/get-started#settings-json-file" data-href="https://docs.microsoft.com/en-us/windows/terminal/get-started#settings-json-file" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Windows Terminal installation | Microsoft Docs&lt;/a>&lt;/p>&lt;figure name="9e2a" id="9e2a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*Ty40DGxn-LmODBcb8TpxOg.png" data-width="976" data-height="493" src="https://cdn-images-1.medium.com/max/800/1*Ty40DGxn-LmODBcb8TpxOg.png">&lt;/figure>&lt;p name="2be0" id="2be0" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/ddcb99152f9e">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_configuring-aks-3683d72ea4ae/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_configuring-aks-3683d72ea4ae/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Configuring AKS&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Configuring AKS&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Terminology
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="95bb" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="338f" id="338f" class="graf graf--h3 graf--leading graf--title">Configuring AKS&lt;/h3>&lt;p name="151c" id="151c" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="12ce" id="12ce" class="graf graf--h3 graf-after--p">Terminology&lt;/h3>&lt;ol class="postList">&lt;li name="56cf" id="56cf" class="graf graf--li graf-after--h3">Container - is a package with everything necessary to run an application. the smaller unit in the AKS environment,&lt;/li>&lt;li name="f933" id="f933" class="graf graf--li graf-after--li">Pod — is an instance of an application. It can have one or more containers&lt;/li>&lt;li name="652c" id="652c" class="graf graf--li graf-after--li">Deployment — it has one or more identical pods&lt;/li>&lt;li name="128d" id="128d" class="graf graf--li graf-after--li">Nodes— VMs running containerized applications&lt;/li>&lt;li name="0177" id="0177" class="graf graf--li graf-after--li">Pool — Groups of nodes with the same configuration&lt;/li>&lt;/ol>&lt;h3 name="f587" id="f587" class="graf graf--h3 graf-after--li">AKS Cluster architecture&lt;/h3>&lt;h4 name="7df2" id="7df2" class="graf graf--h4 graf-after--h3">AKS Clusters&lt;/h4>&lt;p name="a77e" id="a77e" class="graf graf--p graf-after--h4">Nodes are VMs running containerized applications, and are divided into two types in AKS:&lt;/p>&lt;ul class="postList">&lt;li name="13a6" id="13a6" class="graf graf--li graf-after--p">&lt;strong class="markup--strong markup--li-strong">Azure-managed nodes &lt;/strong>— This is a managed node abstracted by Azure, providing the core Kubernetes services and orchestration of applications. &lt;/li>&lt;li name="a406" id="a406" class="graf graf--li graf-after--li">&lt;strong class="markup--strong markup--li-strong">Customer-managed nodes&lt;/strong> — These clusters are where the customer applications run, being administered by him.&lt;/li>&lt;/ul>&lt;h4 name="0020" id="0020" class="graf graf--h4 graf-after--li">AKS Nodes architecture&lt;/h4>&lt;p name="8947" id="8947" class="graf graf--p graf-after--h4">Nodes are virtual machines that run applications. &lt;/p>&lt;p name="ba9a" id="ba9a" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/training/modules/configure-azure-kubernetes-service/3-kubernetes-clusters" data-href="https://learn.microsoft.com/en-us/training/modules/configure-azure-kubernetes-service/3-kubernetes-clusters" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Explore the AKS cluster and node architecture — Training | Microsoft Learn&lt;/a>&lt;/p>&lt;h3 name="e3bf" id="e3bf" class="graf graf--h3 graf-after--p">AKS Networking&lt;/h3>&lt;p name="94ed" id="94ed" class="graf graf--p graf-after--h3 graf--trailing">To enable communication between applications, Kubernetes abstracts a vNet layer. The nodes are connected to a vNet a&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/3683d72ea4ae">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_consuming-variables-in-azure-devops-yaml-templates-d72b8a668173/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_consuming-variables-in-azure-devops-yaml-templates-d72b8a668173/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Consuming variables in Azure DevOps YAML Templates&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Consuming variables in Azure DevOps YAML Templates&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Variable scopes
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="bf52" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="e093" id="e093" class="graf graf--h3 graf--leading graf--title">Consuming variables in Azure DevOps YAML Templates&lt;/h3>&lt;p name="813b" id="813b" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="afa2" id="afa2" class="graf graf--h3 graf-after--p">Variable scopes&lt;/h3>&lt;p name="a6d9" id="a6d9" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="c1f2" id="c1f2" class="graf graf--h3 graf-after--p">Reading variables in Azure DevOps YAML Templates&lt;/h3>&lt;h4 name="5a58" id="5a58" class="graf graf--h4 graf-after--h3">Macro syntax&lt;/h4>&lt;h4 name="1916" id="1916" class="graf graf--h4 graf-after--h4">Template expression syntax&lt;/h4>&lt;h4 name="879c" id="879c" class="graf graf--h4 graf-after--h4">Runtime expression syntax&lt;/h4>&lt;h4 name="306f" id="306f" class="graf graf--h4 graf-after--h4">Environment variables&lt;/h4>&lt;p name="f635" id="f635" class="graf graf--p graf--empty graf-after--h4 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/d72b8a668173">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_containers-without-docker-desktop-wsl2-windows-11-aa662a0c9b1d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_containers-without-docker-desktop-wsl2-windows-11-aa662a0c9b1d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>containers without docker desktop wsl2 windows 11&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">containers without docker desktop wsl2 windows 11&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Install Docker in WSL 2 without Docker Desktop — Nick Janetakis
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d37a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="584b" id="584b" class="graf graf--h3 graf--leading graf--title">containers without docker desktop wsl2 windows 11&lt;/h3>&lt;p name="59dd" id="59dd" class="graf graf--p graf-after--h3">&lt;a href="https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop" data-href="https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Install Docker in WSL 2 without Docker Desktop — Nick Janetakis&lt;/a>&lt;/p>&lt;p name="96e2" id="96e2" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">curl: (6) Could not resolve host: get.docker.com&lt;/strong>&lt;/p>&lt;figure name="9cd3" id="9cd3" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*aEN4ctYnnKXPxJT_xnlLUg.png" data-width="975" data-height="105" src="https://cdn-images-1.medium.com/max/800/1*aEN4ctYnnKXPxJT_xnlLUg.png">&lt;/figure>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="6751" id="6751" class="graf graf--pre graf-after--figure graf--preV2">&lt;span class="pre--content">sudo nano /etc/resolv.conf&lt;/span>&lt;/pre>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="9431" id="9431" class="graf graf--pre graf-after--pre graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-comment"># nameserver 172.26.144.1&lt;/span>&lt;br />nameserver 8.8.8.8&lt;/span>&lt;/pre>&lt;p name="9e5b" id="9e5b" class="graf graf--p graf-after--pre">&lt;strong class="markup--strong markup--p-strong">Signatures couldn’t be verified:&lt;/strong>&lt;/p>&lt;figure name="1de0" id="1de0" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*y3H4CeyF-UXbeagKQCGuqA.png" data-width="1368" data-height="358" src="https://cdn-images-1.medium.com/max/800/1*y3H4CeyF-UXbeagKQCGuqA.png">&lt;/figure>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="cpp" name="22ce" id="22ce" class="graf graf--pre graf-after--figure graf--preV2">&lt;span class="pre--content">curl -fsSL https:&lt;span class="hljs-comment">//download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;/span>&lt;/span>&lt;/pre>&lt;p name="48eb" id="48eb" class="graf graf--p graf-after--pre">&lt;a href="https://docs.docker.com/engine/install/ubuntu/" data-href="https://docs.docker.com/engine/install/ubuntu/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Install Docker Engine on Ubuntu | Docker Documentation&lt;/a>&lt;/p>&lt;p name="2fab" id="2fab" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Check if it’s running:&lt;/strong>&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="lua" name="d4d6" id="d4d6" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">service docker &lt;span class="hljs-built_in">status&lt;/span>&lt;/span>&lt;/pre>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="sql" name="f27a" id="f27a" class="graf graf--pre graf-after--pre graf--preV2">&lt;span class="pre--content"> sudo service docker &lt;span class="hljs-keyword">start&lt;/span>&lt;/span>&lt;/pre>&lt;figure name="3a9b" id="3a9b" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*We6ZsPN8ohrykEZL36lUGw.png" data-width="599" data-height="60" src="https://cdn-images-1.medium.com/max/800/1*We6ZsPN8ohrykEZL36lUGw.png">&lt;/figure>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="sql" name="ae0e" id="ae0e" class="graf graf--pre graf-after--figure graf--preV2">&lt;span class="pre--content">sudo &lt;span class="hljs-keyword">update&lt;/span>&lt;span class="hljs-operator">-&lt;/span>alternatives &lt;span class="hljs-comment">--config iptables&lt;/span>&lt;/span>&lt;/pre>&lt;figure name="5ce2" id="5ce2" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*dLwXebKsL6kxUUhkXAFt1A.png" data-width="1446" data-height="305" src="https://cdn-images-1.medium.com/max/800/1*dLwXebKsL6kxUUhkXAFt1A.png">&lt;/figure>&lt;p name="dd09" id="dd09" class="graf graf--p graf-after--figure">Choose option “1”&lt;/p>&lt;figure name="912e" id="912e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*ysvkvL3zRIJh3xCPWki5Bw.png" data-width="1067" data-height="601" src="https://cdn-images-1.medium.com/max/800/1*ysvkvL3zRIJh3xCPWki5Bw.png">&lt;/figure>&lt;p name="5a36" id="5a36" class="graf graf--p graf-after--figure">&lt;strong class="markup--strong markup--p-strong">Dotnet app&lt;/strong>&lt;/p>&lt;p name="26db" id="26db" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-7.0" data-href="https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-7.0" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Docker images for ASP.NET Core | Microsoft Learn&lt;/a>&lt;/p>&lt;p name="9a03" id="9a03" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Install .net &lt;/strong>&lt;/p>&lt;p name="4a96" id="4a96" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu" data-href="https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Install .NET on Ubuntu — .NET | Microsoft Learn&lt;/a>&lt;/p>&lt;p name="60c2" id="60c2" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Install Az cli on wsl&lt;/strong>&lt;/p>&lt;p name="f1a8" id="f1a8" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt#option-1-install-with-one-command" data-href="https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt#option-1-install-with-one-command" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Install the Azure CLI on Linux | Microsoft Learn&lt;/a>&lt;/p>&lt;p name="7937" id="7937" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Push image&lt;/strong>&lt;/p>&lt;p name="b87a" id="b87a" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli" data-href="https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli?tabs=azure-cli" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Push &amp;amp; pull container image — Azure Container Registry | Microsoft Learn&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/aa662a0c9b1d">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_creating-a-ci-cd-pipeline-with-github-actions-49fc9d8bce3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_creating-a-ci-cd-pipeline-with-github-actions-49fc9d8bce3/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating a CI/CD pipeline with GitHub Actions&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating a CI/CD pipeline with GitHub Actions&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In this post I will show how to create an application .net core, version on GitHub, create a workflow using Action and deploy on Azure
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f858" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5265" id="5265" class="graf graf--h3 graf--leading graf--title">Creating a CI/CD pipeline with GitHub Actions&lt;/h3>&lt;p name="2dbb" id="2dbb" class="graf graf--p graf-after--h3">In this post I will show how to create an application .net core, version on GitHub, create a workflow using Action and deploy on Azure &lt;/p>&lt;p name="0980" id="0980" class="graf graf--p graf-after--p">To follow this post, you will need:&lt;/p>&lt;ul class="postList">&lt;li name="a2d8" id="a2d8" class="graf graf--li graf-after--p">Visual Studio Code — You can download &lt;a href="https://code.visualstudio.com/download" data-href="https://code.visualstudio.com/download" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">here &lt;/a> &lt;/li>&lt;li name="3a11" id="3a11" class="graf graf--li graf-after--li">DotNet Core SDK — You can download &lt;a href="https://dotnet.microsoft.com/download" data-href="https://dotnet.microsoft.com/download" class="markup--anchor markup--li-anchor" rel="noopener" target="_blank">here &lt;/a>&lt;/li>&lt;li name="2122" id="2122" class="graf graf--li graf-after--li">A GitHub account&lt;/li>&lt;li name="4820" id="4820" class="graf graf--li graf-after--li">An Azure account&lt;/li>&lt;/ul>&lt;p name="5738" id="5738" class="graf graf--p graf-after--li">Todos os comandos realizados localmente estão no arquivo abaixo, mas irei explica-los um a um no decorrer do post&lt;/p>&lt;p name="34f7" id="34f7" class="graf graf--p graf-after--p">All command used in this post are bellow, I will explain all this&lt;/p>&lt;h3 name="8ce7" id="8ce7" class="graf graf--h3 graf-after--p">Creating an application&lt;/h3>&lt;p name="7c70" id="7c70" class="graf graf--p graf-after--h3">After all pré reqs are ok, open your VS Code, click in Open folder and select an empty folder to create the project:&lt;/p>&lt;figure name="9a5d" id="9a5d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*diGto5IKql2_k6xO.png" data-width="373" data-height="256" src="https://cdn-images-1.medium.com/max/800/0*diGto5IKql2_k6xO.png">&lt;/figure>&lt;p name="48d4" id="48d4" class="graf graf--p graf-after--figure">Agora vá no menu superior vá em &lt;strong class="markup--strong markup--p-strong">Terminal &lt;/strong>-&amp;gt; &lt;strong class="markup--strong markup--p-strong">New Terminal &lt;/strong>ou pressione &lt;em class="markup--em markup--p-em">ctrl + ‘,isso irá abrir um terminal na parte inferior da tela. Para verificar a versão do sdk instalada clique nele e digite:&lt;/em>&lt;/p>&lt;p name="afd6" id="afd6" class="graf graf--p graf-after--p">On the superior menu click on &lt;strong class="markup--strong markup--p-strong">Terminal -&amp;gt; Terminal &lt;/strong>or press ctrol + ‘, so a new terminal will open in &lt;/p>&lt;pre name="378c" id="378c" class="graf graf--pre graf-after--p">dotnet --version&lt;/pre>&lt;p name="cd1d" id="cd1d" class="graf graf--p graf-after--pre">&lt;em class="markup--em markup--p-em">No meu caso estou utilizando a versão 3.1.201, caso tenha algum problema durante a execução do tutorial e esteja utilizando uma versão diferente, utilizar essa versão pode te ajudar.&lt;/em>&lt;/p>&lt;figure name="7f5f" id="7f5f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*moYwnmKBsKsbhrtK" data-width="30" data-height="8" src="https://cdn-images-1.medium.com/max/800/0*moYwnmKBsKsbhrtK">&lt;/figure>&lt;figure name="c8a8" id="c8a8" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*PhyRcM4BlZOVbqZF.png" data-width="443" data-height="127" src="https://cdn-images-1.medium.com/max/800/0*PhyRcM4BlZOVbqZF.png">&lt;/figure>&lt;p name="df87" id="df87" class="graf graf--p graf-after--figure">Agora para criarmos o projeto digite&lt;/p>&lt;pre name="3a1b" id="3a1b" class="graf graf--pre graf-after--p">dotnet new webapp&lt;/pre>&lt;p name="805e" id="805e" class="graf graf--p graf-after--pre">Esse comando irá criar a estrutura da nossa aplicação que nada mais é que um site web baseado em MVC:&lt;/p>&lt;figure name="8369" id="8369" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*ZARmWXh1JUzLWpC-" data-width="30" data-height="8" src="https://cdn-images-1.medium.com/max/800/0*ZARmWXh1JUzLWpC-">&lt;/figure>&lt;figure name="429d" id="429d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*JH13KRvW5blzfu4R.png" data-width="691" data-height="202" src="https://cdn-images-1.medium.com/max/800/0*JH13KRvW5blzfu4R.png">&lt;/figure>&lt;p name="4cd1" id="4cd1" class="graf graf--p graf-after--figure">Repare que serão criados alguns arquivos na pasta que selecionamos no início. Eles podem ser vistos no menu Explorer ao lado esquerdo da tela&lt;/p>&lt;figure name="721d" id="721d" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*CHimbYqrHXTsPNcj" data-width="30" data-height="26" src="https://cdn-images-1.medium.com/max/800/0*CHimbYqrHXTsPNcj">&lt;/figure>&lt;figure name="09b8" id="09b8" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*yrtdqP4S6xBJZV7m.png" data-width="371" data-height="324" src="https://cdn-images-1.medium.com/max/800/0*yrtdqP4S6xBJZV7m.png">&lt;/figure>&lt;p name="a6b8" id="a6b8" class="graf graf--p graf-after--figure">Para verificar se tudo está ok com a aplicação, digite no terminal&lt;/p>&lt;pre name="c171" id="c171" class="graf graf--pre graf-after--p">dotnet run&lt;/pre>&lt;p name="5b5e" id="5b5e" class="graf graf--p graf-after--pre">Isso irá compilar e iniciar a aplicação. Aqui também pode ser verificado em qual porta está rodando e acessar para testar&lt;/p>&lt;figure name="171a" id="171a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*-Ra_X_0g_WbsovE-" data-width="30" data-height="15" src="https://cdn-images-1.medium.com/max/800/0*-Ra_X_0g_WbsovE-">&lt;/figure>&lt;figure name="656a" id="656a" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*frgy9PiSdLXDm0Au.png" data-width="472" data-height="250" src="https://cdn-images-1.medium.com/max/800/0*frgy9PiSdLXDm0Au.png">&lt;/figure>&lt;figure name="9fcc" id="9fcc" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*639cB6gYP04PNawp" data-width="30" data-height="15" src="https://cdn-images-1.medium.com/max/800/0*639cB6gYP04PNawp">&lt;/figure>&lt;figure name="6917" id="6917" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*5Q9lSX2It5AWzUKx.png" data-width="572" data-height="295" src="https://cdn-images-1.medium.com/max/800/0*5Q9lSX2It5AWzUKx.png">&lt;/figure>&lt;p name="ca37" id="ca37" class="graf graf--p graf-after--figure">Agora que temos uma aplicação rodando, podemos seguir para a etapa de versionamento.&lt;/p>&lt;p name="9f31" id="9f31" class="graf graf--p graf-after--p">Para mais informações sobre comandos do dotnet core veja o conteúdo deste link &lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" data-href="https://docs.microsoft.com/pt-br/dotnet/core/tools/" class="markup--anchor markup--p-anchor" rel="noopener nofollow noopener" target="_blank">https://docs.microsoft.com/pt-br/dotnet/core/tools/&lt;/a>&lt;/p>&lt;h3 name="a637" id="a637" class="graf graf--h3 graf-after--p">Adicionando ao GitHub / controle de versão&lt;/h3>&lt;p name="215a" id="215a" class="graf graf--p graf-after--h3">Antes de enviar nosso código ao GitHub, primeiro precisamos versionar localmente. Antes de realizar esse versionamento, vamos criar um arquivo chamado &lt;em class="markup--em markup--p-em">.gitignore&lt;/em>, onde iremos informar ao git, quais arquivos não queremos que sejam enviados, como binários por exemplo. O próprio dotnet Core possui um template pronto, onde automaticamente são adicionados os arquivos que não queremos versionar. No terminal digite:&lt;/p>&lt;pre name="cb62" id="cb62" class="graf graf--pre graf-after--p">dotnet new gitignore&lt;/pre>&lt;figure name="e171" id="e171" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="0*VXhYFQgIJHc4UAQT" data-width="30" data-height="4" src="https://cdn-images-1.medium.com/max/800/0*VXhYFQgIJHc4UAQT">&lt;/figure>&lt;figure name="a5e8" id="a5e8" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*6EmNVns3Ma3LZIZk.png" data-width="469" data-height="71" src="https://cdn-images-1.medium.com/max/800/0*6EmNVns3Ma3LZIZk.png">&lt;/figure>&lt;figure name="7767" id="7767" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*DmCT5k_vwDoX7S6O" data-width="30" data-height="20" src="https://cdn-images-1.medium.com/max/800/0*DmCT5k_vwDoX7S6O">&lt;/figure>&lt;figure name="6e4b" id="6e4b" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*SPk8K141_AvbPSia.png" data-width="1094" data-height="738" src="https://cdn-images-1.medium.com/max/800/0*SPk8K141_AvbPSia.png">&lt;/figure>&lt;p name="4078" id="4078" class="graf graf--p graf-after--figure">1. Inicializando nosso repositório e adicionando todos os nossos arquivos para a área de staging.&lt;/p>&lt;pre name="9c60" id="9c60" class="graf graf--pre graf-after--p">git initgit add .&lt;br>git status&lt;/pre>&lt;figure name="d66d" id="d66d" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="0*7XK1-8Ssj1aGAxjI" data-width="30" data-height="3" src="https://cdn-images-1.medium.com/max/800/0*7XK1-8Ssj1aGAxjI">&lt;/figure>&lt;figure name="7a99" id="7a99" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*fmiKiniYoVHkJPZc.png" data-width="589" data-height="71" src="https://cdn-images-1.medium.com/max/800/0*fmiKiniYoVHkJPZc.png">&lt;/figure>&lt;figure name="7d36" id="7d36" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*dV-nP6CArG2YmknU" data-width="30" data-height="22" src="https://cdn-images-1.medium.com/max/800/0*dV-nP6CArG2YmknU">&lt;/figure>&lt;figure name="cec5" id="cec5" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*84NWml2xE3yvDQBx.png" data-width="525" data-height="391" src="https://cdn-images-1.medium.com/max/800/0*84NWml2xE3yvDQBx.png">&lt;/figure>&lt;p name="cd9b" id="cd9b" class="graf graf--p graf-after--figure">Realizando commit das alterações&lt;/p>&lt;pre name="1172" id="1172" class="graf graf--pre graf-after--p">git commit -m &amp;quot;commit inicial&amp;quot;&lt;/pre>&lt;figure name="6714" id="6714" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="0*l_XN6U-MOBp4Oyqr" data-width="30" data-height="21" src="https://cdn-images-1.medium.com/max/800/0*l_XN6U-MOBp4Oyqr">&lt;/figure>&lt;figure name="7b16" id="7b16" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*B7ew3BGYiqk5ENvh.png" data-width="546" data-height="383" src="https://cdn-images-1.medium.com/max/800/0*B7ew3BGYiqk5ENvh.png">&lt;/figure>&lt;p name="edae" id="edae" class="graf graf--p graf-after--figure">Até agora todas as operações que realizamos foram locais. Para enviarmos o código para o GitHub, primeiro precisamos criar um repositório. Acesse sua conta no GitHub e siga os passos abaixo:&lt;/p>&lt;figure name="5bf9" id="5bf9" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*_V9plMBmhfU_qsMl" data-width="30" data-height="7" src="https://cdn-images-1.medium.com/max/800/0*_V9plMBmhfU_qsMl">&lt;/figure>&lt;figure name="548c" id="548c" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*KTImj6P6SqLxSlAp.png" data-width="1276" data-height="317" src="https://cdn-images-1.medium.com/max/800/0*KTImj6P6SqLxSlAp.png">&lt;/figure>&lt;figure name="2de5" id="2de5" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*VW6_eGZU9PwUdGS8" data-width="30" data-height="30" src="https://cdn-images-1.medium.com/max/800/0*VW6_eGZU9PwUdGS8">&lt;/figure>&lt;figure name="4682" id="4682" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*WVn-AUX4mp_rIXjE.png" data-width="763" data-height="773" src="https://cdn-images-1.medium.com/max/800/0*WVn-AUX4mp_rIXjE.png">&lt;/figure>&lt;p name="ae8b" id="ae8b" class="graf graf--p graf-after--figure">Como já temos um repositório criado, copie o código da opção abaixo, cole e execute no terminal:&lt;/p>&lt;figure name="1518" id="1518" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*e_mS4uI1mzOrymUG" data-width="30" data-height="24" src="https://cdn-images-1.medium.com/max/800/0*e_mS4uI1mzOrymUG">&lt;/figure>&lt;figure name="cfa3" id="cfa3" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*4kAZeGzvVI4ZYiRj.png" data-width="1014" data-height="832" src="https://cdn-images-1.medium.com/max/800/0*4kAZeGzvVI4ZYiRj.png">&lt;/figure>&lt;pre name="a302" id="a302" class="graf graf--pre graf-after--figure">git remote add origin &lt;a href="https://github.com/wesleycamargo/Pipeline-CICD.git" data-href="https://github.com/wesleycamargo/Pipeline-CICD.git" class="markup--anchor markup--pre-anchor" rel="noopener nofollow noopener" target="_blank">https://github.com/wesleycamargo/Pipeline-CICD.git&lt;/a>&lt;br>git push -u origin master&lt;/pre>&lt;figure name="0863" id="0863" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="0*ES5x4UVV0hGD_jJ4" data-width="30" data-height="9" src="https://cdn-images-1.medium.com/max/800/0*ES5x4UVV0hGD_jJ4">&lt;/figure>&lt;figure name="cbd1" id="cbd1" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*4Gu98VYFAX0-rH4I.png" data-width="822" data-height="265" src="https://cdn-images-1.medium.com/max/800/0*4Gu98VYFAX0-rH4I.png">&lt;/figure>&lt;p name="e2bc" id="e2bc" class="graf graf--p graf-after--figure">Ao atualizar a página do repositório nosso código já estará lá&lt;/p>&lt;figure name="b914" id="b914" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*_UhP1s59DoVm_A9p" data-width="30" data-height="22" src="https://cdn-images-1.medium.com/max/800/0*_UhP1s59DoVm_A9p">&lt;/figure>&lt;figure name="0d0d" id="0d0d" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*xnVoeDnqTATwIKOZ.png" data-width="1028" data-height="774" src="https://cdn-images-1.medium.com/max/800/0*xnVoeDnqTATwIKOZ.png">&lt;/figure>&lt;h3 name="5d0f" id="5d0f" class="graf graf--h3 graf-after--figure">Criando Action de CI&lt;/h3>&lt;p name="2e4d" id="2e4d" class="graf graf--p graf-after--h3">Na tela anterior clique em Actions, o GitHub deverá identificar que o código da aplicação foi escrito em .NET Core e irá sugerir um template de workflow. Pode selecioná-lo:&lt;/p>&lt;figure name="4b29" id="4b29" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*FwzUSYRFl6uSqaCG" data-width="30" data-height="19" src="https://cdn-images-1.medium.com/max/800/0*FwzUSYRFl6uSqaCG">&lt;/figure>&lt;figure name="6609" id="6609" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*EmP8VGVI0qzIsq0o.png" data-width="907" data-height="603" src="https://cdn-images-1.medium.com/max/800/0*EmP8VGVI0qzIsq0o.png">&lt;/figure>&lt;p name="1a60" id="1a60" class="graf graf--p graf-after--figure">Na tela seguinte será apresentado um arquivo .yml. Nesse momento vamos mante-lo assim, realizando o commit na branch master:&lt;/p>&lt;figure name="d980" id="d980" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*Sft5vLDx93lHUNfu" data-width="26" data-height="29" src="https://cdn-images-1.medium.com/max/800/0*Sft5vLDx93lHUNfu">&lt;/figure>&lt;figure name="38e9" id="38e9" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*Dfbn1ZYjB0vm_wXN.png" data-width="678" data-height="782" src="https://cdn-images-1.medium.com/max/800/0*Dfbn1ZYjB0vm_wXN.png">&lt;/figure>&lt;figure name="a158" id="a158" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*dVgF6AvZPwiQwUYX" data-width="30" data-height="26" src="https://cdn-images-1.medium.com/max/800/0*dVgF6AvZPwiQwUYX">&lt;/figure>&lt;figure name="80db" id="80db" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*fPFtm-ehUVCpVm-M.png" data-width="386" data-height="340" src="https://cdn-images-1.medium.com/max/800/0*fPFtm-ehUVCpVm-M.png">&lt;/figure>&lt;p name="34da" id="34da" class="graf graf--p graf-after--figure">Será criada uma pasta .github/workflows no seu repositório, nela será adicionado um arquivo com o conteúdo abaixo:&lt;/p>&lt;p name="fcc0" id="fcc0" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="ab82" id="ab82" class="graf graf--p graf-after--p">Agora você será redirecionado para a parte de código. Clique novamente em Actions e você irá notar que foi criado um workflow e ele já foi iniciado automaticamente. Clique no evento que foi acionado e no build conforme as imagens:&lt;/p>&lt;figure name="3197" id="3197" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*b_ZEG2r3gB45WR9n" data-width="30" data-height="11" src="https://cdn-images-1.medium.com/max/800/0*b_ZEG2r3gB45WR9n">&lt;/figure>&lt;figure name="7062" id="7062" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*OHQUFD0kcgmMiLho.png" data-width="1127" data-height="436" src="https://cdn-images-1.medium.com/max/800/0*OHQUFD0kcgmMiLho.png">&lt;/figure>&lt;figure name="0747" id="0747" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*S_Q0D9HOdVJHXmgh" data-width="30" data-height="19" src="https://cdn-images-1.medium.com/max/800/0*S_Q0D9HOdVJHXmgh">&lt;/figure>&lt;figure name="6986" id="6986" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*X9h6IJI1sKgxVSy3.png" data-width="1160" data-height="751" src="https://cdn-images-1.medium.com/max/800/0*X9h6IJI1sKgxVSy3.png">&lt;/figure>&lt;p name="c929" id="c929" class="graf graf--p graf-after--figure">Observe que é possível visualizar o log da execução do build.&lt;/p>&lt;p name="fd94" id="fd94" class="graf graf--p graf-after--p">Já temos um build realizando a Continuous Integration(CI) de nossa aplicação.&lt;/p>&lt;h3 name="4259" id="4259" class="graf graf--h3 graf-after--p">Adicionando Azure Web App Publish Profile ao GitHub&lt;/h3>&lt;p name="6659" id="6659" class="graf graf--p graf-after--h3">Vá a um Web App já existente no portal do Azure e clique em Get publish profile.&lt;/p>&lt;figure name="8623" id="8623" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*YWaFfD9HquOo2rov" data-width="30" data-height="8" src="https://cdn-images-1.medium.com/max/800/0*YWaFfD9HquOo2rov">&lt;/figure>&lt;figure name="2359" id="2359" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*qMAdjlSbGSzU4cXZ.png" data-width="984" data-height="266" src="https://cdn-images-1.medium.com/max/800/0*qMAdjlSbGSzU4cXZ.png">&lt;/figure>&lt;p name="de0e" id="de0e" class="graf graf--p graf-after--figure">Será realizado o download de um arquivo com a extensão .PublishSettings. Copie o conteúdo dele.&lt;/p>&lt;p name="3c0e" id="3c0e" class="graf graf--p graf-after--p">No GitHub, vá às configurações para adicionar como Secret:&lt;/p>&lt;figure name="c086" id="c086" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*iX8HReuhXcz744Dw" data-width="30" data-height="14" src="https://cdn-images-1.medium.com/max/800/0*iX8HReuhXcz744Dw">&lt;/figure>&lt;figure name="a727" id="a727" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*iWDEB3QVGGVgYK2i.png" data-width="1035" data-height="487" src="https://cdn-images-1.medium.com/max/800/0*iWDEB3QVGGVgYK2i.png">&lt;/figure>&lt;p name="ddea" id="ddea" class="graf graf--p graf-after--figure">Nomeie como AZURE_WEBAPP_PUBLISH_PROFILE e em value adicione o conteúdo do arquivo .PublishSettings&lt;/p>&lt;figure name="82a2" id="82a2" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*WOzTTTkebyiELr2c" data-width="30" data-height="12" src="https://cdn-images-1.medium.com/max/800/0*WOzTTTkebyiELr2c">&lt;/figure>&lt;figure name="dac2" id="dac2" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*OfB5-WW62KRg88zg.png" data-width="758" data-height="327" src="https://cdn-images-1.medium.com/max/800/0*OfB5-WW62KRg88zg.png">&lt;/figure>&lt;h3 name="38f9" id="38f9" class="graf graf--h3 graf-after--figure">Publicando a aplicação no Azure&lt;/h3>&lt;p name="bb0b" id="bb0b" class="graf graf--p graf-after--h3">Para configurar o Continuous Delivery(CD) vamos realizar algumas alterações no arquivo yml. Eu acho um pouco difícil editar pela página web, então vou realizar um pull do meu repositório local e editar no VS Code, mas você pode fazer onde for melhor para você =).&lt;/p>&lt;p name="37bc" id="37bc" class="graf graf--p graf-after--p">Primeiro vamos substituir o código anterior por um código mais enxuto e com uma nova função: &lt;em class="markup--em markup--p-em">publish. &lt;/em>Vamos adicionar também uma task para realizar o upload dos artefatos gerados:&lt;/p>&lt;p name="3598" id="3598" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="be93" id="be93" class="graf graf--p graf-after--p">Aqui também adicionamos variáveis de ambiente para nossa aplicação. Altere os valores de WebApp_Name e DotNet_Version para os valores de acordo com seu ambiente:&lt;/p>&lt;pre name="e5da" id="e5da" class="graf graf--pre graf-after--p">env:&lt;br>AZURE_WEBAPP_NAME: webAppAction-wes&lt;br>AZURE_WEBAPP_PACKAGE_PATH: &amp;#39;.&amp;#39;&lt;br>DOTNET_VERSION: &amp;#39;3.1.201&amp;#39;&lt;/pre>&lt;p name="2e2d" id="2e2d" class="graf graf--p graf-after--pre">Com a task para realizar o upload dos artefatos, podemos notar que após executar o build podemos baixá-los:&lt;/p>&lt;figure name="072e" id="072e" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*s504hKzBMnEG9Diq" data-width="30" data-height="23" src="https://cdn-images-1.medium.com/max/800/0*s504hKzBMnEG9Diq">&lt;/figure>&lt;figure name="dd45" id="dd45" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*EMN35Zq8rgFLUMSA.png" data-width="638" data-height="493" src="https://cdn-images-1.medium.com/max/800/0*EMN35Zq8rgFLUMSA.png">&lt;/figure>&lt;p name="d82a" id="d82a" class="graf graf--p graf-after--figure">Ao final sua aplicação estará publicada em seu WebApp:&lt;/p>&lt;figure name="a1f2" id="a1f2" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*PmjS_wrH3cwkcHuy" data-width="30" data-height="12" src="https://cdn-images-1.medium.com/max/800/0*PmjS_wrH3cwkcHuy">&lt;/figure>&lt;figure name="20fb" id="20fb" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="0*XSjsuCCIcWYjI9p3.png" data-width="766" data-height="312" src="https://cdn-images-1.medium.com/max/800/0*XSjsuCCIcWYjI9p3.png">&lt;/figure>&lt;p name="8951" id="8951" class="graf graf--p graf-after--figure">Vou deixar aqui o link do repositório caso queiram visualizar: &lt;a href="https://github.com/wesleycamargo/Pipeline-CICD" data-href="https://github.com/wesleycamargo/Pipeline-CICD" class="markup--anchor markup--p-anchor" rel="noopener nofollow noopener" target="_blank">https://github.com/wesleycamargo/Pipeline-CICD&lt;/a>&lt;/p>&lt;p name="3156" id="3156" class="graf graf--p graf-after--p graf--trailing">Valeu!&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/49fc9d8bce3">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_creating-an-azure-web-app-with-azure-devops-release-engine-c426d689fb63/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_creating-an-azure-web-app-with-azure-devops-release-engine-c426d689fb63/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating an Azure Web App with Azure DevOps Release Engine&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating an Azure Web App with Azure DevOps Release Engine&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="260d" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="8b39" id="8b39" class="graf graf--h3 graf--leading graf--title">Creating an Azure Web App with Azure DevOps Release Engine&lt;/h3>&lt;p name="eff4" id="eff4" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/c426d689fb63">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_creating-and-configuring-storage-accounts-on-azure-86a4296ceac0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_creating-and-configuring-storage-accounts-on-azure-86a4296ceac0/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating and configuring storage accounts on Azure&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating and configuring storage accounts on Azure&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Storage Account Concepts
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d621" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="054d" id="054d" class="graf graf--h3 graf--leading graf--title">Creating and configuring storage accounts on Azure&lt;/h3>&lt;p name="327a" id="327a" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="83a8" id="83a8" class="graf graf--h3 graf-after--p">Storage Account Concepts &lt;/h3>&lt;p name="44b8" id="44b8" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="c58e" id="c58e" class="graf graf--h3 graf-after--p">How to create a Storage Account&lt;/h3>&lt;h4 name="3a16" id="3a16" class="graf graf--h4 graf-after--h3">Creating a Storage Account with Azure CLI&lt;/h4>&lt;figure name="9065" id="9065" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=01-createStorageAccount-azcli.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="1ba2" id="1ba2" class="graf graf--h4 graf-after--figure">Creating a Storage Account with Azure PowerShell&lt;/h4>&lt;figure name="2517" id="2517" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=01-createStorageAccount-pwsh.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="8fbd" id="8fbd" class="graf graf--h4 graf-after--figure">Creating a Storage Account with Azure Bicep 💪 &lt;/h4>&lt;figure name="9c04" id="9c04" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=01-createStorageAccount.bicep.js">&lt;/script>&lt;/figure>&lt;p name="9e0f" id="9e0f" class="graf graf--p graf-after--figure">To execute the bicep file, it is necessary to use either Azure PowerShell or Azure CLI. In this example, we are using Azure CLI and creating the Resource Group with it as well.&lt;/p>&lt;figure name="bb59" id="bb59" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=01-createStorageAccount-bicep.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="d837" id="d837" class="graf graf--h3 graf-after--figure">Deleting a Storage Account&lt;/h3>&lt;h4 name="6c8a" id="6c8a" class="graf graf--h4 graf-after--h3">Deleting a Storage Account with Azure CLI&lt;/h4>&lt;figure name="18dd" id="18dd" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=02-deleteStorageAccount-azcli.ps1.js">&lt;/script>&lt;/figure>&lt;h4 name="b3f1" id="b3f1" class="graf graf--h4 graf-after--figure">Deleting a Storage Account with Azure PowerShell&lt;/h4>&lt;figure name="f76d" id="f76d" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=02-deleteStorageAccount-pwsh.ps1.js">&lt;/script>&lt;/figure>&lt;p name="c426" id="c426" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;p name="cee2" id="cee2" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h3 name="d734" id="d734" class="graf graf--h3 graf-after--p">Update&lt;/h3>&lt;h4 name="911d" id="911d" class="graf graf--h4 graf-after--h3">Azure CLI&lt;/h4>&lt;figure name="b9d4" id="b9d4" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=03-createStorageAccountV1-azcli.ps1.js">&lt;/script>&lt;/figure>&lt;p name="c8b1" id="c8b1" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="f5a5" id="f5a5" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*l6ql1ichlOYNzxiupYYveg.png" data-width="364" data-height="155" src="https://cdn-images-1.medium.com/max/800/1*l6ql1ichlOYNzxiupYYveg.png">&lt;/figure>&lt;figure name="72ee" id="72ee" class="graf graf--figure graf--iframe graf-after--figure">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=03-upgradingStorageAccount-azcli.ps1.js">&lt;/script>&lt;/figure>&lt;figure name="4594" id="4594" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*0GnKovPOW-GkLHuZLZ0KmA.png" data-width="373" data-height="175" src="https://cdn-images-1.medium.com/max/800/1*0GnKovPOW-GkLHuZLZ0KmA.png">&lt;/figure>&lt;h4 name="42ab" id="42ab" class="graf graf--h4 graf-after--figure">Azure PowerShell&lt;/h4>&lt;figure name="6a24" id="6a24" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=03-upgradingStorageAccount-pwsh.ps1.js">&lt;/script>&lt;/figure>&lt;p name="7c5c" id="7c5c" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;h3 name="060f" id="060f" class="graf graf--h3 graf-after--p">Get Storage Information&lt;/h3>&lt;figure name="a4b9" id="a4b9" class="graf graf--figure graf--iframe graf-after--h3">&lt;script src="https://gist.github.com/wesleycamargo/1817d33ecd05b6087bd1ae80ce6f62bf?file=04-getStorageInformation-azcli.ps1.js">&lt;/script>&lt;/figure>&lt;p name="9990" id="9990" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/86a4296ceac0">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_creating-azure-sql-database-with-bicep-and-azure-devops-yaml-pipelines-81c308d55349/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_creating-azure-sql-database-with-bicep-and-azure-devops-yaml-pipelines-81c308d55349/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Creating Azure SQL Database with Bicep and Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Creating Azure SQL Database with Bicep and Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="d762" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="02de" id="02de" class="graf graf--h3 graf--leading graf--title">Creating Azure SQL Database with Bicep and Azure DevOps YAML Pipelines&lt;/h3>&lt;p name="c969" id="c969" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/81c308d55349">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_databricks-environment-b0d877057d88/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_databricks-environment-b0d877057d88/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Databricks Environment&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Databricks Environment&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
sudo apt update
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b425" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ad28" id="ad28" class="graf graf--h3 graf--leading graf--title">Databricks Environment&lt;/h3>&lt;p name="def4" id="def4" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="ad65" id="ad65" class="graf graf--p graf-after--p">sudo apt update&lt;/p>&lt;p name="d923" id="d923" class="graf graf--p graf-after--p">sudo apt install python3-pip&lt;/p>&lt;p name="b7f3" id="b7f3" class="graf graf--p graf-after--p">pip3 — version&lt;/p>&lt;p name="efc9" id="efc9" class="graf graf--p graf-after--p">sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl&lt;/p>&lt;p name="1b13" id="1b13" class="graf graf--p graf-after--p">sudo apt install python3&lt;/p>&lt;pre name="1744" id="1744" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">curl https://pyenv.run | bash&lt;/code>&lt;/pre>&lt;p name="9a1b" id="9a1b" class="graf graf--p graf-after--pre">update the file ~/.bashrc&lt;/p>&lt;p name="755a" id="755a" class="graf graf--p graf-after--p">export PATH=”/home/wesley/.pyenv/bin:$PATH”&lt;br>eval “$(pyenv init -)”&lt;br>eval “$(pyenv virtualenv-init -)”&lt;/p>&lt;pre name="4cd6" id="4cd6" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">pyenv --help&lt;/code>&lt;/pre>&lt;pre name="209e" id="209e" class="graf graf--pre graf-after--pre">&lt;code class="markup--code markup--pre-code">pyenv install 3.7.0&lt;/code>&lt;/pre>&lt;p name="38d7" id="38d7" class="graf graf--p graf--empty graf-after--pre">&lt;br>&lt;/p>&lt;pre name="b9fc" id="b9fc" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">pipenv install toolz --python 3.8.5&lt;/code>&lt;/pre>&lt;p name="6ab6" id="6ab6" class="graf graf--p graf-after--pre">if has error related to ModuleNotFoundError: No module named ‘_ctypes’:&lt;/p>&lt;pre name="7118" id="7118" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">sudo apt-get install libffi-dev&lt;br>&lt;/code>sudo apt remove python3&lt;br>sudo apt install python3&lt;/pre>&lt;p name="545c" id="545c" class="graf graf--p graf-after--pre">&lt;a href="https://realpython.com/intro-to-pyenv/" data-href="https://realpython.com/intro-to-pyenv/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Managing Multiple Python Versions With pyenv — Real Python&lt;/a>&lt;/p>&lt;p name="187e" id="187e" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="3372" id="3372" class="graf graf--p graf-after--p">&lt;a href="https://akrabat.com/creating-virtual-environments-with-pyenv/" data-href="https://akrabat.com/creating-virtual-environments-with-pyenv/" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Creating virtual environments with Pyenv — Rob Allen’s DevNotes (akrabat.com)&lt;/a>&lt;/p>&lt;p name="1799" id="1799" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;pre name="b338" id="b338" class="graf graf--pre graf-after--p">pip install -U pytest&lt;/pre>&lt;p name="51fd" id="51fd" class="graf graf--p graf--empty graf-after--pre graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/b0d877057d88">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_dataops-automation---creating-an-azure-databriks-workspace-with-bicep-and-azure-devops-b066cc2437a6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_dataops-automation---creating-an-azure-databriks-workspace-with-bicep-and-azure-devops-b066cc2437a6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DataOps Automation — Creating an Azure Databriks workspace with Bicep and Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DataOps Automation — Creating an Azure Databriks workspace with Bicep and Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Preparing Bicep Environment
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d282" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="37d4" id="37d4" class="graf graf--h3 graf--leading graf--title">DataOps Automation — Creating an Azure Databriks workspace with Bicep and Azure DevOps&lt;/h3>&lt;p name="c196" id="c196" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h4 name="abf0" id="abf0" class="graf graf--h4 graf-after--p">Preparing Bicep Environment&lt;/h4>&lt;p name="02f5" id="02f5" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;p name="8260" id="8260" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/b066cc2437a6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_dataops-on-azure---authorizing-an-azure-data-factory-to-manage-a-databricks-with-managed-identities--519f66867f0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_dataops-on-azure---authorizing-an-azure-data-factory-to-manage-a-databricks-with-managed-identities--519f66867f0/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DataOps on Azure - Authorizing an Azure Data Factory to manage a Databricks with Managed Identities…&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DataOps on Azure - Authorizing an Azure Data Factory to manage a Databricks with Managed Identities…&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In big data architectures, it’s a common need to have an orchestrator managing other resources. On Azure, this tool is the Azure Data…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5ed1" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="0ee9" id="0ee9" class="graf graf--h3 graf--leading graf--title">DataOps on Azure - Authorizing an Azure Data Factory to manage a Databricks with Managed Identities and Az DevOps&lt;/h3>&lt;p name="e9ba" id="e9ba" class="graf graf--p graf-after--h3">In big data architectures, it’s a common need to have an orchestrator managing other resources. On Azure, this tool is the Azure Data Factory and we can handle many resources like SQL Servers, Storage Accounts, Databricks, among others. A prerequisite for this orchestration is that ADF has permissions on the resource that it must control, and this is the motivation for using Managed Identities: granting these permissions simply and quickly.&lt;/p>&lt;p name="5faa" id="5faa" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">What´s a Managed Identity?&lt;br>&lt;/strong>A Managed Identity is an easy way to set up your Azure Environment in scenarios that you have resources consuming other resources. Below we can see common situations that you can use this:&lt;/p>&lt;figure name="8fb1" id="8fb1" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*KWdZc2vl39iDma0N.png" data-width="1946" data-height="1032" src="https://cdn-images-1.medium.com/max/800/0*KWdZc2vl39iDma0N.png">&lt;/figure>&lt;p name="3749" id="3749" class="graf graf--p graf-after--figure">If you want to know more about how Managed Identities works, you can find it here &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview" data-href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Managed identities for Azure resources | Microsoft Docs&lt;/a> =)&lt;/p>&lt;p name="4f82" id="4f82" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="499a" id="499a" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="c931" id="c931" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="8e88" id="8e88" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/howto-assign-access-cli" data-href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/howto-assign-access-cli" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Assign a managed identity access to a resource using Azure CLI — Azure AD | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="384b" id="384b" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/azure/role-based-access-control/troubleshooting" data-href="https://docs.microsoft.com/en-us/azure/role-based-access-control/troubleshooting" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Troubleshoot Azure RBAC | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="76e8" id="76e8" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#user-access-administrator" data-href="https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#user-access-administrator" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure built-in roles — Azure RBAC | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/519f66867f0">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_delivery-as-code-with-azure-devops-release-engine-57ca43f45d3c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_delivery-as-code-with-azure-devops-release-engine-57ca43f45d3c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Delivery as Code with Azure DevOps release engine&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Delivery as Code with Azure DevOps release engine&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Delivery as Code is the concept of have all necessary configurations of your delivery such as environments, resources to be deployed…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e83a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="ed4a" id="ed4a" class="graf graf--p graf--leading">Delivery as Code with Azure DevOps release engine&lt;br>&lt;br>&lt;/p>&lt;p name="8916" id="8916" class="graf graf--p graf-after--p">Delivery as Code is the concept of have all necessary configurations of your delivery such as environments, resources to be deployed, different variables for your environments and so on defined in a file, which can be kept under source control.&lt;/p>&lt;p name="03d9" id="03d9" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/57ca43f45d3c">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_deploy-azure-landing-zones-29dc3c94690c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_deploy-azure-landing-zones-29dc3c94690c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Deploy Azure landing zones&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Deploy Azure landing zones&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Deploy Azure landing zones — Azure Architecture Center | Microsoft Learn
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5638" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ad87" id="ad87" class="graf graf--h3 graf--leading graf--title">Deploy Azure landing zones&lt;/h3>&lt;p name="dc08" id="dc08" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="4727" id="4727" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="517c" id="517c" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="27f7" id="27f7" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/landing-zone-deploy" data-href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/landing-zone-deploy" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Deploy Azure landing zones — Azure Architecture Center | Microsoft Learn&lt;/a>&lt;/p>&lt;p name="e9da" id="e9da" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/bicep/landing-zone-bicep" data-href="https://learn.microsoft.com/en-us/azure/architecture/landing-zones/bicep/landing-zone-bicep" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure landing zones — Bicep modules design considerations — Azure Architecture Center | Microsoft Learn&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/29dc3c94690c">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_deploying-sql-server-with-azure-devops-yaml-pipelines-75a20c468705/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_deploying-sql-server-with-azure-devops-yaml-pipelines-75a20c468705/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Deploying SQL Server with Azure DevOps YAML pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Deploying SQL Server with Azure DevOps YAML pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="649c" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="7cab" id="7cab" class="graf graf--h3 graf--leading graf--title">Deploying SQL Server with Azure DevOps YAML pipelines&lt;/h3>&lt;p name="09c1" id="09c1" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;figure name="271c" id="271c" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*PwcaF_MCa9tVfj8wQojvTw.png" data-width="674" data-height="427" src="https://cdn-images-1.medium.com/max/800/1*PwcaF_MCa9tVfj8wQojvTw.png">&lt;/figure>&lt;figure name="3c59" id="3c59" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*OyZffaPhbRoVVcro4cGkzw.png" data-width="1024" data-height="680" src="https://cdn-images-1.medium.com/max/800/1*OyZffaPhbRoVVcro4cGkzw.png">&lt;/figure>&lt;figure name="ff7e" id="ff7e" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*63pEhlj2hvC-Y0mCYwHIRA.png" data-width="1024" data-height="680" src="https://cdn-images-1.medium.com/max/800/1*63pEhlj2hvC-Y0mCYwHIRA.png">&lt;/figure>&lt;p name="88c6" id="88c6" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;p name="b83c" id="b83c" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/75a20c468705">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_devops-for-beginners---running-powershell-on-azure-devops-b6864f7c875d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_devops-for-beginners---running-powershell-on-azure-devops-b6864f7c875d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>DevOps for beginners — Running PowerShell on Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">DevOps for beginners — Running PowerShell on Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
How to run PowerShell Inline on Azure DevOps
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5b12" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="e4e0" id="e4e0" class="graf graf--h3 graf--leading graf--title">DevOps for beginners — Running PowerShell on Azure DevOps&lt;/h3>&lt;p name="7573" id="7573" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="4a6c" id="4a6c" class="graf graf--h3 graf-after--p">How to run PowerShell Inline on Azure DevOps&lt;/h3>&lt;h4 name="e0e8" id="e0e8" class="graf graf--h4 graf-after--h3">Using Azure DevOps PowerShell task&lt;/h4>&lt;p name="2064" id="2064" class="graf graf--p graf-after--h4">&lt;a href="https://github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV5" data-href="https://github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/AzurePowerShellV5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">azure-pipelines-tasks/Tasks/AzurePowerShellV5 at master · microsoft/azure-pipelines-tasks (github.com)&lt;/a>&lt;/p>&lt;figure name="8d91" id="8d91" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/373e4ffb8b7d8b9089e8b9209f28dd61?file=powerShellTask.yml.js">&lt;/script>&lt;/figure>&lt;figure name="7439" id="7439" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*zVEdkPvgnPmJgbiAh99uTA.png" data-width="1044" data-height="709" src="https://cdn-images-1.medium.com/max/800/1*zVEdkPvgnPmJgbiAh99uTA.png">&lt;/figure>&lt;p name="4935" id="4935" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="b93f" id="b93f" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*jwG8WP8XX4KjT_KQ_JQ7wA.png" data-width="894" data-height="548" src="https://cdn-images-1.medium.com/max/800/1*jwG8WP8XX4KjT_KQ_JQ7wA.png">&lt;/figure>&lt;p name="bc90" id="bc90" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;p name="4aa2" id="4aa2" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="58fa" id="58fa" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h4 name="bd29" id="bd29" class="graf graf--h4 graf-after--p">Using Azure DevOps PowerShell Shortcuts&lt;/h4>&lt;figure name="db57" id="db57" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/373e4ffb8b7d8b9089e8b9209f28dd61?file=powerShellShortcuts.yml.js">&lt;/script>&lt;/figure>&lt;p name="ffb1" id="ffb1" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="f851" id="f851" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*L08E3LCE4hz5ahglwNcVTA.png" data-width="808" data-height="527" src="https://cdn-images-1.medium.com/max/800/1*L08E3LCE4hz5ahglwNcVTA.png">&lt;/figure>&lt;p name="0c55" id="0c55" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;figure name="3c65" id="3c65" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*8LFOEVO-esCbOkC2NnLmNw.png" data-width="1022" data-height="812" src="https://cdn-images-1.medium.com/max/800/1*8LFOEVO-esCbOkC2NnLmNw.png">&lt;/figure>&lt;p name="ad6a" id="ad6a" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;h3 name="4fdd" id="4fdd" class="graf graf--h3 graf-after--p">How to run PowerShell Scripts on Azure DevOps&lt;/h3>&lt;h4 name="66bb" id="66bb" class="graf graf--h4 graf--empty graf-after--h3">&lt;br>&lt;/h4>&lt;h3 name="15fd" id="15fd" class="graf graf--h3 graf-after--h4">How to read environment variables on Azure DevOps with PowerShell&lt;/h3>&lt;p name="b6f2" id="b6f2" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="e7eb" id="e7eb" class="graf graf--h3 graf-after--p">Creating Outputs&lt;/h3>&lt;h3 name="6719" id="6719" class="graf graf--h3 graf--empty graf-after--h3">&lt;br>&lt;/h3>&lt;p name="1a3a" id="1a3a" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/b6864f7c875d">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_force-redeployment-on-terraform-0297b6a96fc6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_force-redeployment-on-terraform-0297b6a96fc6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Force redeployment on terraform&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Force redeployment on terraform&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Forcing Re-creation of Resources — Terraform CLI | Terraform | HashiCorp Developer
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="e285" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4c39" id="4c39" class="graf graf--h3 graf--leading graf--title">Force redeployment on terraform&lt;/h3>&lt;p name="efad" id="efad" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="52fd" id="52fd" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="ecfa" id="ecfa" class="graf graf--p graf-after--p">&lt;a href="https://developer.hashicorp.com/terraform/cli/state/taint" data-href="https://developer.hashicorp.com/terraform/cli/state/taint" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Forcing Re-creation of Resources — Terraform CLI | Terraform | HashiCorp Developer&lt;/a>&lt;/p>&lt;p name="6f54" id="6f54" class="graf graf--p graf-after--p graf--trailing">terraform apply -replace=”azurerm_virtual_machine_extension.iis”&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/0297b6a96fc6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--55fd91e6cfc7/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--55fd91e6cfc7/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>From Terraform to Azure Bicep:&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">From Terraform to Azure Bicep:&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
CLI Tools
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="9691" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="82c4" id="82c4" class="graf graf--h3 graf--leading graf--title">From Terraform to Azure Bicep: &lt;/h3>&lt;p name="a7ca" id="a7ca" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h4 name="31eb" id="31eb" class="graf graf--h4 graf-after--p">CLI Tools&lt;/h4>&lt;h4 name="a800" id="a800" class="graf graf--h4 graf-after--h4">Authentication to Azure&lt;/h4>&lt;p name="6587" id="6587" class="graf graf--p graf-after--h4">Deployment scopes (resource groups, subscriptions)&lt;/p>&lt;h4 name="4cd5" id="4cd5" class="graf graf--h4 graf-after--p">Modularity and Reusability&lt;/h4>&lt;h4 name="0ed6" id="0ed6" class="graf graf--h4 graf-after--h4">State Management&lt;/h4>&lt;h4 name="2719" id="2719" class="graf graf--h4 graf-after--h4">Provider Support&lt;/h4>&lt;p name="c787" id="c787" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;p name="629f" id="629f" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Linkedin feedback&lt;/strong>&lt;/p>&lt;p name="8ece" id="8ece" class="graf graf--p graf-after--p">- Bicep is essentially an ARM transpiler to a nicer (more HCL esque) language, therefore has all the advantages and disadvantages of ARM.&lt;br>- Terraform keeps state where Bicep doesn’t, this has varied consequences.&lt;br>- Bicep will gain newer features in Azure faster than Terraform due to it being so closely related to ARM which always gets new features first.&lt;br>- Terraform will allow you to use other providers and hook into other systems where Bicep will make this difficult.&lt;br>- Terraform can do destroy and plan where this functionality is either missing or poorly implemented in ARM and thus Bicep.&lt;/p>&lt;h3 name="1edb" id="1edb" class="graf graf--h3 graf-after--p">Modularity and Reusability&lt;/h3>&lt;ul class="postList">&lt;li name="8840" id="8840" class="graf graf--li graf-after--h3">Comparison of the modularity and reusability features of Terraform and Azure Bicep.&lt;/li>&lt;li name="c7c3" id="c7c3" class="graf graf--li graf-after--li">Explanation of the similarities and differences between the two tools’ approaches to modularity and reusability.&lt;/li>&lt;li name="1806" id="1806" class="graf graf--li graf-after--li">Discussion of the benefits of Azure Bicep’s more tightly integrated module system and how it differs from Terraform’s ecosystem of modules.&lt;/li>&lt;/ul>&lt;h3 name="1ce1" id="1ce1" class="graf graf--h3 graf-after--li">State Management&lt;/h3>&lt;ul class="postList">&lt;li name="1e0f" id="1e0f" class="graf graf--li graf-after--h3">Comparison of how Terraform and Azure Bicep handle state management.&lt;/li>&lt;li name="c026" id="c026" class="graf graf--li graf-after--li">Explanation of the similarities and differences between the two tools’ approaches to state management.&lt;/li>&lt;li name="76af" id="76af" class="graf graf--li graf-after--li">Discussion of the benefits of Azure Bicep’s use of ARM templates for state management and how it differs from Terraform’s state file.&lt;/li>&lt;/ul>&lt;h3 name="cd96" id="cd96" class="graf graf--h3 graf-after--li">Provider Support&lt;/h3>&lt;ul class="postList">&lt;li name="32b5" id="32b5" class="graf graf--li graf-after--h3">Comparison of the provider support of Terraform and Azure Bicep.&lt;/li>&lt;li name="4bc7" id="4bc7" class="graf graf--li graf-after--li">Explanation of the similarities and differences between the two tools’ approaches to provider support.&lt;/li>&lt;li name="0602" id="0602" class="graf graf--li graf-after--li">Discussion of the benefits of Azure Bicep’s deep integration with Azure and how it differs from Terraform’s support for a wide range of cloud providers.&lt;/li>&lt;/ul>&lt;h3 name="19ac" id="19ac" class="graf graf--h3 graf-after--li">Getting Started with Azure Bicep&lt;/h3>&lt;ul class="postList">&lt;li name="39ca" id="39ca" class="graf graf--li graf-after--h3">Practical advice and tips for getting started with Azure Bicep, including installation and configuration.&lt;/li>&lt;li name="724c" id="724c" class="graf graf--li graf-after--li">Comparison of the steps required to create a simple infrastructure with Terraform and Azure Bicep.&lt;/li>&lt;li name="742d" id="742d" class="graf graf--li graf-after--li">Discussion of the benefits and challenges of switching from Terraform to Azure Bicep.&lt;/li>&lt;/ul>&lt;h3 name="5c36" id="5c36" class="graf graf--h3 graf-after--li">Conclusion&lt;/h3>&lt;ul class="postList">&lt;li name="6ac9" id="6ac9" class="graf graf--li graf-after--h3">Recap of the similarities and differences between Terraform and Azure Bicep.&lt;/li>&lt;li name="967b" id="967b" class="graf graf--li graf-after--li">Final thoughts on the benefits of using Azure Bicep for cloud infrastructure management.&lt;/li>&lt;li name="7694" id="7694" class="graf graf--li graf-after--li graf--trailing">Call to action for readers to give Azure Bicep a try.&lt;/li>&lt;/ul>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/55fd91e6cfc7">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--what-you-need-to-know-about--provisioning-lifecycle-c6dfcae1e807/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--what-you-need-to-know-about--provisioning-lifecycle-c6dfcae1e807/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>From Terraform to Azure Bicep: What You Need to Know about
Provisioning lifecycle&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">From Terraform to Azure Bicep: What You Need to Know about
Provisioning lifecycle&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Comparing Terraform and Bicep | Microsoft Learn
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="ad0d" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ad88" id="ad88" class="graf graf--h3 graf--leading graf--title">From Terraform to Azure Bicep: What You Need to Know about &lt;br>Provisioning lifecycle&lt;/h3>&lt;p name="55a3" id="55a3" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="8a65" id="8a65" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="c85d" id="c85d" class="graf graf--p graf-after--p">&lt;a href="https://learn.microsoft.com/en-us/azure/developer/terraform/comparing-terraform-and-bicep?tabs=comparing-bicep-terraform-usability-features#provisioning-lifecycle" data-href="https://learn.microsoft.com/en-us/azure/developer/terraform/comparing-terraform-and-bicep?tabs=comparing-bicep-terraform-usability-features#provisioning-lifecycle" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Comparing Terraform and Bicep | Microsoft Learn&lt;/a>&lt;/p>&lt;p name="daa8" id="daa8" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" data-href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Bicep language for deploying Azure resources — Azure Resource Manager | Microsoft Learn&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/c6dfcae1e807">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--what-you-need-to-know-about-cli-6750a931e0de/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_from-terraform-to-azure-bicep--what-you-need-to-know-about-cli-6750a931e0de/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>From Terraform to Azure Bicep: What you need to know about CLI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">From Terraform to Azure Bicep: What you need to know about CLI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Hey there! Welcome back to our blog series “From Terraform to Azure Bicep.” In my previous post, we discussed the differences in the main…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="22dd" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="6e70" id="6e70" class="graf graf--h3 graf--leading graf--title">From Terraform to Azure Bicep: What you need to know about CLI&lt;/h3>&lt;p name="bd7e" id="bd7e" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="99e2" id="99e2" class="graf graf--p graf-after--p">Hey there! Welcome back to our blog series “From Terraform to Azure Bicep.” In my previous post, we discussed the differences in the main components of the file structure. Now, it’s time to compare Terraform and Azure/Bicep CLI tools for infrastructure management. In this blog post, we will dive deep into the similarities and differences between them, and help you understand how to use them to manage your infrastructure. So let’s get started!&lt;/p>&lt;p name="e3e7" id="e3e7" class="graf graf--p graf-after--p">Both tools support a wide range of operating systems, including Windows, macOS, and Linux. The installation and configuration are relatively simple and can be done using tools such as Chocolatey and apt-get, as we will see below. let’s take a closer look at each tool:&lt;/p>&lt;h4 name="43ab" id="43ab" class="graf graf--h4 graf-after--p">What is Bicep CLI?&lt;/h4>&lt;h4 name="89a9" id="89a9" class="graf graf--h4 graf-after--h4">How does Bicep CLI works?&lt;/h4>&lt;p name="77eb" id="77eb" class="graf graf--p graf-after--h4">Bicep CLI is part of Azure CLI, which is a tool for managing Azure resources only. One of the great things about Azure CLI is its flexibility and ease of use. It allows the use of declarative and imperative approaches when interacting with resources, although, for declarative, it is necessary to combine its use with Azure Bicep. Azure CLI and Bicep are easy to install using tools like Chocolatey and apt-get.&lt;/p>&lt;h4 name="9a2d" id="9a2d" class="graf graf--h4 graf-after--p">What is Terraform CLI?&lt;/h4>&lt;p name="455d" id="455d" class="graf graf--p graf-after--h4">Terraform CLI allows the declarative approach through terraform files, not being possible to interact with cloud resources directly. While it may have fewer capabilities than Azure CLI, Terraform is extremely flexible and supports a wide range of cloud providers, including Azure, AWS, GCP, and even VMWare. Like Azure CLI, Terraform CLI is easy to install using tools like Chocolatey and apt-get. &lt;/p>&lt;h3 name="49b1" id="49b1" class="graf graf--h3 graf-after--p">How to install and configure Azure Bicep 💪and Azure CLI&lt;/h3>&lt;h4 name="9840" id="9840" class="graf graf--h4 graf-after--h3">How to install Azure CLI locally on Windows using Chocolatey&lt;/h4>&lt;p name="4619" id="4619" class="graf graf--p graf-after--h4">The installation script below does the following:&lt;/p>&lt;ol class="postList">&lt;li name="4b3a" id="4b3a" class="graf graf--li graf-after--p">Checks if Chocolatey is installed, and install it if it’s not already installed.&lt;/li>&lt;li name="f75d" id="f75d" class="graf graf--li graf-after--li">Installs the Azure CLI package using Chocolatey.&lt;/li>&lt;li name="d493" id="d493" class="graf graf--li graf-after--li">Verifies the installation by running &lt;code class="markup--code markup--li-code">az --version&lt;/code>.&lt;/li>&lt;/ol>&lt;figure name="2835" id="2835" class="graf graf--figure graf--iframe graf-after--li">&lt;script src="https://gist.github.com/wesleycamargo/5d2fc2ed0e020fcf6109b0886e9d837c?file=azurecli-chocolatey-install.ps1.js">&lt;/script>&lt;/figure>&lt;p name="cccf" id="cccf" class="graf graf--p graf-after--figure">To use this script, simply copy and paste it into a file with a &lt;code class="markup--code markup--p-code">.ps1&lt;/code> extension (e.g. &lt;code class="markup--code markup--p-code">install-azure-cli.ps1&lt;/code>), open a PowerShell prompt as administrator, navigate to the directory where the script is saved, and run it using the command &lt;code class="markup--code markup--p-code">.\install-azure-cli.ps1&lt;/code>. Note that you may need to modify your execution policy to run PowerShell scripts - you can do this by running &lt;code class="markup--code markup--p-code">Set-ExecutionPolicy RemoteSigned&lt;/code> or &lt;code class="markup--code markup--p-code">Set-ExecutionPolicy Unrestricted&lt;/code> from an elevated PowerShell prompt.&lt;/p>&lt;h4 name="dde7" id="dde7" class="graf graf--h4 graf-after--p">How to install Azure CLI on Linux using apt-get&lt;/h4>&lt;p name="bcac" id="bcac" class="graf graf--p graf-after--h4">The installation script using apt-get has a few more steps than using choco, and does the following:&lt;/p>&lt;ol class="postList">&lt;li name="eb03" id="eb03" class="graf graf--li graf-after--p">Updates the package list&lt;/li>&lt;li name="79cc" id="79cc" class="graf graf--li graf-after--li">Installs the necessary dependencies&lt;/li>&lt;li name="7e9e" id="7e9e" class="graf graf--li graf-after--li">Downloads and adds the Microsoft signing key to the trusted keyring&lt;/li>&lt;li name="7ff2" id="7ff2" class="graf graf--li graf-after--li">Adds the Azure CLI software repository to the sources list&lt;/li>&lt;li name="8d03" id="8d03" class="graf graf--li graf-after--li">Updates the package list again, and installs the Azure CLI&lt;/li>&lt;li name="1963" id="1963" class="graf graf--li graf-after--li">Verifies the installation by running &lt;code class="markup--code markup--li-code">az --version&lt;/code>&lt;/li>&lt;/ol>&lt;figure name="2cf7" id="2cf7" class="graf graf--figure graf--iframe graf-after--li">&lt;script src="https://gist.github.com/wesleycamargo/5d2fc2ed0e020fcf6109b0886e9d837c?file=azurecli-aptget-install.sh.js">&lt;/script>&lt;/figure>&lt;p name="d23e" id="d23e" class="graf graf--p graf-after--figure">To use this script, simply copy and paste it into a file, save the file with a &lt;code class="markup--code markup--p-code">.sh&lt;/code> extension (e.g. &lt;code class="markup--code markup--p-code">install-azure-cli.sh&lt;/code>), make it executable using &lt;code class="markup--code markup--p-code">chmod +x install-azure-cli.sh&lt;/code>, and then run it with &lt;code class="markup--code markup--p-code">./install-azure-cli.sh&lt;/code>.&lt;/p>&lt;h3 name="c0fa" id="c0fa" class="graf graf--h3 graf-after--p">How to install and configure Terraform CLI&lt;/h3>&lt;h4 name="97ea" id="97ea" class="graf graf--h4 graf-after--h3">How to install Terraform CLI on Windows using Chocolatey&lt;/h4>&lt;p name="04f9" id="04f9" class="graf graf--p graf-after--h4">Installing Terraform CLI with Chocolatey is simple and can be done with the script below:&lt;/p>&lt;figure name="8bed" id="8bed" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/5d2fc2ed0e020fcf6109b0886e9d837c?file=terraformcli-chocolatey-install.ps1.js">&lt;/script>&lt;/figure>&lt;p name="8007" id="8007" class="graf graf--p graf-after--figure">To run the script check the Azure CLI session above😉.&lt;/p>&lt;h4 name="4c59" id="4c59" class="graf graf--h4 graf-after--p">How to install Terraform CLI on Linux using apt-get&lt;/h4>&lt;p name="8c40" id="8c40" class="graf graf--p graf-after--h4">The installation of Terraform CLI on Linux is simple as the Azure CLI. Below we can see the script for that. The instructions to run this script are also the same a for Azure CLI.&lt;/p>&lt;figure name="1352" id="1352" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/5d2fc2ed0e020fcf6109b0886e9d837c?file=terraformcli-aptget-install.sh.js">&lt;/script>&lt;/figure>&lt;p name="2828" id="2828" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;h3 name="ff43" id="ff43" class="graf graf--h3 graf-after--p">Overview of Azure CLI&lt;/h3>&lt;ul class="postList">&lt;li name="e392" id="e392" class="graf graf--li graf-after--h3">Explanation of Azure CLI and its capabilities&lt;/li>&lt;li name="444e" id="444e" class="graf graf--li graf-after--li">Benefits and drawbacks of using Azure CLI&lt;/li>&lt;li name="5c33" id="5c33" class="graf graf--li graf-after--li">Examples of Azure CLI commands and how they are used&lt;/li>&lt;/ul>&lt;h3 name="26a5" id="26a5" class="graf graf--h3 graf-after--li">Overview of Terraform CLI&lt;/h3>&lt;ul class="postList">&lt;li name="5c7c" id="5c7c" class="graf graf--li graf-after--h3">Explanation of Terraform CLI and its capabilities&lt;/li>&lt;li name="d23b" id="d23b" class="graf graf--li graf-after--li">Benefits and drawbacks of using Terraform CLI&lt;/li>&lt;li name="2218" id="2218" class="graf graf--li graf-after--li">Examples of Terraform CLI commands and how they are used&lt;/li>&lt;/ul>&lt;p name="e7cb" id="e7cb" class="graf graf--p graf--empty graf-after--li">&lt;br>&lt;/p>&lt;h3 name="3d02" id="3d02" class="graf graf--h3 graf-after--p">Comparison of Terraform CLI and Azure CLI&lt;/h3>&lt;ul class="postList">&lt;li name="45d9" id="45d9" class="graf graf--li graf-after--h3">Comparison of syntax and language used by both tools&lt;/li>&lt;li name="dcfb" id="dcfb" class="graf graf--li graf-after--li">Comparison of how they handle state management and version control&lt;/li>&lt;li name="17f3" id="17f3" class="graf graf--li graf-after--li">Comparison of available resources and integrations&lt;/li>&lt;li name="5d2b" id="5d2b" class="graf graf--li graf-after--li">Explanation of which tool may be more suitable for certain scenarios&lt;/li>&lt;/ul>&lt;h3 name="6a25" id="6a25" class="graf graf--h3 graf-after--li">Conclusion&lt;/h3>&lt;ul class="postList">&lt;li name="74ac" id="74ac" class="graf graf--li graf-after--h3">Recap of main points and differences between Terraform CLI and Azure CLI&lt;/li>&lt;li name="ed9a" id="ed9a" class="graf graf--li graf-after--li">Final thoughts on which tool may be best for different use cases.&lt;/li>&lt;/ul>&lt;p name="959d" id="959d" class="graf graf--p graf--empty graf-after--li graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/6750a931e0de">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_git---devops-6b7b751e304e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_git---devops-6b7b751e304e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Git &amp;amp; DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Git &amp;amp; DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="72b5" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="049d" id="049d" class="graf graf--h3 graf--leading graf--title">Git &amp;amp; DevOps&lt;/h3>&lt;p name="4851" id="4851" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="8412" id="8412" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;figure name="9076" id="9076" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*AqZY3NezyYrTnxU6U8cGPg.png" data-width="1136" data-height="705" src="https://cdn-images-1.medium.com/max/800/1*AqZY3NezyYrTnxU6U8cGPg.png">&lt;/figure>&lt;figure name="c648" id="c648" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*Qa9vY7qbWSsJiCtxO1TrJw.png" data-width="1164" data-height="817" src="https://cdn-images-1.medium.com/max/800/1*Qa9vY7qbWSsJiCtxO1TrJw.png">&lt;/figure>&lt;p name="f932" id="f932" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/6b7b751e304e">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_github-codespaces-ed7ef2a72aec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_github-codespaces-ed7ef2a72aec/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>GitHub CodeSpaces&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">GitHub CodeSpaces&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
GitHub Codespaces overview — GitHub Docs
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="f113" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="b0d7" id="b0d7" class="graf graf--h3 graf--leading graf--title">GitHub CodeSpaces&lt;/h3>&lt;p name="cb27" id="cb27" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="33cc" id="33cc" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="ae4a" id="ae4a" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.github.com/en/codespaces/overview" data-href="https://docs.github.com/en/codespaces/overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">GitHub Codespaces overview — GitHub Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/ed7ef2a72aec">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_helm-charts-sheet-cheat-871c50f6801d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_helm-charts-sheet-cheat-871c50f6801d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Helm Charts Sheet Cheat&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Helm Charts Sheet Cheat&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Install Helm on Windows:
choco install kubernetes-helm
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="d5ed" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="7c48" id="7c48" class="graf graf--h3 graf--leading graf--title">Helm Charts Sheet Cheat&lt;/h3>&lt;p name="ff75" id="ff75" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="7f0a" id="7f0a" class="graf graf--p graf-after--p">Install Helm on Windows:&lt;br>&lt;code class="markup--code markup--p-code">choco install kubernetes-helm&lt;/code> &lt;/p>&lt;p name="20d8" id="20d8" class="graf graf--p graf-after--p">Helm Repositories&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="sql" name="7dcb" id="7dcb" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">helm repo &lt;span class="hljs-keyword">add&lt;/span> &lt;span class="hljs-operator">&amp;lt;&lt;/span>repo&lt;span class="hljs-operator">-&lt;/span>name&lt;span class="hljs-operator">&amp;gt;&lt;/span> &lt;span class="hljs-operator">&amp;lt;&lt;/span>url&lt;span class="hljs-operator">&amp;gt;&lt;/span> # &lt;span class="hljs-keyword">Add&lt;/span> a repository &lt;span class="hljs-keyword">from&lt;/span> the internet:&lt;br />helm repo list&lt;/span>&lt;/pre>&lt;p name="9be7" id="9be7" class="graf graf--p graf-after--pre">Install Kubectl&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="typescript" name="e7c3" id="e7c3" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">choco install kubernetes-cli&lt;br />choco install kubelogin&lt;/span>&lt;/pre>&lt;p name="2d69" id="2d69" class="graf graf--p graf-after--pre">AKS&lt;/p>&lt;p name="7a01" id="7a01" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">-A&lt;/code> means all namespaces&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="sql" name="10ce" id="10ce" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content"># &lt;span class="hljs-keyword">Get&lt;/span> everything &lt;span class="hljs-keyword">in&lt;/span> &lt;span class="hljs-keyword">all&lt;/span> Namespaces (&lt;span class="hljs-operator">-&lt;/span>A)&lt;br />kubectl &lt;span class="hljs-keyword">get&lt;/span> &lt;span class="hljs-keyword">all&lt;/span> &lt;span class="hljs-operator">-&lt;/span>A&lt;br />&lt;br /># &lt;span class="hljs-keyword">Get&lt;/span> namespaces&lt;br /> kubectl &lt;span class="hljs-keyword">get&lt;/span> namespace&lt;br /> kubectl &lt;span class="hljs-keyword">get&lt;/span> ns&lt;br />&lt;br /># &lt;span class="hljs-keyword">Get&lt;/span> deployments&lt;br />kubectl &lt;span class="hljs-keyword">get&lt;/span> deployment&lt;br />&lt;br /># &lt;span class="hljs-keyword">Delete&lt;/span> deployment&lt;br />kubectl &lt;span class="hljs-keyword">delete&lt;/span> deployment &lt;span class="hljs-operator">&amp;lt;&lt;/span>deployment name&lt;span class="hljs-operator">&amp;gt;&lt;/span> &lt;span class="hljs-operator">-&lt;/span>n &lt;span class="hljs-operator">&amp;lt;&lt;/span>namespace&lt;span class="hljs-operator">&amp;gt;&lt;/span>&lt;br />&lt;br /># &lt;span class="hljs-keyword">Create&lt;/span> certificate secret&lt;br />kubectl &lt;span class="hljs-keyword">create&lt;/span> secret tls &lt;span class="hljs-operator">&amp;lt;&lt;/span>secret name&lt;span class="hljs-operator">&amp;gt;&lt;/span> &lt;span class="hljs-comment">--cert=&amp;lt;path to crt certificate&amp;gt; --key=&amp;lt;path to certificate key&amp;gt; -n &amp;lt;namespace&amp;gt;&lt;/span>&lt;/span>&lt;/pre>&lt;p name="25f3" id="25f3" class="graf graf--p graf--empty graf-after--pre graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/871c50f6801d">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-achieve-devops-in-your-company-eac1b3fea904/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-achieve-devops-in-your-company-eac1b3fea904/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to achieve DevOps in your company&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to achieve DevOps in your company&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Goals
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="85f8" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="d9d1" id="d9d1" class="graf graf--h3 graf--leading graf--title">How to achieve DevOps in your company&lt;/h3>&lt;p name="81d3" id="81d3" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="7af3" id="7af3" class="graf graf--h3 graf-after--p">Goals&lt;/h3>&lt;p name="1b90" id="1b90" class="graf graf--p graf-after--h3">&lt;a href="https://docs.microsoft.com/en-us/learn/modules/introduce-foundation-pillars-devops/2-discover-devops" data-href="https://docs.microsoft.com/en-us/learn/modules/introduce-foundation-pillars-devops/2-discover-devops" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Discover DevOps — Learn | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="fcec" id="fcec" class="graf graf--p graf-after--p">&lt;a href="https://azure.microsoft.com/en-gb/overview/what-is-devops/#devops-overview" data-href="https://azure.microsoft.com/en-gb/overview/what-is-devops/#devops-overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">What is DevOps? DevOps explained | Microsoft Azure&lt;/a>&lt;/p>&lt;p name="5a09" id="5a09" class="graf graf--p graf-after--p">Planning&lt;/p>&lt;p name="5f10" id="5f10" class="graf graf--p graf-after--p">Integration&lt;/p>&lt;p name="0301" id="0301" class="graf graf--p graf-after--p">Delivery&lt;/p>&lt;p name="7235" id="7235" class="graf graf--p graf-after--p">Operations&lt;/p>&lt;h3 name="2938" id="2938" class="graf graf--h3 graf-after--p">DevOps Goals&lt;/h3>&lt;p name="612e" id="612e" class="graf graf--p graf-after--h3">It is common that people think about DevOps as automated deployment. Indeed, one of the goals in DevOps is to have as many automated processes as possible, but DevOps goes ways beyond that.&lt;/p>&lt;p name="fee2" id="fee2" class="graf graf--p graf-after--p">The main objective of DevOps is to enable the ability to &lt;strong class="markup--strong markup--p-strong">deliver value&lt;/strong> through the union of People, Processes and Tools with quality and speed.&lt;/p>&lt;p name="9e07" id="9e07" class="graf graf--p graf-after--p">To achieve this goal, just automation is not enough. You need to change processes and people&amp;#39;s mindsets. This is very related to Agile and Lean mindsets, and in my point of view, DevOps complements them. If a team has a Definition of Done that all tests must pass in a QA environment, it does not deliver real value to his company or client. &lt;strong class="markup--strong markup--p-strong">The real value comes when the code is working in the Production environment.&lt;/strong>&lt;/p>&lt;p name="9b06" id="9b06" class="graf graf--p graf-after--p graf--trailing">So how to build a DevOps culture in your organization?&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="c01f" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="8ae5" id="8ae5" class="graf graf--h3 graf--leading">&lt;strong class="markup--strong markup--h3-strong">How to evolve DevOps as a capability for my teams?&lt;/strong>&lt;/h3>&lt;p name="d794" id="d794" class="graf graf--p graf-after--h3">In my experiences working with many clients, the most successful results come from the cases that we treat DevOps as a capability to be evolved inside the teams, than those that consider DevOps a person inside the team responsible for releases or automation.&lt;/p>&lt;p name="320f" id="320f" class="graf graf--p graf-after--p">By definition, DevOps is the union of Development and Operations. So have just one person to create this bridge will not work in a long term. The “DevOps resource” will become a carrier pigeon, and both, Development and Operations teams will not evolve the practices and achieve the integration desired.&lt;/p>&lt;h4 name="17ce" id="17ce" class="graf graf--h4 graf-after--p">Start DevOps as resources&lt;/h4>&lt;p name="b86c" id="b86c" class="graf graf--p graf-after--h4">When a team has someone with DevOps expertise, the tendency is that all activities related to releases, be it deployment automation or even releases that are done manually will be done or coordinated by this DevOps person. On one hand, this is very nice to understand the project&amp;#39;s big picture, identify the best processes that are candidates to automation watching which ones are more painful and susceptible to errors, but the dark side of it is that this person will become a bottleneck soon or later.&lt;/p>&lt;p name="8dd9" id="8dd9" class="graf graf--p graf-after--p">Another negative point is the tendency to work isolated. Each team creates your own deployment solutions or processes, and it means that you can spend too much time on one solution, and next week another team can also spend too much time on a solution for the same problem. &lt;/p>&lt;h4 name="e9c9" id="e9c9" class="graf graf--h4 graf-after--p">Moving to a DevOps enabler strategy&lt;/h4>&lt;p name="1b44" id="1b44" class="graf graf--p graf-after--h4">The ace in the sleeve is to have DevOps enablers and not DevOps resources inside the team. It looks similar but there is a big difference there.&lt;/p>&lt;h3 name="8345" id="8345" class="graf graf--h3 graf-after--p">Implementation Stages&lt;/h3>&lt;p name="9bdc" id="9bdc" class="graf graf--p graf-after--h3">To achieve DevOps, you need to have in place a series of practices that are very related to Agile development and Lean. It means that you need to think of DevOps as culture much more than automated deployments. &lt;/p>&lt;h4 name="1864" id="1864" class="graf graf--h4 graf-after--p">Exploration — Understanding the current scenario&lt;/h4>&lt;p name="07e2" id="07e2" class="graf graf--p graf-after--h4">When you are start&lt;/p>&lt;ul class="postList">&lt;li name="bd04" id="bd04" class="graf graf--li graf-after--p">Manual activities&lt;/li>&lt;/ul>&lt;h4 name="5efa" id="5efa" class="graf graf--h4 graf-after--li">Advocating — Promoting DevOps practices into the teams&lt;/h4>&lt;ul class="postList">&lt;li name="5cf6" id="5cf6" class="graf graf--li graf-after--h4">Automation&lt;/li>&lt;/ul>&lt;h4 name="b679" id="b679" class="graf graf--h4 graf-after--li">Supporting — Support teams to be autonomous&lt;/h4>&lt;p name="fb2d" id="fb2d" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;p name="022a" id="022a" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="41e2" id="41e2" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="a345" id="a345" class="graf graf--p graf-after--p">Pessoas&lt;/p>&lt;p name="4857" id="4857" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="9b5c" id="9b5c" class="graf graf--p graf-after--p">Processos&lt;/p>&lt;p name="747c" id="747c" class="graf graf--p graf-after--p graf--trailing">Ferramentas&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/eac1b3fea904">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-configure-environments-on-azure-devops-yaml-pipelines-2dc7e2fd69a6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-configure-environments-on-azure-devops-yaml-pipelines-2dc7e2fd69a6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to configure environments on Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to configure environments on Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="3dbb" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="00fa" id="00fa" class="graf graf--h3 graf--leading graf--title">How to configure environments on Azure DevOps YAML Pipelines&lt;/h3>&lt;p name="b7a7" id="b7a7" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/2dc7e2fd69a6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-configure-environments-with-azure-devops-yaml-pipelines-c649018e2c9e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-configure-environments-with-azure-devops-yaml-pipelines-c649018e2c9e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to configure environments with Azure DevOps YAML Pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to configure environments with Azure DevOps YAML Pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
What are environments on Azure DevOps?
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="8941" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5dc8" id="5dc8" class="graf graf--h3 graf--leading graf--title">How to configure environments with Azure DevOps YAML Pipelines&lt;/h3>&lt;p name="4664" id="4664" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="b0c4" id="b0c4" class="graf graf--h3 graf-after--p">What are environments on Azure DevOps?&lt;/h3>&lt;p name="207d" id="207d" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="cd5d" id="cd5d" class="graf graf--h3 graf-after--p">Creating an environment on Azure DevOps&lt;/h3>&lt;p name="d2f2" id="d2f2" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h4 name="d420" id="d420" class="graf graf--h4 graf-after--p">Approvals and Checks&lt;/h4>&lt;figure name="af84" id="af84" class="graf graf--figure graf-after--h4">&lt;img class="graf-image" data-image-id="1*j597XRG61auB-RQ4eHTbYw.png" data-width="489" data-height="699" src="https://cdn-images-1.medium.com/max/800/1*j597XRG61auB-RQ4eHTbYw.png">&lt;/figure>&lt;h3 name="bd7a" id="bd7a" class="graf graf--h3 graf--empty graf-after--figure">&lt;br>&lt;/h3>&lt;h3 name="8981" id="8981" class="graf graf--h3 graf-after--h3">Referencing an environment in Azure DevOps YAML Pipeline&lt;/h3>&lt;h3 name="9dd9" id="9dd9" class="graf graf--h3 graf--empty graf-after--h3">&lt;br>&lt;/h3>&lt;h3 name="f5a1" id="f5a1" class="graf graf--h3 graf-after--h3">Giving permission to Azure DevOps Pipelines into environments&lt;/h3>&lt;p name="7d09" id="7d09" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;figure name="6f7a" id="6f7a" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*2ZaaIidz0ks5Pj1VJKFqUA.png" data-width="821" data-height="335" src="https://cdn-images-1.medium.com/max/800/1*2ZaaIidz0ks5Pj1VJKFqUA.png">&lt;/figure>&lt;figure name="3400" id="3400" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*oCESOqaHynwY1ZMl3wwYYw.png" data-width="488" data-height="200" src="https://cdn-images-1.medium.com/max/800/1*oCESOqaHynwY1ZMl3wwYYw.png">&lt;/figure>&lt;figure name="9045" id="9045" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*fLRiYh1dFxI0WPBn8mv2RQ.png" data-width="492" data-height="188" src="https://cdn-images-1.medium.com/max/800/1*fLRiYh1dFxI0WPBn8mv2RQ.png">&lt;/figure>&lt;h3 name="e194" id="e194" class="graf graf--h3 graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/c649018e2c9e">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-create-an-azure-function-f5420cfa16f6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-create-an-azure-function-f5420cfa16f6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to create an Azure function&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to create an Azure function&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="38f0" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="fc85" id="fc85" class="graf graf--h3 graf--leading graf--title">How to create an Azure function&lt;/h3>&lt;p name="888f" id="888f" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/f5420cfa16f6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-delete-all-resources-with-specific-tag-azure-cli-powershell-176da97e0861/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-delete-all-resources-with-specific-tag-azure-cli-powershell-176da97e0861/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to delete all resources with specific tag Azure CLI PowerShell&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to delete all resources with specific tag Azure CLI PowerShell&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="9a78" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="cf87" id="cf87" class="graf graf--h3 graf--leading graf--title">How to delete all resources with specific tag Azure CLI PowerShell&lt;/h3>&lt;p name="9fa7" id="9fa7" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="035f" id="035f" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;pre name="d4ad" id="d4ad" class="graf graf--pre graf-after--p">az group list --query &amp;quot;[?tags.automationToolkit == &amp;#39;true&amp;#39; &amp;amp;&amp;amp; tags.example == &amp;#39;true&amp;#39;].name&amp;quot; -o tsv | ForEach-Object { Write-Host &amp;quot;Removing resource $_&amp;quot;; az group delete --no-wait --yes -n $_ }&lt;/pre>&lt;p name="17e9" id="17e9" class="graf graf--p graf--empty graf-after--pre graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/176da97e0861">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-delete-unused-resources-in-azure-data-factory-during-deployment-79d5dad2a017/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-delete-unused-resources-in-azure-data-factory-during-deployment-79d5dad2a017/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to delete unused resources in Azure Data Factory during deployment&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to delete unused resources in Azure Data Factory during deployment&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Continuous integration and delivery pre- and post-deployment scripts — Azure Data Factory | Microsoft Docs
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="105e" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="2cb0" id="2cb0" class="graf graf--h3 graf--leading graf--title">How to delete unused resources in Azure Data Factory during deployment&lt;/h3>&lt;p name="53a0" id="53a0" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="525d" id="525d" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="725b" id="725b" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-delivery-sample-script" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-delivery-sample-script" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Continuous integration and delivery pre- and post-deployment scripts — Azure Data Factory | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/79d5dad2a017">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-enable-azure-load-balancer-high-availability-ports-with-terraform-9e7cda5f40a8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-enable-azure-load-balancer-high-availability-ports-with-terraform-9e7cda5f40a8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to enable Azure Load Balancer High Availability Ports with Terraform&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to enable Azure Load Balancer High Availability Ports with Terraform&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="dd9a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="aca8" id="aca8" class="graf graf--h3 graf--leading graf--title">How to enable Azure Load Balancer High Availability Ports with Terraform&lt;/h3>&lt;p name="d4c0" id="d4c0" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="00f6" id="00f6" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/9e7cda5f40a8">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-extend-an-azure-devops-yaml-pipeline-template-from-different-repository-3943bd059e9b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-extend-an-azure-devops-yaml-pipeline-template-from-different-repository-3943bd059e9b/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to extend an Azure DevOps YAML Pipeline Template from different repository&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to extend an Azure DevOps YAML Pipeline Template from different repository&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
How to extend an Azure DevOps YAML Pipeline Template from different repository
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="019a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9442" id="9442" class="graf graf--h3 graf--leading graf--title">How to extend an Azure DevOps YAML Pipeline Template from different repository&lt;/h3>&lt;p name="0caa" id="0caa" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="3c56" id="3c56" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="4066" id="4066" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h3 name="10d3" id="10d3" class="graf graf--h3 graf-after--p">How to extend an Azure DevOps YAML Pipeline Template from different repository&lt;/h3>&lt;p name="c9f8" id="c9f8" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/3943bd059e9b">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-install-and-setup-git-2053828595e3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-install-and-setup-git-2053828595e3/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to install and setup Git&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to install and setup Git&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
How to install git on Windows
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="da58" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="0909" id="0909" class="graf graf--h3 graf--leading graf--title">How to install and setup Git&lt;/h3>&lt;p name="a9b3" id="a9b3" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="b36e" id="b36e" class="graf graf--h3 graf-after--p">How to install git on Windows&lt;/h3>&lt;p name="4664" id="4664" class="graf graf--p graf-after--h3">&lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" data-href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Git — Installing Git (git-scm.com)&lt;/a>&lt;/p>&lt;h4 name="7b6f" id="7b6f" class="graf graf--h4 graf-after--p">How to install git on Windows with winget&lt;/h4>&lt;p name="7c9c" id="7c9c" class="graf graf--p graf-after--h4">In Windows 11 and newer versions of Windows 10 Winget is already installed, if you are running an older version, you can install it from &lt;a href="https://apps.microsoft.com/store/detail/app-installer/9NBLGGH4NNS1?hl=en-us&amp;amp;gl=us" data-href="https://apps.microsoft.com/store/detail/app-installer/9NBLGGH4NNS1?hl=en-us&amp;amp;gl=us" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">App Installer — Microsoft Store Apps&lt;/a>.&lt;/p>&lt;p name="d5d8" id="d5d8" class="graf graf--p graf-after--p">After that, you just need to run the command below:&lt;/p>&lt;figure name="626b" id="626b" class="graf graf--figure graf--iframe graf-after--p">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=git-install-winget.ps1.js">&lt;/script>&lt;/figure>&lt;figure name="46b5" id="46b5" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*Rn3f2bLmZ04iM15iB2_c7g.png" data-width="1330" data-height="730" src="https://cdn-images-1.medium.com/max/800/1*Rn3f2bLmZ04iM15iB2_c7g.png">&lt;/figure>&lt;p name="74bb" id="74bb" class="graf graf--p graf-after--figure">It might be necessary close and reopen the terminal session&lt;/p>&lt;h4 name="9c02" id="9c02" class="graf graf--h4 graf-after--p">How to install git on Windows using choco&lt;/h4>&lt;figure name="c3e1" id="c3e1" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=git-install-choco.ps1.js">&lt;/script>&lt;/figure>&lt;figure name="30a1" id="30a1" class="graf graf--figure graf-after--figure">&lt;img class="graf-image" data-image-id="1*n_lAcHewgubjgsb-KeoXLw.png" data-width="482" data-height="187" src="https://cdn-images-1.medium.com/max/800/1*n_lAcHewgubjgsb-KeoXLw.png">&lt;/figure>&lt;h3 name="28a1" id="28a1" class="graf graf--h3 graf-after--figure">How to setup git credentials&lt;/h3>&lt;h4 name="1fdc" id="1fdc" class="graf graf--h4 graf-after--h3">How to setup git username and email&lt;/h4>&lt;figure name="4877" id="4877" class="graf graf--figure graf--iframe graf-after--h4">&lt;script src="https://gist.github.com/wesleycamargo/540ab9e5cd753be6409273a82f455d64?file=git-config-user.ps1.js">&lt;/script>&lt;/figure>&lt;h3 name="b137" id="b137" class="graf graf--h3 graf-after--figure">How to setup vscode as the default git editor&lt;/h3>&lt;p name="b3fc" id="b3fc" class="graf graf--p graf-after--h3">Installing vscode&lt;/p>&lt;p name="d6d0" id="d6d0" class="graf graf--p graf-after--p">How to create an alias on git&lt;/p>&lt;p name="17b0" id="17b0" class="graf graf--p graf-after--p graf--trailing">Linked post: How to create an alias for gitlog&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/2053828595e3">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-monitor-azure-resources-with-scom-f63122b2b65b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-monitor-azure-resources-with-scom-f63122b2b65b/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to monitor Azure Resources with SCOM&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to monitor Azure Resources with SCOM&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="ffa4" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="b1cf" id="b1cf" class="graf graf--h3 graf--leading graf--title">How to monitor Azure Resources with SCOM&lt;/h3>&lt;p name="43e4" id="43e4" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/f63122b2b65b">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_how-to-use-azure-devops-yaml-pipelines-templates-bf7329030e78/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_how-to-use-azure-devops-yaml-pipelines-templates-bf7329030e78/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>How to use Azure DevOps YAML Pipelines Templates&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">How to use Azure DevOps YAML Pipelines Templates&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
The easiest way to take over control of your deployments
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="2b5a" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="e2fe" id="e2fe" class="graf graf--h3 graf--leading graf--title">How to use Azure DevOps YAML Pipelines Templates&lt;/h3>&lt;p name="76c7" id="76c7" class="graf graf--p graf-after--h3">The easiest way to take over control of your deployments&lt;/p>&lt;p name="28f6" id="28f6" class="graf graf--p graf-after--p">You can be a Developer a DevOps Engineer or an Operations guy, but if you need to maintain several applications in production certainly you faced a lot of problems. I have good news for you! There is an easy way to take over the control of your CI/CD process, and templates are the answer for that…&lt;/p>&lt;h3 name="adb8" id="adb8" class="graf graf--h3 graf-after--p">Pipeline as Code&lt;/h3>&lt;h4 name="8a95" id="8a95" class="graf graf--h4 graf-after--h3">What is “as Code” mean?&lt;/h4>&lt;p name="a8b5" id="a8b5" class="graf graf--p graf-after--h4">In the last years the concept of “As Code” is being adopted for all sorts of components. The most common scenario to use it is with Infrastructure as Code aka IaC, but if you are tuned in to the best practices related to the technology world maybe you also heard about Database as Code, Configuration as Code, and why not Pipeline as Code as well?&lt;/p>&lt;p name="7bf6" id="7bf6" class="graf graf--p graf-after--p">As code means that you keep all configurations under a Source Control, and you can apply the same practices as in a traditional application, like versions, tags, and tests for example.&lt;/p>&lt;h4 name="fcfe" id="fcfe" class="graf graf--h4 graf-after--p">Prerequisites for Pipeline as Code&lt;/h4>&lt;p name="8d19" id="8d19" class="graf graf--p graf-after--h4">&lt;strong class="markup--strong markup--p-strong">Version Control System&lt;/strong> - To start you need to choose a Version Control System, most probably a git-based one, like GitHub, Azure Repos, or GitLab.&lt;/p>&lt;p name="e1fc" id="e1fc" class="graf graf--p graf-after--p">&lt;strong class="markup--strong markup--p-strong">Continuous Deployment Tool&lt;/strong> - You will also need to choose a CI/CD tool with support to Pipeline as Code. The most known tools for that are GitHub Actions and Azure DevOps YAML Pipelines. In this post, I will use Azure DevOps YAML Pipeline to show how to use the benefits of the Pipeline as Code.&lt;/p>&lt;h3 name="9e2e" id="9e2e" class="graf graf--h3 graf-after--p">Azure DevOps YAML Pipelines Templates&lt;/h3>&lt;p name="3015" id="3015" class="graf graf--p graf-after--h3">YAML Templates are a smart way to create your pipelines. The most advantageous characteristics are:&lt;/p>&lt;ul class="postList">&lt;li name="5b39" id="5b39" class="graf graf--li graf-after--p">It allows to break down the pipelines into small pieces.&lt;/li>&lt;li name="b285" id="b285" class="graf graf--li graf-after--li">You can call in your main pipelines, but it also supports nested insertions.&lt;/li>&lt;li name="4e20" id="4e20" class="graf graf--li graf-after--li">Control of what is allowed in the pipeline.&lt;/li>&lt;/ul>&lt;p name="bc5c" id="bc5c" class="graf graf--p graf-after--li">best practices in our deployment pipelines. &lt;/p>&lt;p name="f570" id="f570" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h4 name="c40d" id="c40d" class="graf graf--h4 graf-after--p">Single Responsibility Principle&lt;/h4>&lt;p name="9bc4" id="9bc4" class="graf graf--p graf-after--h4">As you can build small segments and insert them into a main pipeline, it allows the reusability of logic. &lt;/p>&lt;h4 name="44d4" id="44d4" class="graf graf--h4 graf-after--p">Dependency Inversion&lt;/h4>&lt;p name="cefd" id="cefd" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h4 name="7d7f" id="7d7f" class="graf graf--h4 graf-after--p">Declarative instead of imperative scripts&lt;/h4>&lt;h3 name="89c7" id="89c7" class="graf graf--h3 graf-after--h4">Inject Templates&lt;/h3>&lt;h3 name="dae2" id="dae2" class="graf graf--h3 graf-after--h3">Extend Templates&lt;/h3>&lt;p name="95fb" id="95fb" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="cf27" id="cf27" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/bf7329030e78">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_incrementing-versions-with-gitversion-98e566a44990/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_incrementing-versions-with-gitversion-98e566a44990/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Incrementing versions with GitVersion&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Incrementing versions with GitVersion&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="9272" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f07e" id="f07e" class="graf graf--h3 graf--leading graf--title">Incrementing versions with GitVersion&lt;/h3>&lt;p name="cb54" id="cb54" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="b7be" id="b7be" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;pre name="1e12" id="1e12" class="graf graf--pre graf-after--p">&lt;code class="markup--code markup--pre-code">choco install GitVersion.Portable&lt;/code>&lt;/pre>&lt;figure name="ee7c" id="ee7c" class="graf graf--figure graf-after--pre">&lt;img class="graf-image" data-image-id="1*p-fcIwFrqTrv42k-kPN1Zg.png" data-width="977" data-height="459" src="https://cdn-images-1.medium.com/max/800/1*p-fcIwFrqTrv42k-kPN1Zg.png">&lt;/figure>&lt;p name="9ccc" id="9ccc" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/98e566a44990">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_installing-argocd-into-aks-cluster-c9258cade56d/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_installing-argocd-into-aks-cluster-c9258cade56d/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Installing ArgoCD into AKS Cluster&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Installing ArgoCD into AKS Cluster&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Preparing Helm chart
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="88ce" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ae57" id="ae57" class="graf graf--h3 graf--leading graf--title">Installing ArgoCD into AKS Cluster&lt;/h3>&lt;p name="b687" id="b687" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="7f8c" id="7f8c" class="graf graf--h3 graf-after--p">Preparing Helm chart &lt;/h3>&lt;h4 name="9a3c" id="9a3c" class="graf graf--h4 graf-after--h3">How to get a Helm chart from Bitnami repository&lt;/h4>&lt;p name="e4a4" id="e4a4" class="graf graf--p graf-after--h4">Let’s add Bitnami repository and download the ArgoCD Helm chart :&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="81ae" id="81ae" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-built_in">mkdir&lt;/span> ~/argo-cd&lt;br />&lt;span class="hljs-built_in">cd&lt;/span> ~/argo-cd&lt;br />&lt;br />helm repo add argo https://argoproj.github.io/argo-helm&lt;br />helm pull argo/argo-cd&lt;/span>&lt;/pre>&lt;p name="a1a4" id="a1a4" class="graf graf--p graf-after--pre">Create namespace on AKS&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="5bc0" id="5bc0" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-comment"># Create Kubernetes Namespace&lt;/span>&lt;br />kubectl create ns argo-cd&lt;br />&lt;br />&lt;span class="hljs-comment"># Add Argo CD repository&lt;/span>&lt;br />helm repo add argo https://argoproj.github.io/argo-helm&lt;br />&lt;br />helm install argocd argo/argo-cd -n argo-cd&lt;/span>&lt;/pre>&lt;p name="a19f" id="a19f" class="graf graf--p graf-after--pre">Override configurations: &lt;/p>&lt;p name="e027" id="e027" class="graf graf--p graf-after--p">Get all configurations:&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="sql" name="0322" id="0322" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">helm &lt;span class="hljs-keyword">show&lt;/span> &lt;span class="hljs-keyword">values&lt;/span> argo&lt;span class="hljs-operator">/&lt;/span>argo&lt;span class="hljs-operator">-&lt;/span>cd &lt;span class="hljs-operator">&amp;gt;&lt;/span> values.yml&lt;/span>&lt;/pre>&lt;p name="a4ff" id="a4ff" class="graf graf--p graf-after--pre">&lt;br>Create an yaml file and fill according to the documentation on &lt;a href="https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd#argo-server" data-href="https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd#argo-server" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">argo-helm/charts/argo-cd at main · argoproj/argo-helm (github.com)&lt;/a>&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="yaml" name="c899" id="c899" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-attr">server:&lt;/span>&lt;br /> &lt;span class="hljs-attr">service:&lt;/span>&lt;br /> &lt;span class="hljs-attr">type:&lt;/span> &lt;span class="hljs-string">NodePort&lt;/span>&lt;br /> &lt;span class="hljs-attr">server.service.nodePortHttp:&lt;/span> &lt;span class="hljs-number">30080&lt;/span>&lt;br /> &lt;span class="hljs-attr">server.service.nodePortHttps:&lt;/span> &lt;span class="hljs-number">30443&lt;/span>&lt;/span>&lt;/pre>&lt;p name="2cb7" id="2cb7" class="graf graf--p graf-after--pre">Run the install command passing the file as parameter&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="9378" id="9378" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">helm install argocd argo/argo-cd -n argo-cd -f values-ingress.yaml&lt;/span>&lt;/pre>&lt;p name="fec9" id="fec9" class="graf graf--p graf-after--pre">Check the result:&lt;/p>&lt;h4 name="dcaf" id="dcaf" class="graf graf--h4 graf-after--p">NGINX&lt;/h4>&lt;p name="12b7" id="12b7" class="graf graf--p graf-after--h4">&lt;a href="https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx" data-href="https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">ingress-nginx/charts/ingress-nginx at main · kubernetes/ingress-nginx (github.com)&lt;/a>&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="csharp" name="0c94" id="0c94" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">&lt;span class="hljs-meta"># Create K8s workspace&lt;/span>&lt;br />kubectl create ns ingress-nginx&lt;br />&lt;br />&lt;span class="hljs-meta"># Nginx repo&lt;/span>&lt;br />helm repo &lt;span class="hljs-keyword">add&lt;/span> ingress-nginx https:&lt;span class="hljs-comment">//kubernetes.github.io/ingress-nginx&lt;/span>&lt;br />&lt;br />&lt;span class="hljs-meta"># Install Nginx chart&lt;/span>&lt;br />helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx&lt;br />&lt;br />kubectl -n ingress-nginx &lt;span class="hljs-keyword">get&lt;/span> pods&lt;br />&lt;br />&lt;span class="hljs-meta"># Show ingress service&lt;/span>&lt;br />kubectl -n ingress-nginx &lt;span class="hljs-keyword">get&lt;/span> svc&lt;/span>&lt;/pre>&lt;h4 name="8789" id="8789" class="graf graf--h4 graf-after--pre">How to add a Helm chart to Azure Container Registry&lt;/h4>&lt;p name="6c0b" id="6c0b" class="graf graf--p graf-after--h4">Lets first define a variable with the name of our ACR, do not add the &lt;code class="markup--code markup--p-code">.azurecr.io&lt;/code> , only the name:&lt;/p>&lt;p name="97bf" id="97bf" class="graf graf--p graf-after--p">&lt;code class="markup--code markup--p-code">ACR_NAME=&amp;lt;container registry name&amp;gt;&lt;/code>&lt;/p>&lt;p name="657a" id="657a" class="graf graf--p graf-after--p">To authenticate to Azure Container Registry using your EntraId we need first to login using &lt;code class="markup--code markup--p-code">az login&lt;/code> and get the password using the command below:&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="469b" id="469b" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">USER_NAME=”00000000–0000–0000–0000–000000000000&lt;span class="hljs-string">&amp;quot;&lt;br />PASSWORD=&lt;span class="hljs-subst">$(az acr login — name $ACR_NAME — expose-token — output tsv — query accessToken)&lt;/span>&lt;/span>&lt;/span>&lt;/pre>&lt;p name="31e4" id="31e4" class="graf graf--p graf-after--pre">Note that &lt;code class="markup--code markup--p-code">00000000–0000–0000–0000–000000000000&lt;/code> is not a placeholder and must be kept.&lt;/p>&lt;p name="f22e" id="f22e" class="graf graf--p graf-after--p">Now it’s time to run the command to authenticate:&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="bash" name="c67a" id="c67a" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">helm registry login &lt;span class="hljs-variable">$ACR_NAME&lt;/span>.azurecr.io \&lt;br /> --username &lt;span class="hljs-variable">$USER_NAME&lt;/span> \&lt;br /> --password &lt;span class="hljs-variable">$PASSWORD&lt;/span>&lt;/span>&lt;/pre>&lt;p name="1c9e" id="1c9e" class="graf graf--p graf-after--pre">And finally, push the chart to ACR:&lt;/p>&lt;pre data-code-block-mode="1" spellcheck="false" data-code-block-lang="perl" name="092c" id="092c" class="graf graf--pre graf-after--p graf--preV2">&lt;span class="pre--content">helm &lt;span class="hljs-keyword">push&lt;/span> argo-cd-&lt;span class="hljs-number">5.9&lt;/span>.&lt;span class="hljs-number">2&lt;/span>.tgz oci:&lt;span class="hljs-regexp">//&lt;/span>$ACR_NAME.azurecr.io/helm&lt;/span>&lt;/pre>&lt;p name="8e9f" id="8e9f" class="graf graf--p graf--empty graf-after--pre graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/c9258cade56d">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_introducing-azure-load-testing--optimize-app-performance-at-scale-83ee1daf0ba6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_introducing-azure-load-testing--optimize-app-performance-at-scale-83ee1daf0ba6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Introducing Azure Load Testing: Optimize app performance at scale&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Introducing Azure Load Testing: Optimize app performance at scale&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Introducing Azure Load Testing: Optimize app performance at scale | Azure Blog and Updates | Microsoft Azure
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="6b5e" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="f03d" id="f03d" class="graf graf--h3 graf--leading graf--title">Introducing Azure Load Testing: Optimize app performance at scale&lt;/h3>&lt;h3 name="f170" id="f170" class="graf graf--h3 graf-after--h3 graf--trailing">&lt;a href="https://azure.microsoft.com/en-us/blog/introducing-azure-load-testing-optimize-app-performance-at-scale/" data-href="https://azure.microsoft.com/en-us/blog/introducing-azure-load-testing-optimize-app-performance-at-scale/" class="markup--anchor markup--h3-anchor" rel="noopener" target="_blank">Introducing Azure Load Testing: Optimize app performance at scale | Azure Blog and Updates | Microsoft Azure&lt;/a>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/83ee1daf0ba6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_managed-identities-683ca9f654ef/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_managed-identities-683ca9f654ef/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Managed Identities&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Managed Identities&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
The problem with connection strings
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b2c9" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="78ce" id="78ce" class="graf graf--h3 graf--leading graf--title">Managed Identities&lt;/h3>&lt;p name="8cca" id="8cca" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="5bb8" id="5bb8" class="graf graf--h3 graf-after--p">The problem with connection strings&lt;/h3>&lt;p name="fbb5" id="fbb5" class="graf graf--p graf-after--h3">To communicate with resources in Azure your application might need to authenticate within Azure resources. An example is an App Service running a dotnet application that needs to connect to your Azure SQL Server.&lt;/p>&lt;p name="8288" id="8288" class="graf graf--p graf-after--p">Before the cloud, the most common way to access a database was through connection strings. In this approach usually, the applications have a configuration file containing the application settings necessary for the application run, and the connection string is stored there, among other configurations.&lt;/p>&lt;figure name="c0f8" id="c0f8" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*cJQif5xf571YKz1wBGsv8Q.png" data-width="417" data-height="262" src="https://cdn-images-1.medium.com/max/800/1*cJQif5xf571YKz1wBGsv8Q.png">&lt;/figure>&lt;p name="5368" id="5368" class="graf graf--p graf-after--figure">This process sometimes lacks security measures and the secret is stored in plain text in the configuration files, sometimes being under source control. Anyone with access to the environment or repositories has access to the connection string and can potentially use it for obscure objectives.&lt;/p>&lt;p name="71c8" id="71c8" class="graf graf--p graf-after--p">In more advanced cases, this process can be done through a CI/CD process which can retrieve automatically the connection string and store it in a vault, such as Azure Key Vault. But even with this process, as the connection string should be stored, there is always a risk that someone can find it. &lt;/p>&lt;p name="f185" id="f185" class="graf graf--p graf-after--p">This approach is still used in many resources on Azure such as Storage Accounts and Azure SQL. So how can we communicate with our resources in a more secure way?&lt;/p>&lt;h3 name="2a40" id="2a40" class="graf graf--h3 graf-after--p">Understanding Azure Active Directory Identities&lt;/h3>&lt;h3 name="f6cf" id="f6cf" class="graf graf--h3 graf-after--h3">Creating an Identity for the application&lt;/h3>&lt;p name="b8fb" id="b8fb" class="graf graf--p graf-after--h3">A quite elegant way to solve the connection string problem is creating an Identity for our application or resource that needs to communicate with other resources in Azure.&lt;/p>&lt;p name="92ef" id="92ef" class="graf graf--p graf-after--p">In this approach, we register the application in the Azure Active Directory tenant, allowing the integration between the application and Azure AD with a behavior similar to a service account.&lt;/p>&lt;p name="5957" id="5957" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="b3ac" id="b3ac" class="graf graf--p graf-after--p">Traditionally this communication is done through connection strings. This approach works fine but also has a security risk in that it can be leaked and also expires, being necessary a rotation process to avoid downtime of your application.&lt;/p>&lt;ul class="postList">&lt;li name="2047" id="2047" class="graf graf--li graf-after--p">Where to keep the connection string?&lt;/li>&lt;li name="6fea" id="6fea" class="graf graf--li graf-after--li">How to ensure that it is secured?&lt;/li>&lt;li name="1a23" id="1a23" class="graf graf--li graf-after--li">How to rotate them to avoid risks?&lt;/li>&lt;li name="f334" id="f334" class="graf graf--li graf-after--li">Who will handle the creation process and maintenance of the connection strings?&lt;/li>&lt;/ul>&lt;h3 name="3d42" id="3d42" class="graf graf--h3 graf-after--li">What are Service Principals?&lt;/h3>&lt;h3 name="82e7" id="82e7" class="graf graf--h3 graf-after--h3 graf--trailing">What are Managed Identities?&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/683ca9f654ef">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_managing-storage-keys-with-keyvault-e6e3b3270625/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_managing-storage-keys-with-keyvault-e6e3b3270625/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Managing Storage Keys with KeyVault&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Managing Storage Keys with KeyVault&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Manage storage account keys with Azure Key Vault and the Azure CLI | Microsoft Docs
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="bae7" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="5180" id="5180" class="graf graf--h3 graf--leading graf--title">Managing Storage Keys with KeyVault&lt;/h3>&lt;p name="1ea4" id="1ea4" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="22c7" id="22c7" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/azure/key-vault/secrets/overview-storage-keys" data-href="https://docs.microsoft.com/en-us/azure/key-vault/secrets/overview-storage-keys" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Manage storage account keys with Azure Key Vault and the Azure CLI | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="6b5a" id="6b5a" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="871f" id="871f" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-user-delegation-sas-create-cli" data-href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-user-delegation-sas-create-cli" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Use Azure CLI to create a user delegation SAS for a container or blob — Azure Storage | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="7c3e" id="7c3e" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="24c4" id="24c4" class="graf graf--p graf-after--p">&lt;a href="https://docs.microsoft.com/en-us/cli/azure/keyvault/storage/sas-definition?view=azure-cli-latest#az_keyvault_storage_sas_definition_create-examples" data-href="https://docs.microsoft.com/en-us/cli/azure/keyvault/storage/sas-definition?view=azure-cli-latest#az_keyvault_storage_sas_definition_create-examples" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">az keyvault storage sas-definition | Microsoft Docs&lt;/a>&lt;/p>&lt;p name="5096" id="5096" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/cli/azure/storage/container?view=azure-cli-latest" data-href="https://docs.microsoft.com/en-us/cli/azure/storage/container?view=azure-cli-latest" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">az storage container | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/e6e3b3270625">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_mastering-azure-bicep-and-the-azure-bicep-registry--a-beginner-s-guide-30e18439c04e/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_mastering-azure-bicep-and-the-azure-bicep-registry--a-beginner-s-guide-30e18439c04e/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Mastering Azure Bicep and the Azure Bicep Registry: A Beginner’s Guide&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Mastering Azure Bicep and the Azure Bicep Registry: A Beginner’s Guide&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="b3cb" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="172b" id="172b" class="graf graf--p graf--leading">Mastering Azure Bicep and the Azure Bicep Registry: A Beginner’s Guide&lt;/p>&lt;p name="a31b" id="a31b" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/30e18439c04e">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_powershell-debug-77891a0ef295/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_powershell-debug-77891a0ef295/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>PowerShell debug&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">PowerShell debug&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="e477" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="5073" id="5073" class="graf graf--p graf--leading graf--trailing">PowerShell debug&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/77891a0ef295">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_replacing-values-on-azure-data-factory-in-ci-cd-pipelines-1378b3656582/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_replacing-values-on-azure-data-factory-in-ci-cd-pipelines-1378b3656582/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Replacing values on Azure Data Factory in CI/CD pipelines&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Replacing values on Azure Data Factory in CI/CD pipelines&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Replace a development value with a production value is very simple on the Azure Data Factory. If you have different endpoints for your…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="52af" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="cb8b" id="cb8b" class="graf graf--h3 graf--leading graf--title">Replacing values on Azure Data Factory in CI/CD pipelines&lt;/h3>&lt;p name="77be" id="77be" class="graf graf--p graf-after--h3">Replace a development value with a production value is very simple on the Azure Data Factory. If you have different endpoints for your components, this is one of the basic DevOps processes that you need to take care of, and using the ARM Templates deployment can make it much more simple.&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--fullWidth">&lt;figure name="ab07" id="ab07" class="graf graf--figure graf--layoutFillWidth graf-after--p">&lt;img class="graf-image" data-image-id="1*6dD4LyOwm54OJ_RtjECB7A.jpeg" data-width="3548" data-height="2661" src="https://cdn-images-1.medium.com/max/2560/1*6dD4LyOwm54OJ_RtjECB7A.jpeg">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@gohrhyyan?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/@gohrhyyan?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Goh Rhy Yan&lt;/a> on &lt;a href="https://unsplash.com/s/photos/change-tire?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" data-href="https://unsplash.com/s/photos/change-tire?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="ff54" id="ff54" class="graf graf--h3 graf-after--figure">Azure Data Factory Deployment&lt;/h3>&lt;p name="3ecf" id="3ecf" class="graf graf--p graf-after--h3">There are some strategies to deploy Azure Data Factory. The method demonstrated in this post is applicable for the strategies that deploy the ARM Templates generated by Azure Data Factory Publish or for the new flow that uses an NPM task to generate the ARM artifacts.&lt;/p>&lt;figure name="3c06" id="3c06" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*rVh2lqK_s4z61Fps.png" data-width="700" data-height="468" src="https://cdn-images-1.medium.com/max/800/0*rVh2lqK_s4z61Fps.png">&lt;figcaption class="imageCaption">Deployment with new Azure Data Factory flow — Image from &lt;a href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#the-new-cicd-flow" data-href="https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment-improvements#the-new-cicd-flow" class="markup--anchor markup--figure-anchor" rel="noopener" target="_blank">Microsoft Docs&lt;/a>&lt;/figcaption>&lt;/figure>&lt;p name="4ec6" id="4ec6" class="graf graf--p graf-after--figure">If you are not familiar with the new flow yet, you can check it on &lt;a href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" data-href="https://towardsdatascience.com/azure-data-factory-ci-cd-made-simple-building-and-deploying-your-arm-templates-with-azure-devops-30c30595afa5" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">this post&lt;/a>, in which I am explaining the differences between the old flow and the new one, and also showing step by step the process to create a YAML deployment using it.&lt;/p>&lt;h3 name="8dcd" id="8dcd" class="graf graf--h3 graf-after--p">ARM Parameter configuration&lt;/h3>&lt;p name="10c0" id="10c0" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="ffbc" id="ffbc" class="graf graf--h3 graf-after--p">ARM Template parameter definition&lt;/h3>&lt;p name="9706" id="9706" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="20f1" id="20f1" class="graf graf--h3 graf-after--p">Overriding parameters&lt;/h3>&lt;p name="d103" id="d103" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="2c5a" id="2c5a" class="graf graf--h3 graf-after--p graf--trailing">Key Vault and App Configuration&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/1378b3656582">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_run-databricks-notebook-with-azure-devops-ed1ba52fb973/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_run-databricks-notebook-with-azure-devops-ed1ba52fb973/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Run databricks notebook with Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Run databricks notebook with Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Databricks authentication methods
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="a905" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="3d06" id="3d06" class="graf graf--h3 graf--leading graf--title">Run databricks notebook with Azure DevOps&lt;/h3>&lt;p name="ff1d" id="ff1d" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="4b65" id="4b65" class="graf graf--h3 graf-after--p">Databricks authentication methods&lt;/h3>&lt;h4 name="7d45" id="7d45" class="graf graf--h4 graf-after--h3">Azure Active Directory Token from Service Principal Name&lt;/h4>&lt;h4 name="abb3" id="abb3" class="graf graf--h4 graf-after--h4">Databricks Personal Access Token&lt;/h4>&lt;h4 name="cf3e" id="cf3e" class="graf graf--h4 graf-after--h4">Environment Variables&lt;/h4>&lt;h3 name="998a" id="998a" class="graf graf--h3 graf-after--h4">Authenticate to Databricks with Azure DevOps&lt;/h3>&lt;h4 name="16e9" id="16e9" class="graf graf--h4 graf-after--h3">Using Azure DevOps Service Principal Name&lt;/h4>&lt;h4 name="cf6e" id="cf6e" class="graf graf--h4 graf-after--h4">Running databricks notebooks from Azure DevOps pipeline&lt;/h4>&lt;h3 name="12e0" id="12e0" class="graf graf--h3 graf-after--h4 graf--trailing">Key Takeaways&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/ed1ba52fb973">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_running-powershell-on-azure-devops-6b4a3006bd6f/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_running-powershell-on-azure-devops-6b4a3006bd6f/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Running Powershell on Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Running Powershell on Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="f8df" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="3c73" id="3c73" class="graf graf--h3 graf--leading graf--title">Running Powershell on Azure DevOps&lt;/h3>&lt;p name="f82a" id="f82a" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/6b4a3006bd6f">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_sending-a-release-notes-report-from-azure-devops-by-mail-8afd8fbed14c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_sending-a-release-notes-report-from-azure-devops-by-mail-8afd8fbed14c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Sending a Release Notes report from Azure DevOps by mail&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Sending a Release Notes report from Azure DevOps by mail&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
When we finish a release it’s interesting to communicate to the responsible team if everything occurs fine(or not!) and what new Features…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="4e55" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="37fa" id="37fa" class="graf graf--h3 graf--leading graf--title">Sending a Release Notes report from Azure DevOps by mail&lt;/h3>&lt;p name="5790" id="5790" class="graf graf--p graf-after--h3">When we finish a release it’s interesting to communicate to the responsible team if everything occurs fine(or not!) and what new Features or corrections were deployed. I’ll show the simple pathway to do this.&lt;/p>&lt;p name="70e1" id="70e1" class="graf graf--p graf-after--p">We’ll start with our Azure DevOps account creating a work item.&lt;/p>&lt;figure name="86f2" id="86f2" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="1*uU_P1mJNoCVg0nt-A-x00A.png" data-width="403" data-height="496" src="https://cdn-images-1.medium.com/max/800/1*uU_P1mJNoCVg0nt-A-x00A.png">&lt;/figure>&lt;p name="7e3c" id="7e3c" class="graf graf--p graf--empty graf-after--figure graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/8afd8fbed14c">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_simplifying-creativity--deploying-generative-ai-through-azure-openai-43a6527f82ba/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_simplifying-creativity--deploying-generative-ai-through-azure-openai-43a6527f82ba/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Simplifying Creativity: Deploying Generative AI through Azure OpenAI&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Simplifying Creativity: Deploying Generative AI through Azure OpenAI&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
If you are a fan of Marvel’s comics, you should remember Jarvis, the Iron Man assistant. What if I tell you that Generative AI can help you…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5af7" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="10b3" id="10b3" class="graf graf--h3 graf--leading graf--title">Simplifying Creativity: Deploying Generative AI through Azure OpenAI&lt;/h3>&lt;p name="6515" id="6515" class="graf graf--p graf-after--h3">If you are a fan of Marvel’s comics, you should remember Jarvis, the Iron Man assistant. What if I tell you that Generative AI can help you in the same way, creating stuff that’ll make you go “Wow, did a robot do this?” In this blog post series, I will show you how to make an Azure Open AI deployment, and build your own copilot using cutting-edge generative AI models created by OpenAI!🚀🤖&lt;/p>&lt;figure name="dbe7" id="dbe7" class="graf graf--figure graf-after--p">&lt;img class="graf-image" data-image-id="0*zoQAOL30Z7grK4NF" data-width="5996" data-height="4096" data-unsplash-photo-id="YeoSV_3Up-k" src="https://cdn-images-1.medium.com/max/800/0*zoQAOL30Z7grK4NF">&lt;figcaption class="imageCaption">Photo by &lt;a href="https://unsplash.com/@siderius_creativ?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com/@siderius_creativ?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-creator noopener" target="_blank">Gerard Siderius&lt;/a> on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" data-href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral" class="markup--anchor markup--figure-anchor" rel="photo-source noopener" target="_blank">Unsplash&lt;/a>&lt;/figcaption>&lt;/figure>&lt;h3 name="ce98" id="ce98" class="graf graf--h3 graf-after--figure">Introduction to Generative AI&lt;/h3>&lt;h4 name="a542" id="a542" class="graf graf--h4 graf-after--h3">What is Generative AI?&lt;br>The Impact of Generative AI on Industries&lt;br>Azure OpenAI: Bridging the Gap Between AI and Creativity&lt;/h4>&lt;h3 name="5102" id="5102" class="graf graf--h3 graf-after--h4">Preparing for Azure OpenAI Deployment &lt;/h3>&lt;h4 name="c3a5" id="c3a5" class="graf graf--h4 graf-after--h3">Setting Up Your Azure Account for Azure OpenAI&lt;/h4>&lt;p name="5155" id="5155" class="graf graf--p graf-after--h4">To get started with Azure OpenAI, you must have an Azure Account. If you still don’t have it, you can create an account for free &lt;a href="https://azure.microsoft.com/en-us/free/search/?ef_id=_k_CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE_k_&amp;amp;OCID=AIDcmmy4pl1olr_SEM__k_CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE_k_&amp;amp;gad_source=1&amp;amp;gclid=CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE" data-href="https://azure.microsoft.com/en-us/free/search/?ef_id=_k_CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE_k_&amp;amp;OCID=AIDcmmy4pl1olr_SEM__k_CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE_k_&amp;amp;gad_source=1&amp;amp;gclid=CjwKCAiAqNSsBhAvEiwAn_tmxfHviInL5beFC4VlhCTWHsT-BJpiasqv6OYtnB1NV9a3MYVh08o6shoCzCUQAvD_BwE" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">here&lt;/a>. &lt;br>As Azure OpenAI is still under development, you need to apply for access on this &lt;a href="https://azure.microsoft.com/en-us/products/ai-services/openai-service" data-href="https://azure.microsoft.com/en-us/products/ai-services/openai-service" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">page&lt;/a>. After it’s approved, you will be able to create an Azure OpenAI resource.&lt;/p>&lt;h4 name="1276" id="1276" class="graf graf--h4 graf-after--p">Creating a New Azure OpenAI Resource &lt;/h4>&lt;p name="8331" id="8331" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h4 name="0b45" id="0b45" class="graf graf--h4 graf-after--p">Navigating to the Azure OpenAI Service&lt;/h4>&lt;h3 name="2d23" id="2d23" class="graf graf--h3 graf-after--h4">Configuring Your OpenAI Resource&lt;/h3>&lt;h4 name="7361" id="7361" class="graf graf--h4 graf-after--h3">Choosing the Right Configuration Options&lt;br>Understanding Pricing and Performance Tiers&lt;br>Finalizing the Setup and Reviewing Settings (Placeholder for Screenshot)&lt;/h4>&lt;h3 name="1867" id="1867" class="graf graf--h3 graf-after--h4">Deploying Azure OpenAI&lt;/h3>&lt;h4 name="c9dc" id="c9dc" class="graf graf--h4 graf-after--h3">Accessing Deployment Settings in the Azure Portal&lt;br>Deploying Your Generative AI Model with Azure OpenAI&lt;br>Successful Deployment Confirmation (Placeholder for Screenshot)&lt;/h4>&lt;h3 name="a8d8" id="a8d8" class="graf graf--h3 graf-after--h4">Post-Deployment Steps&lt;/h3>&lt;h4 name="ee91" id="ee91" class="graf graf--h4 graf-after--h3 graf--trailing">Verifying Deployment and Resource Health&lt;br>Setting Up API Keys for Secure Access&lt;br>Testing Your First Generative AI Request (Placeholder for Screenshot)&lt;/h4>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/43a6527f82ba">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_ssh-on-azure-devops-6faed95fb9dc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_ssh-on-azure-devops-6faed95fb9dc/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>SSH on Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">SSH on Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
ssh-keygen -t rsa -b 4096
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b9e5" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="96e1" id="96e1" class="graf graf--h3 graf--leading graf--title">SSH on Azure DevOps&lt;/h3>&lt;p name="b629" id="b629" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="c276" id="c276" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="1669" id="1669" class="graf graf--p graf-after--p">ssh-keygen -t rsa -b 4096&lt;/p>&lt;p name="bc05" id="bc05" class="graf graf--p graf-after--p">cat /home/wesley/.ssh/id_rsa.pub&lt;/p>&lt;p name="93f9" id="93f9" class="graf graf--p graf-after--p">upload id_rsa to variable group&lt;/p>&lt;p name="147a" id="147a" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/6faed95fb9dc">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_stop--not-all-teams-are-ready-for-trunk-based-development-40b163062b47/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_stop--not-all-teams-are-ready-for-trunk-based-development-40b163062b47/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Stop! Not all teams are ready for Trunk Based development&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Stop! Not all teams are ready for Trunk Based development&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In the past years, I have been working with teams around the world, and I can say: every team is different and has different maturity…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="cbc8" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="b9be" id="b9be" class="graf graf--h3 graf--leading graf--title">Stop! Not all teams are ready for Trunk Based development&lt;/h3>&lt;p name="84b2" id="84b2" class="graf graf--p graf-after--h3">In the past years, I have been working with teams around the world, and I can say: every team is different and has different maturity levels, and if you try to push the same strategy to all of the team, this is a recipe for disaster.&lt;/p>&lt;p name="c1d8" id="c1d8" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;h3 name="8324" id="8324" class="graf graf--h3 graf-after--p">5 things you need to know before deciding your branch strategy&lt;/h3>&lt;h3 name="2a19" id="2a19" class="graf graf--h3 graf-after--h3">1- What is the DevOps maturity level of your team?&lt;/h3>&lt;h4 name="bdae" id="bdae" class="graf graf--h4 graf-after--h3">Does your company already have DevOps practices?&lt;/h4>&lt;ul class="postList">&lt;li name="51e6" id="51e6" class="graf graf--li graf-after--h4">Version control&lt;/li>&lt;li name="2860" id="2860" class="graf graf--li graf-after--li">Continuous Integration&lt;/li>&lt;li name="3efa" id="3efa" class="graf graf--li graf-after--li">Continuous Deployment&lt;/li>&lt;li name="ae9f" id="ae9f" class="graf graf--li graf-after--li">Continous Delivery&lt;/li>&lt;/ul>&lt;h4 name="e552" id="e552" class="graf graf--h4 graf-after--li">How to measure the DevOps maturity of your team?&lt;/h4>&lt;p name="ab7c" id="ab7c" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h3 name="607b" id="607b" class="graf graf--h3 graf-after--p">2- How your environment looks like?&lt;/h3>&lt;h4 name="5883" id="5883" class="graf graf--h4 graf-after--h3">Which resources are you using?&lt;/h4>&lt;ul class="postList">&lt;li name="9610" id="9610" class="graf graf--li graf-after--h4">Are these cloud resources? &lt;/li>&lt;li name="0a02" id="0a02" class="graf graf--li graf-after--li">How are they provisioned?&lt;/li>&lt;li name="9b6d" id="9b6d" class="graf graf--li graf-after--li">Is there automation?&lt;/li>&lt;/ul>&lt;h4 name="f8aa" id="f8aa" class="graf graf--h4 graf-after--li">Does your team have a development environment?&lt;/h4>&lt;h4 name="e637" id="e637" class="graf graf--h4 graf-after--h4">How automated is your environment?&lt;/h4>&lt;p name="9de7" id="9de7" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h3 name="8b78" id="8b78" class="graf graf--h3 graf-after--p">3- What is your release strategy?&lt;/h3>&lt;h4 name="5b3f" id="5b3f" class="graf graf--h4 graf-after--h3">Feature flags&lt;/h4>&lt;p name="e79e" id="e79e" class="graf graf--p graf--empty graf-after--h4">&lt;br>&lt;/p>&lt;h3 name="3887" id="3887" class="graf graf--h3 graf-after--p">4- Is your process well structured or under development?&lt;/h3>&lt;h3 name="18c1" id="18c1" class="graf graf--h3 graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/40b163062b47">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_sua-empresa-tem-o-fluxo-de-valor-mapeado--34f24856add3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_sua-empresa-tem-o-fluxo-de-valor-mapeado--34f24856add3/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Sua empresa tem o fluxo de valor mapeado?&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Sua empresa tem o fluxo de valor mapeado?&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Já parou pra pensar como os lanches do McDonald’s ficam prontos tão rapidamente?
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5658" class="section section--body section--first">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="0e86" id="0e86" class="graf graf--h3 graf--leading graf--title">Sua empresa tem o fluxo de valor mapeado?&lt;/h3>&lt;p name="8cc7" id="8cc7" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="966e" id="966e" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="a607" id="a607" class="graf graf--p graf-after--p">Já parou pra pensar como os lanches do McDonald’s ficam prontos tão rapidamente?&lt;/p>&lt;p name="318b" id="318b" class="graf graf--p graf-after--p">Cada etapa na produção dos lanches é realizada em um local especialmente projetado e por uma pessoa especialmente treinada para essa etapa. E após cada etapa ser concluída, seu lanche vai para a seguinte, segundo uma ordem correta até seu lanche chegar em suas mãos e você poder saboreá-lo.&lt;br>&lt;br>&lt;/p>&lt;p name="b475" id="b475" class="graf graf--p graf-after--p">Cada uma dessas etapas precisa ser executada em uma ordem para ao final o lanche sair de acordo com a foto. Eu sei que a maioria das vezes os lanches não são iguais as fotos, mas a ordem dos ingredientes precisa ser seguida, já pensou o bacon embaixo da primeira fatia de pão e o hambúrguer em cima da segunda? ;p&lt;/p>&lt;/div>&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="14ba" id="14ba" class="graf graf--figure graf--layoutOutsetCenter graf-after--p">&lt;img class="graf-image" data-image-id="0*HqBZ3X7xuXH_NAGi.jpg" data-width="1200" data-height="809" src="https://cdn-images-1.medium.com/max/1200/0*HqBZ3X7xuXH_NAGi.jpg">&lt;/figure>&lt;/div>&lt;div class="section-inner sectionLayout--insetColumn">&lt;p name="18f8" id="18f8" class="graf graf--p graf-after--figure">Isso pode ser chamado de fluxo de valor e sua definição de acordo com Lean é:&lt;/p>&lt;blockquote name="7d1f" id="7d1f" class="graf graf--blockquote graf--startsWithDoubleQuote graf-after--p">“A sequência de atividades em uma organização para entregar um pedido a um cliente.”&lt;/blockquote>&lt;p name="860a" id="860a" class="graf graf--p graf-after--blockquote graf--trailing">Isso significa que todas as etapas entre o pedido de um cliente até sua entega, seja de um hambúrguer, ou de um sistema, passam por etapas de um processo que pode estar em um estágio mais basico ou mais avançado. E isso pode definir o grau de maturidade do seu processo!&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="8eaf" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="e8e0" id="e8e0" class="graf graf--h4 graf--leading">Focar no essencial&lt;/h4>&lt;p name="f814" id="f814" class="graf graf--p graf-after--h4">Algumas cenas do post são do filme “Fome de Poder”, aliás, recomendo que assistam, que retrata a história do McDonalds’s. No filme conhecemos como a ideia inovadora criada pelos irmãos McDonalds’s de separar e otimizar os processos de fabricação dos hambúrgueres na lanchonete mais famosa do mundo.&lt;/p>&lt;p name="6ca0" id="6ca0" class="graf graf--p graf-after--p graf--trailing">A grande sacada é otimizar o processo através da eliminação de etapas inúteis e manter apenas o essencial, o necessário para produzir os hambúrgueres o mais rápido possível.&lt;/p>&lt;/div>&lt;/div>&lt;/section>&lt;section name="6a48" class="section section--body">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--outsetColumn">&lt;figure name="a472" id="a472" class="graf graf--figure graf--layoutOutsetCenter graf--leading graf--trailing">&lt;img class="graf-image" data-image-id="0*qlXvfQdoksxVBLrB.jpg" data-width="1200" data-height="598" src="https://cdn-images-1.medium.com/max/1200/0*qlXvfQdoksxVBLrB.jpg">&lt;/figure>&lt;/div>&lt;/div>&lt;/section>&lt;section name="544a" class="section section--body section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h4 name="d781" id="d781" class="graf graf--h4 graf--leading">Identificar gargalos&lt;/h4>&lt;p name="7a5d" id="7a5d" class="graf graf--p graf-after--h4 graf--trailing">Com o fluxo em que&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/34f24856add3">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_terraform-deploy-in-multiple-subscriptions-19e1e20664f8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_terraform-deploy-in-multiple-subscriptions-19e1e20664f8/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Terraform deploy in multiple subscriptions&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Terraform deploy in multiple subscriptions&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
terraform-azurerm-vnet-peering/main.tf.ci at master · claranet/terraform-azurerm-vnet-peering (github.com)
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="fbe6" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="08e9" id="08e9" class="graf graf--h3 graf--leading graf--title">Terraform deploy in multiple subscriptions &lt;/h3>&lt;p name="ac06" id="ac06" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="e816" id="e816" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://github.com/claranet/terraform-azurerm-vnet-peering/blob/master/main.tf.ci" data-href="https://github.com/claranet/terraform-azurerm-vnet-peering/blob/master/main.tf.ci" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">terraform-azurerm-vnet-peering/main.tf.ci at master · claranet/terraform-azurerm-vnet-peering (github.com)&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/19e1e20664f8">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_testing-bicep-with-psrule-5dd26657f74f/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_testing-bicep-with-psrule-5dd26657f74f/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Testing bicep with PSRule&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Testing bicep with PSRule&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Testing Bicep Code Using PSRule in Azure Pipeline — Managing Cloud and Datacenter by Tao Yang (tyang.org)
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="b8c3" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="a7a1" id="a7a1" class="graf graf--h3 graf--leading graf--title">Testing bicep with PSRule&lt;/h3>&lt;p name="b7ec" id="b7ec" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="b8f6" id="b8f6" class="graf graf--p graf-after--p">&lt;a href="https://blog.tyang.org/2022/03/20/azure-pipeline-psrule-bicep-test" data-href="https://blog.tyang.org/2022/03/20/azure-pipeline-psrule-bicep-test" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Testing Bicep Code Using PSRule in Azure Pipeline — Managing Cloud and Datacenter by Tao Yang (tyang.org)&lt;/a>&lt;/p>&lt;p name="ecc0" id="ecc0" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="49fa" id="49fa" class="graf graf--p graf-after--p graf--trailing">&lt;a href="https://docs.microsoft.com/en-us/learn/modules/test-bicep-code-using-azure-pipelines/8-test-resources-after-deployment" data-href="https://docs.microsoft.com/en-us/learn/modules/test-bicep-code-using-azure-pipelines/8-test-resources-after-deployment" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Test your resources after deployment — Learn | Microsoft Docs&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/5dd26657f74f">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_the-definitive-guide-for-azure-key-vault---how-to-create-a-key-vault-and-what-is-it-e7b779a1a156/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_the-definitive-guide-for-azure-key-vault---how-to-create-a-key-vault-and-what-is-it-e7b779a1a156/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>The definitive guide for Azure Key Vault — How to create a Key Vault and what is it&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">The definitive guide for Azure Key Vault — How to create a Key Vault and what is it&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
What is a Key Vault?
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="9e37" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4e5b" id="4e5b" class="graf graf--h3 graf--leading graf--title">The definitive guide for Azure Key Vault — How to create a Key Vault and what is it&lt;/h3>&lt;h3 name="e051" id="e051" class="graf graf--h3 graf-after--h3">What is a Key Vault?&lt;/h3>&lt;p name="9ce6" id="9ce6" class="graf graf--p graf-after--h3">&lt;a href="https://docs.microsoft.com/en-us/azure/key-vault/general/overview" data-href="https://docs.microsoft.com/en-us/azure/key-vault/general/overview" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Azure Key Vault Overview — Azure Key Vault | Microsoft Docs&lt;/a>&lt;/p>&lt;h3 name="b898" id="b898" class="graf graf--h3 graf-after--p">Create an Azure Key Vault by Portal&lt;/h3>&lt;h3 name="f06c" id="f06c" class="graf graf--h3 graf-after--h3">How to create an Azure Key Vault with Bicep&lt;/h3>&lt;figure name="2f43" id="2f43" class="graf graf--figure graf--iframe graf-after--h3">&lt;script src="https://gist.github.com/wesleycamargo/ed715f64f71f30944ebe452367faab40?file=azure-cli.ps1.js">&lt;/script>&lt;/figure>&lt;p name="0752" id="0752" class="graf graf--p graf--empty graf-after--figure">&lt;br>&lt;/p>&lt;h3 name="e205" id="e205" class="graf graf--h3 graf-after--p">How to create an Azure Key Vault with Terraform&lt;/h3>&lt;h3 name="7320" id="7320" class="graf graf--h3 graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/e7b779a1a156">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_the-definitive-way-how-to-consume-powershell-modules-from-nuget-feed-on-azure-devops-e0fcceec1fc0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_the-definitive-way-how-to-consume-powershell-modules-from-nuget-feed-on-azure-devops-e0fcceec1fc0/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>The definitive way How to consume PowerShell modules from Nuget feed on Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">The definitive way How to consume PowerShell modules from Nuget feed on Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="0492" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="4bb8" id="4bb8" class="graf graf--h3 graf--leading graf--title">The definitive way How to consume PowerShell modules from Nuget feed on Azure DevOps&lt;/h3>&lt;p name="554c" id="554c" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/e0fcceec1fc0">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_tokenizations-and-replacing-tokens-in-azure-devops-dfa458bc33e6/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_tokenizations-and-replacing-tokens-in-azure-devops-dfa458bc33e6/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Tokenizations and Replacing tokens in Azure DevOps&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Tokenizations and Replacing tokens in Azure DevOps&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
In some cases, it is required that we dynamically change values in our configuration files depending on some circumstances, for instance…
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="837b" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="e3fa" id="e3fa" class="graf graf--h3 graf--leading graf--title">Tokenizations and Replacing tokens in Azure DevOps&lt;/h3>&lt;p name="4b55" id="4b55" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;p name="0df7" id="0df7" class="graf graf--p graf-after--p">In some cases, it is required that we dynamically change values in our configuration files depending on some circumstances, for instance, different environments. To solve this problem, an easy solution is to leverage a Tokenization and replace the tokens process. Check out how to do this in practice.&lt;/p>&lt;p name="0ae5" id="0ae5" class="graf graf--p graf-after--p">The tokenization process consists of a configuration file with tokens defined by a pattern, that will be identified during the CD and replaced by the desired values.&lt;/p>&lt;p name="6506" id="6506" class="graf graf--p graf--empty graf-after--p">&lt;br>&lt;/p>&lt;p name="032f" id="032f" class="graf graf--p graf--empty graf-after--p graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/dfa458bc33e6">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_using-variables-files-in-azure-devops-yaml-templates-8d3d8ced8fa5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_using-variables-files-in-azure-devops-yaml-templates-8d3d8ced8fa5/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Using variables files in Azure DevOps YAML Templates&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Using variables files in Azure DevOps YAML Templates&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Declaring variables in Azure DevOps YAML Templates
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="202b" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9fec" id="9fec" class="graf graf--h3 graf--leading graf--title">Using variables files in Azure DevOps YAML Templates&lt;/h3>&lt;p name="22c6" id="22c6" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="6ed0" id="6ed0" class="graf graf--h3 graf-after--p">Declaring variables in Azure DevOps YAML Templates&lt;/h3>&lt;p name="7997" id="7997" class="graf graf--p graf-after--h3">Variables are used to inject dynamic values in your YAML Pipelines. It allows you to better organize your pipelines, keeping them more readable and organized&lt;/p>&lt;h3 name="add1" id="add1" class="graf graf--h3 graf-after--p">How to create a variable file in Azure DevOps YAML Templates&lt;/h3>&lt;h3 name="603e" id="603e" class="graf graf--h3 graf-after--h3 graf--trailing">How to import a variable file in Azure DevOps YAML Templates&lt;/h3>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/8d3d8ced8fa5">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_variable-group-in-job-scope-4c300afffb2c/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_variable-group-in-job-scope-4c300afffb2c/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Variable Group in Job scope&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Variable Group in Job scope&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Variable groups scoped to stage not working for task inputs — Developer Community (visualstudio.com)
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="05d3" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="1568" id="1568" class="graf graf--h3 graf--leading graf--title">Variable Group in Job scope&lt;/h3>&lt;p name="a558" id="a558" class="graf graf--p graf-after--h3 graf--trailing">&lt;a href="https://developercommunity.visualstudio.com/content/problem/954342/variable-groups-scoped-to-stage-not-working-for-ta.html" data-href="https://developercommunity.visualstudio.com/content/problem/954342/variable-groups-scoped-to-stage-not-working-for-ta.html" class="markup--anchor markup--p-anchor" rel="noopener" target="_blank">Variable groups scoped to stage not working for task inputs — Developer Community (visualstudio.com)&lt;/a>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/4c300afffb2c">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_what-is-a-deployment-pipeline--a823c7180a73/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_what-is-a-deployment-pipeline--a823c7180a73/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>What is a Deployment Pipeline?&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">What is a Deployment Pipeline?&lt;/h1>
&lt;/header>
&lt;section data-field="subtitle" class="p-summary">
Deployment Pipelines Core Concepts
&lt;/section>
&lt;section data-field="body" class="e-content">
&lt;section name="5ccc" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="9b32" id="9b32" class="graf graf--h3 graf--leading graf--title">What is a Deployment Pipeline?&lt;/h3>&lt;p name="d235" id="d235" class="graf graf--p graf--empty graf-after--h3">&lt;br>&lt;/p>&lt;h3 name="4717" id="4717" class="graf graf--h3 graf-after--p">Deployment Pipelines Core Concepts&lt;/h3>&lt;h4 name="3a6e" id="3a6e" class="graf graf--h4 graf-after--h3">Pipeline&lt;/h4>&lt;h4 name="4c8f" id="4c8f" class="graf graf--h4 graf-after--h4">Build&lt;/h4>&lt;ul class="postList">&lt;li name="f1f0" id="f1f0" class="graf graf--li graf-after--h4">Artifacts&lt;/li>&lt;/ul>&lt;h4 name="a53f" id="a53f" class="graf graf--h4 graf-after--li">Deployment&lt;/h4>&lt;h4 name="5219" id="5219" class="graf graf--h4 graf-after--h4">Environment&lt;/h4>&lt;ul class="postList">&lt;li name="2469" id="2469" class="graf graf--li graf-after--h4">Approvals&lt;/li>&lt;/ul>&lt;h4 name="3a1d" id="3a1d" class="graf graf--h4 graf-after--li">Release&lt;/h4>&lt;h3 name="7d95" id="7d95" class="graf graf--h3 graf-after--h4">Elements of a Deployment Pipeline&lt;/h3>&lt;h4 name="512d" id="512d" class="graf graf--h4 graf-after--h3">Steps&lt;/h4>&lt;ul class="postList">&lt;li name="5802" id="5802" class="graf graf--li graf-after--h4">Task &lt;/li>&lt;li name="027f" id="027f" class="graf graf--li graf-after--li">Script&lt;/li>&lt;/ul>&lt;h4 name="8ffd" id="8ffd" class="graf graf--h4 graf-after--li">Jobs&lt;/h4>&lt;h4 name="74a8" id="74a8" class="graf graf--h4 graf-after--h4">Stages&lt;/h4>&lt;h4 name="b3a7" id="b3a7" class="graf graf--h4 graf-after--h4">Triggers&lt;/h4>&lt;h4 name="10db" id="10db" class="graf graf--h4 graf-after--h4">Agents&lt;/h4>&lt;h4 name="6cc1" id="6cc1" class="graf graf--h4 graf-after--h4">Libraries&lt;/h4>&lt;p name="2d56" id="2d56" class="graf graf--p graf--empty graf-after--h4 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/a823c7180a73">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title/><link>http://www.wesleycamargo.com/medium-exported/draft_why-you-should-break-your-azure-data-factory-into-small-pieces-f8b529fc49af/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/medium-exported/draft_why-you-should-break-your-azure-data-factory-into-small-pieces-f8b529fc49af/</guid><description>&lt;!DOCTYPE html>&lt;html>&lt;head>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">&lt;title>Why you should break your Azure Data Factory into small pieces&lt;/title>&lt;style>
* {
font-family: Georgia, Cambria, "Times New Roman", Times, serif;
}
html, body {
margin: 0;
padding: 0;
}
h1 {
font-size: 50px;
margin-bottom: 17px;
color: #333;
}
h2 {
font-size: 24px;
line-height: 1.6;
margin: 30px 0 0 0;
margin-bottom: 18px;
margin-top: 33px;
color: #333;
}
h3 {
font-size: 30px;
margin: 10px 0 20px 0;
color: #333;
}
header {
width: 640px;
margin: auto;
}
section {
width: 640px;
margin: auto;
}
section p {
margin-bottom: 27px;
font-size: 20px;
line-height: 1.6;
color: #333;
}
section img {
max-width: 640px;
}
footer {
padding: 0 20px;
margin: 50px 0;
text-align: center;
font-size: 12px;
}
.aspectRatioPlaceholder {
max-width: auto !important;
max-height: auto !important;
}
.aspectRatioPlaceholder-fill {
padding-bottom: 0 !important;
}
header,
section[data-field=subtitle],
section[data-field=description] {
display: none;
}
&lt;/style>&lt;/head>&lt;body>&lt;article class="h-entry">
&lt;header>
&lt;h1 class="p-name">Why you should break your Azure Data Factory into small pieces&lt;/h1>
&lt;/header>
&lt;section data-field="body" class="e-content">
&lt;section name="72c3" class="section section--body section--first section--last">&lt;div class="section-divider">&lt;hr class="section-divider">&lt;/div>&lt;div class="section-content">&lt;div class="section-inner sectionLayout--insetColumn">&lt;h3 name="02bb" id="02bb" class="graf graf--h3 graf--leading graf--title">Why you should break your Azure Data Factory into small pieces&lt;/h3>&lt;p name="d71d" id="d71d" class="graf graf--p graf--empty graf-after--h3 graf--trailing">&lt;br>&lt;/p>&lt;/div>&lt;/div>&lt;/section>
&lt;/section>
&lt;footer>&lt;p>&lt;a href="https://medium.com/p/f8b529fc49af">View original.&lt;/a>&lt;/p>&lt;p>Exported from &lt;a href="https://medium.com">Medium&lt;/a> on July 5, 2025.&lt;/p>&lt;/footer>&lt;/article>&lt;/body>&lt;/html></description></item><item><title>About</title><link>http://www.wesleycamargo.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/about/</guid><description>&lt;p>Welcome to my personal blog! I&amp;rsquo;m Wesley Camargo, and this site showcases my thoughts, projects, and experiences.&lt;/p>
&lt;p>This blog is built with Hugo and the beautiful Stack theme, providing a clean and modern reading experience.&lt;/p>
&lt;h2 id="contact">Contact
&lt;/h2>&lt;p>Feel free to reach out to me through the social links in the sidebar.&lt;/p></description></item><item><title>Archives</title><link>http://www.wesleycamargo.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/archives/</guid><description/></item><item><title>Search</title><link>http://www.wesleycamargo.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.wesleycamargo.com/search/</guid><description/></item></channel></rss>