<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps on Wesley Camargo</title><link>http://www.wesleycamargo.com/categories/devops/</link><description>Recent content in DevOps on Wesley Camargo</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 14 Jun 2023 18:04:59 +0200</lastBuildDate><atom:link href="http://www.wesleycamargo.com/categories/devops/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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 — 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>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>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>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>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>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></channel></rss>