<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Your Site's RSS Feed]]></title><description><![CDATA[DevOps Tips and Tricks]]></description><link>https://devopstips.net</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 16 Nov 2022 05:00:33 GMT</lastBuildDate><item><title><![CDATA[Deploying Azure Log Analytics Solution Using Terraform]]></title><description><![CDATA[If it's needed to deploy Azure Log Analytics Solution using Terraform, you can use the following Terraform structure, It's possible to…]]></description><link>https://devopstips.net/2022-04-16-deploying-azure-log-analytics-solution-using-terraform/</link><guid isPermaLink="false">https://devopstips.net/2022-04-16-deploying-azure-log-analytics-solution-using-terraform/</guid><pubDate>Sat, 16 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If it&apos;s needed to deploy &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solution&lt;/a&gt; using &lt;a href=&quot;https://www.terraform.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terraform&lt;/a&gt;, you can use the following &lt;a href=&quot;https://www.terraform.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terraform&lt;/a&gt; structure,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;resource &lt;span class=&quot;token string&quot;&gt;&quot;azurerm_resource_group&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rg&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name     &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rg-sample&quot;&lt;/span&gt;
  location &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;westus3&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

resource &lt;span class=&quot;token string&quot;&gt;&quot;azurerm_log_analytics_workspace&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;workspace&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name                &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alaw-sample&quot;&lt;/span&gt;
  location            &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.location}&lt;/span&gt;&quot;&lt;/span&gt;
  resource_group_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.name}&lt;/span&gt;&quot;&lt;/span&gt;
  sku                 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Free&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

resource &lt;span class=&quot;token string&quot;&gt;&quot;azurerm_log_analytics_solution&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;solution&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  solution_name         &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ContainerInsights&quot;&lt;/span&gt;
  location              &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.location}&lt;/span&gt;&quot;&lt;/span&gt;
  resource_group_name   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.name}&lt;/span&gt;&quot;&lt;/span&gt;
  workspace_resource_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_log_analytics_workspace.workspace.id}&lt;/span&gt;&quot;&lt;/span&gt;
  workspace_name        &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_log_analytics_workspace.workspace.name}&lt;/span&gt;&quot;&lt;/span&gt;

  plan &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    publisher &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Microsoft&quot;&lt;/span&gt;
    product   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;OMSGallery/ContainerInsights&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&apos;s possible to deploy an &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/group&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Resource Group&lt;/a&gt;, an &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/workspace&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Workspace&lt;/a&gt; and an &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solution&lt;/a&gt; (for &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Container Monitoring&lt;/a&gt;) using the following command,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform init
terraform apply -auto-approve&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Unfortunately, list of &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solutions&lt;/a&gt; is not available in the &lt;a href=&quot;https://www.terraform.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terraform&lt;/a&gt; provider documentation 😟&lt;/p&gt;
&lt;p&gt;Official &lt;em&gt;Terraform Resource Provider&lt;/em&gt; page for &lt;em&gt;Azure Log Analytics Solution&lt;/em&gt; displays only &lt;em&gt;ContainerInsights&lt;/em&gt; example, &lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/log_analytics_solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;azurerm_log_analytics_solution&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If there is already an &lt;a href=&quot;https://azure.microsoft.com/en-us/free/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Subscription&lt;/a&gt;, that has &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solutions&lt;/a&gt; installed, and it&apos;s needed to create a &lt;em&gt;Terraform Module&lt;/em&gt; out of it, following command will list the installed &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solutions&lt;/a&gt;,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# List all log-analytics solutions in the current subscription&lt;/span&gt;
az monitor log-analytics solution list

&lt;span class=&quot;token comment&quot;&gt;# List all log-analytics solutions for a specific subscription&lt;/span&gt;
az monitor log-analytics solution list --subscription &lt;span class=&quot;token variable&quot;&gt;${SUBSCRIPTION_ID}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# List all log-analytics solutions in a resource group&lt;/span&gt;
az monitor log-analytics solution list --resource-group &lt;span class=&quot;token variable&quot;&gt;${RESOURCE_GROUP_NAME}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When the command above is executed, it will list the installed &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/monitor/log-analytics/solution&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Log Analytics Solutions&lt;/a&gt;, and it&apos;s possible to create a &lt;em&gt;Terraform Module&lt;/em&gt; using the output of the command,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;resource &lt;span class=&quot;token string&quot;&gt;&quot;azurerm_log_analytics_solution&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;solution&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  solution_name         &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{Product name from the command output}&quot;&lt;/span&gt;
  location              &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.location}&lt;/span&gt;&quot;&lt;/span&gt;
  resource_group_name   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_resource_group.rg.name}&lt;/span&gt;&quot;&lt;/span&gt;
  workspace_resource_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_log_analytics_workspace.workspace.id}&lt;/span&gt;&quot;&lt;/span&gt;
  workspace_name        &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${azurerm_log_analytics_workspace.workspace.name}&lt;/span&gt;&quot;&lt;/span&gt;

  plan &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    publisher &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{Publisher name from the command output}&quot;&lt;/span&gt;
    product   &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{Product name from the command output}&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Before running &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt; commands, &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/azure-cli-extensions-overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Log Analytics Solution Extension&lt;/a&gt; should be installed;
az extension add --name log-analytics-solution&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[What makes a good developer?]]></title><description><![CDATA[The world is moving towards a more technical future and in order to keep up with the trend, more and more people are looking to learn how to…]]></description><link>https://devopstips.net/2021-08-24-what-makes-a-good-developer/</link><guid isPermaLink="false">https://devopstips.net/2021-08-24-what-makes-a-good-developer/</guid><pubDate>Tue, 24 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The world is moving towards a more technical future and in order to keep up with the trend, more and more people are looking to learn how to code. Coding, engineering, design and development are some of the most in demand skills in the job market today and learning how to code can help you become more employable in the real world.&lt;/p&gt;
&lt;h2 id=&quot;Curiosity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Curiosity&quot; aria-label=&quot;Curiosity permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Curiosity&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4411b6128ad491fd76cbaa43ce9e6be6/4d836/wmgd-curiosity.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFVtK0c4mJ//8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIAAxEhQf/aAAgBAQABBQJVxLnDUxXM4Tv/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPwGH/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Bp//EABgQAAMBAQAAAAAAAAAAAAAAAAEQEQAh/9oACAEBAAY/AriI6OFf/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARITGBUf/aAAgBAQABPyEdFly+QWtZJUJZ7Fx4EZa1yf/aAAwDAQACAAMAAAAQAw//xAAVEQEBAAAAAAAAAAAAAAAAAAAQMf/aAAgBAwEBPxCj/8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQIBAT8Qg//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESExQXGRscH/2gAIAQEAAT8QyQis9epYg9FC5OT7FDUwAJa76mw2NrfZzDUsuaUeJ//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Curiosity&quot;
        title=&quot;Curiosity&quot;
        src=&quot;/static/4411b6128ad491fd76cbaa43ce9e6be6/828fb/wmgd-curiosity.jpg&quot;
        srcset=&quot;/static/4411b6128ad491fd76cbaa43ce9e6be6/ff44c/wmgd-curiosity.jpg 158w,
/static/4411b6128ad491fd76cbaa43ce9e6be6/a6688/wmgd-curiosity.jpg 315w,
/static/4411b6128ad491fd76cbaa43ce9e6be6/828fb/wmgd-curiosity.jpg 630w,
/static/4411b6128ad491fd76cbaa43ce9e6be6/4d836/wmgd-curiosity.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Remember that your job does not just stop at writing code. It’s important to know how to ask the right questions when your code isn’t working. If you have more than one idea or solution, try them all.   When you’re working on a project, you&apos;re going to have questions. You should feel comfortable asking your superiors, colleagues or clients questions about the project. In order to be a good developer, you need to be willing to experiment and explore&lt;/p&gt;
&lt;p&gt;Once you have the information and you know what you’re doing, it’s time to get started. You may have the required skills and you may be able to right the wrongs. But there will be cases where you need to ask for help. As a developer, you need to be able to not be afraid to do it. Remember to pause and ask &quot;why?&quot; when something doesn’t look right, and keep digging until you find the answer.&lt;/p&gt;
&lt;h2 id=&quot;Analytical-mindset&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Analytical-mindset&quot; aria-label=&quot;Analytical mindset permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Analytical mindset&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f0a9bd1f6766ee02ed1475134e056bf5/4d836/wmgd-analytical-mindset.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABUBAQEAAAAAAAAAAAAAAAAAAAID/9oADAMBAAIQAxAAAAHDREVYkwj/xAAcEAACAQUBAAAAAAAAAAAAAAABAhEAAxITISL/2gAIAQEAAQUCC+nt4mK7OxiGPf/EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGtf//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPwERf//EABoQAAICAwAAAAAAAAAAAAAAAAAQAREhMYH/2gAIAQEABj8Ck4tlXhf/xAAaEAEAAgMBAAAAAAAAAAAAAAABABEhMVGR/9oACAEBAAE/IW5R/REu7ZeARjsUVgdSqs//2gAMAwEAAgADAAAAENwf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARQf/aAAgBAwEBPxB4Ykg5f//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QD//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQVGh/9oACAEBAAE/ELAtFpORbgpsxYMbEPW/ItpqjxEuLDziKoAr7P/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Analytical Mindset&quot;
        title=&quot;Analytical Mindset&quot;
        src=&quot;/static/f0a9bd1f6766ee02ed1475134e056bf5/828fb/wmgd-analytical-mindset.jpg&quot;
        srcset=&quot;/static/f0a9bd1f6766ee02ed1475134e056bf5/ff44c/wmgd-analytical-mindset.jpg 158w,
/static/f0a9bd1f6766ee02ed1475134e056bf5/a6688/wmgd-analytical-mindset.jpg 315w,
/static/f0a9bd1f6766ee02ed1475134e056bf5/828fb/wmgd-analytical-mindset.jpg 630w,
/static/f0a9bd1f6766ee02ed1475134e056bf5/4d836/wmgd-analytical-mindset.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A developer has many skills, but the two most important ones are understanding the system and understanding the details. At the system-level, it&apos;s important to understand how the systems you&apos;re working with are put together. You need to have a deep knowledge of the topics you&apos;re working with in order to understand how they relate to the big picture. You also need to be able to balance thinking about the big picture and the details.&lt;/p&gt;
&lt;p&gt;A developer should be someone who can think critically. A developer should have the necessary systems-level thinking skills to be able to look at a problem and come up with a plan to solve it. Even if you only have an idea about how things should work, you need to be able to think about the big picture and the small details of what that means. This type of job requires a lot of things that might not be your expertise in your daily life.&lt;/p&gt;
&lt;h2 id=&quot;Creativity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creativity&quot; aria-label=&quot;Creativity permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creativity&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a9d292e6c75dbbdab4f69866e0bf2499/4d836/wmgd-creativity.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQP/2gAMAwEAAhADEAAAAXbnNnBAzv8A/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQISIQADIv/aAAgBAQABBQJbMq2HtWIEqOf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGq/8QAGBAAAgMAAAAAAAAAAAAAAAAAARARYXH/2gAIAQEABj8Cm2Nf/8QAGxABAQEAAgMAAAAAAAAAAAAAAQARMUGhwfD/2gAIAQEAAT8hZs+5GOHmJUZHfrLi12//2gAMAwEAAgADAAAAEBc//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8QR//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxArtv/EABoQAQADAAMAAAAAAAAAAAAAAAEAESExQYH/2gAIAQEAAT8Qw23SK8MAdI75BQHVuA+Iqrln/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Creativity&quot;
        title=&quot;Creativity&quot;
        src=&quot;/static/a9d292e6c75dbbdab4f69866e0bf2499/828fb/wmgd-creativity.jpg&quot;
        srcset=&quot;/static/a9d292e6c75dbbdab4f69866e0bf2499/ff44c/wmgd-creativity.jpg 158w,
/static/a9d292e6c75dbbdab4f69866e0bf2499/a6688/wmgd-creativity.jpg 315w,
/static/a9d292e6c75dbbdab4f69866e0bf2499/828fb/wmgd-creativity.jpg 630w,
/static/a9d292e6c75dbbdab4f69866e0bf2499/4d836/wmgd-creativity.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To me, creativity is the most important skill that a programmer can have. When you are faced with a problem, it is often the creative programmer that can come up with the best solution.&lt;/p&gt;
&lt;p&gt;Creativity is the ability to come up with new and interesting ideas. It is the power to see old things in new ways. It lies at the heart of innovation and is a driving force behind many great discoveries. It usually involves seeing relationships or connections among things that others do not notice.&lt;/p&gt;
&lt;p&gt;Programmers tend to be analytical and logical. The best programmers I know tend to be great at solving problems in different ways. They can break down a problem into its simplest parts and then work their way up to the final, full solution. This type of thinking is very important in programming because there are many different ways to solve a problem.&lt;/p&gt;
&lt;h2 id=&quot;Informed-decisions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Informed-decisions&quot; aria-label=&quot;Informed decisions permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Informed decisions&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b1eb2113e103c255a0767f7b025edbd9/4d836/wmgd-informed-decisions.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEC/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAECA//aAAwDAQACEAMQAAAB2FpAT//EABcQAQEBAQAAAAAAAAAAAAAAAAABITH/2gAIAQEAAQUCXKi9f//EABYRAQEBAAAAAAAAAAAAAAAAAAATAf/aAAgBAwEBPwGSeP/EABURAQEAAAAAAAAAAAAAAAAAAAAS/9oACAECAQE/AbW//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAQAGPwIyqf/EABoQAQACAwEAAAAAAAAAAAAAAAEAEUFRYZH/2gAIAQEAAT8hAZQKNvIkc3nOZR32f//aAAwDAQACAAMAAAAQkD//xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEh/9oACAEDAQE/EKhsH//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/ELP/xAAaEAACAwEBAAAAAAAAAAAAAAABEQAhMXGh/9oACAEBAAE/EBlI8jiO1Kg7APIYZXIRLM/AQtyf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Informed Decisions&quot;
        title=&quot;Informed Decisions&quot;
        src=&quot;/static/b1eb2113e103c255a0767f7b025edbd9/828fb/wmgd-informed-decisions.jpg&quot;
        srcset=&quot;/static/b1eb2113e103c255a0767f7b025edbd9/ff44c/wmgd-informed-decisions.jpg 158w,
/static/b1eb2113e103c255a0767f7b025edbd9/a6688/wmgd-informed-decisions.jpg 315w,
/static/b1eb2113e103c255a0767f7b025edbd9/828fb/wmgd-informed-decisions.jpg 630w,
/static/b1eb2113e103c255a0767f7b025edbd9/4d836/wmgd-informed-decisions.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A modern developer takes a lot of responsibility. They are required to keep up with the latest changes in their areas of expertise, be it language, frameworks, or libraries. This does not mean that they have to constantly be on the hype train or jump on every new library that becomes popular in the blogs or social media. A good developer is informed, so they make informed decisions and guide the project towards the correct and future-proof direction.&lt;/p&gt;
&lt;p&gt;It is impossible to know everything. It is important to choose your area of expertise and focus on that. When working on a team, it is important to know what you do not know, but equally important to know what your peers do know. Since most software projects are a team effort, it is important that each member of the team can complement the knowledge of their peers. This ensures that the team as a whole has a solid foundation of knowledge.&lt;/p&gt;
&lt;h2 id=&quot;Adaptability&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Adaptability&quot; aria-label=&quot;Adaptability permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adaptability&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/221af167ff54457f9afb18f1c0198b6a/4d836/wmgd-adaptability.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABx3XMqBAn/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAIBERITIf/aAAgBAQABBQJYWtdkz2h2bE//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAABBAMAAAAAAAAAAAAAAAABABARMQIiQf/aAAgBAQAGPwKMiQeLUyqa2//EABwQAAICAgMAAAAAAAAAAAAAAAERAEEQITFhof/aAAgBAQABPyE8rIVNBSnsGEpA3M1jrvH/2gAMAwEAAgADAAAAEE//AP/EABYRAQEBAAAAAAAAAAAAAAAAAAARQf/aAAgBAwEBPxDFf//EABcRAQADAAAAAAAAAAAAAAAAAAABEUH/2gAIAQIBAT8Q1UP/xAAbEAEAAwADAQAAAAAAAAAAAAABABEhMUFRof/aAAgBAQABPxDJQ7D78g7vHTinp1Ez3h3uEEeXWcw1aALAOHUXzJ//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Adaptability&quot;
        title=&quot;Adaptability&quot;
        src=&quot;/static/221af167ff54457f9afb18f1c0198b6a/828fb/wmgd-adaptability.jpg&quot;
        srcset=&quot;/static/221af167ff54457f9afb18f1c0198b6a/ff44c/wmgd-adaptability.jpg 158w,
/static/221af167ff54457f9afb18f1c0198b6a/a6688/wmgd-adaptability.jpg 315w,
/static/221af167ff54457f9afb18f1c0198b6a/828fb/wmgd-adaptability.jpg 630w,
/static/221af167ff54457f9afb18f1c0198b6a/4d836/wmgd-adaptability.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For developers, jumping from one project to another is part of the job. You need to have the ability to switch contexts or the scope of a project unexpectedly, and then go back to pick up where you left off. You should always be prepared to adapt and respond to issues when they arise. This ability is important in the tech industry in particular because things can change quickly. Sometimes they change on a dime. The tech industry is unpredictable, so having the ability to adjust to the needs of your business&lt;/p&gt;
&lt;p&gt;In the realm of tech, there are very few projects that have steps that are able to be completed one after the other without adapted or changing. As a developer, it’s important to have the ability to switch contexts or the scope of a project unexpectedly, and then go back to pick up where you left off. This is a skill that every developer should develop, because the tech industry can be unpredictable, so being able to adjust to the needs of your business or product when they change is&lt;/p&gt;
&lt;h2 id=&quot;Knowledge&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Knowledge&quot; aria-label=&quot;Knowledge permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Knowledge&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f484d560230c37f46e685d532a386765/4d836/wmgd-knowledge.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECAwT/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHa2iomH//EABkQAAIDAQAAAAAAAAAAAAAAAAEQAAIRMf/aAAgBAQABBQIBYrcyf//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAQADAAAAAAAAAAAAAAAAABAAEeH/2gAIAQEABj8CNlv/xAAaEAEBAQADAQAAAAAAAAAAAAABABExQVGR/9oACAEBAAE/IUDv7O5hkteGIaRMx5f/2gAMAwEAAgADAAAAEIPf/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8QV//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCsr//EABsQAQEBAQADAQAAAAAAAAAAAAERACExQYGx/9oACAEBAAE/EIB6vlnK1LLK/rrADAGOp8wn0QQiesOcAG//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Knowledge&quot;
        title=&quot;Knowledge&quot;
        src=&quot;/static/f484d560230c37f46e685d532a386765/828fb/wmgd-knowledge.jpg&quot;
        srcset=&quot;/static/f484d560230c37f46e685d532a386765/ff44c/wmgd-knowledge.jpg 158w,
/static/f484d560230c37f46e685d532a386765/a6688/wmgd-knowledge.jpg 315w,
/static/f484d560230c37f46e685d532a386765/828fb/wmgd-knowledge.jpg 630w,
/static/f484d560230c37f46e685d532a386765/4d836/wmgd-knowledge.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Knowledge is crucial to being able to apply your creativity. An understanding of the why? behind how you are solving a problem is the difference between a good programmer and a great one. You should not only understand the syntax of the language you are using but also understand how and why it works the way it does.&lt;/p&gt;
&lt;h2 id=&quot;Efficiency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Efficiency&quot; aria-label=&quot;Efficiency permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Efficiency&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/4d836/wmgd-efficiency.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAUWTDMpIi1//xAAbEAACAgMBAAAAAAAAAAAAAAABAgADEBIUIf/aAAgBAQABBQIWmNewnQ0JOre4/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/ARV//8QAFhABAQEAAAAAAAAAAAAAAAAAMQAg/9oACAEBAAY/Amc//8QAGBAAAwEBAAAAAAAAAAAAAAAAAAERQRD/2gAIAQEAAT8hjGgGER3BnF5//9oADAMBAAIAAwAAABD/AN//xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQMBAT8QQsv/xAAWEQEBAQAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8QSdn/xAAbEAEAAwADAQAAAAAAAAAAAAABABEhMXGBof/aAAgBAQABPxBNvo2A63hLWDXcQ526lodtR5n/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Efficiency&quot;
        title=&quot;Efficiency&quot;
        src=&quot;/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/828fb/wmgd-efficiency.jpg&quot;
        srcset=&quot;/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/ff44c/wmgd-efficiency.jpg 158w,
/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/a6688/wmgd-efficiency.jpg 315w,
/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/828fb/wmgd-efficiency.jpg 630w,
/static/de54d9e10cfdc11e1c6ca18b8bc1b3c5/4d836/wmgd-efficiency.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Programming is the practice of designing and building an application, software, or website with programming language. Programmers need to be able to determine what the problem is and then find a solution to it. A programmer must think logically and clearly so they can create logical codes. A good programmer must be able to write programs fast and efficiently. A good programmer must have time management skills. Programs can be tested and fixed several times, but a good programmer must have a work plan.&lt;/p&gt;
&lt;h2 id=&quot;Testing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Testing&quot; aria-label=&quot;Testing permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Testing&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7247b597a52853909e9b3e91d5fda482/4d836/wmgd-testing.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAADAAH/2gAMAwEAAhADEAAAAdJSuxgZF//EABsQAAIBBQAAAAAAAAAAAAAAAAECEgMQESEx/9oACAEBAAEFAmchpnA5UG4i3//EABYRAQEBAAAAAAAAAAAAAAAAABECEP/aAAgBAwEBPwFkz//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/Aaf/xAAZEAADAAMAAAAAAAAAAAAAAAAAAREQMWH/2gAIAQEABj8ClNiF3P8A/8QAHBABAAIBBQAAAAAAAAAAAAAAAQARUSExQWGR/9oACAEBAAE/IWI4YlqTb1HbOIL7oHZUqtCf/9oADAMBAAIAAwAAABDQD//EABcRAQEBAQAAAAAAAAAAAAAAAAEAESH/2gAIAQMBAT8QyHJRb//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAgEBPxAQv//EABgQAQEBAQEAAAAAAAAAAAAAAAERACEx/9oACAEBAAE/EJIgDCtFSeuKZ3FXpw6iV0MWTEhy+3AAEDw3/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Testing&quot;
        title=&quot;Testing&quot;
        src=&quot;/static/7247b597a52853909e9b3e91d5fda482/828fb/wmgd-testing.jpg&quot;
        srcset=&quot;/static/7247b597a52853909e9b3e91d5fda482/ff44c/wmgd-testing.jpg 158w,
/static/7247b597a52853909e9b3e91d5fda482/a6688/wmgd-testing.jpg 315w,
/static/7247b597a52853909e9b3e91d5fda482/828fb/wmgd-testing.jpg 630w,
/static/7247b597a52853909e9b3e91d5fda482/4d836/wmgd-testing.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Testing is a critical part of the software development lifecycle. Whether it’s done by a developer, an engineer, or a QA team, testing is incredibly important to create high-quality, bug-free products. Whether you’re building an app, a website, or a piece of hardware, testing is essential to ensure the quality of your product.&lt;/p&gt;
&lt;h2 id=&quot;Communication&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Communication&quot; aria-label=&quot;Communication permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Communication&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/737ac198c3f19ee604f71a93c6f585e2/4d836/wmgd-communication.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAABpT2PQJwv/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIDEQASMf/aAAgBAQABBQIdaajWMtNooUSkj//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/Aaj/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwGK/8QAGxAAAgIDAQAAAAAAAAAAAAAAABECMQEQQWH/2gAIAQEABj8Ch4JdKJKsDT1//8QAGxAAAgMBAQEAAAAAAAAAAAAAAREAITFBUXH/2gAIAQEAAT8hsF9sexE16YrYbQDI4fYiJoLuOiE//9oADAMBAAIAAwAAABDgH//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Qp4Uf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAECAQE/EI1L/8QAHBABAQACAgMAAAAAAAAAAAAAAREAITFBccHw/9oACAEBAAE/EIORA0Sl1esLQKXGGNP3GErZOpMOCSILva7fOLrCUuUdOFVVB4ewfef/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Communication&quot;
        title=&quot;Communication&quot;
        src=&quot;/static/737ac198c3f19ee604f71a93c6f585e2/828fb/wmgd-communication.jpg&quot;
        srcset=&quot;/static/737ac198c3f19ee604f71a93c6f585e2/ff44c/wmgd-communication.jpg 158w,
/static/737ac198c3f19ee604f71a93c6f585e2/a6688/wmgd-communication.jpg 315w,
/static/737ac198c3f19ee604f71a93c6f585e2/828fb/wmgd-communication.jpg 630w,
/static/737ac198c3f19ee604f71a93c6f585e2/4d836/wmgd-communication.jpg 920w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We often work in teams, but communication is a problem. We are all different and we don&apos;t all use the same words to express ourselves. It&apos;s hard to find a common language and things can get mixed up. We need to know the language of each person and we need to learn to listen. We need to be aware when someone is saying something, or we may miss what they are saying, or they may miss what we are saying.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to disable Message of the Day prompt?]]></title><description><![CDATA[The abbreviation "motd" stands for "message of the day", and this file has been traditionally used for exactly that (it requires much less…]]></description><link>https://devopstips.net/2021-08-17-how-to-disable-message-of-the-day-prompt/</link><guid isPermaLink="false">https://devopstips.net/2021-08-17-how-to-disable-message-of-the-day-prompt/</guid><pubDate>Tue, 17 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;The abbreviation &lt;em&gt;&quot;motd&quot;&lt;/em&gt; stands for &lt;em&gt;&quot;message of the day&quot;&lt;/em&gt;, and this file has been traditionally used for exactly that (it requires much less disk space than mail to all users).&lt;/p&gt;
&lt;p&gt;The contents of &lt;code class=&quot;language-text&quot;&gt;/run/motd&lt;/code&gt; are displayed by &lt;a href=&quot;https://linux.die.net/man/1/login&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;login&lt;/a&gt; after a successful &lt;em&gt;login&lt;/em&gt; but just before it executes the &lt;em&gt;login shell&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;- Ubuntu Manpage for Message of the Day&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;/run/motd&lt;/code&gt; file is a text file with contents that can be displayed to all users logging in on the system. The content of the file is usually a system message, which can be used to convey information about the current state of the system to users logging in.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c8fd10aefcec050ab132a25d40547c79/159fb/motd-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.9873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+UlEQVQoz21S7YrbMBD0EzR30PvTFkrOSfypb+1qJVt2HCe5uxba93+bIjt3pKUwCLEwo5lZZdvt9y/fvm4eHzcPD582m89PT9pa8h6ds4iAaAEAEZwDRHQOySFRCIFil6ngWrCVlgwMA1Np1VijAklyDRjpHUOrPClPglAF0p2X3inveHBZA0b3wcaOOaitloE4ofQuXRwcJN8JlrPmua3ztn5ekLf1ti4rqzIbu9ffv8J8OgimOz+8XPrLfHx7idfz8fXaX2bhXc6anDU73n7gua0r0Fm9eGvBJocOWjDcgSBky6kCJduBCslz1ux5u6rkrElk7hCGXi0mbexKLRurV/8wRBmoUOIgeaFlqeW2qf4ih3k6//wRTkcbQ3c+VUbpLjC0OMbhepneXm3suEstmD5wB9zBXrC8qSurM0EOh2iHTlCyfZD8BsH27yiWSSFFoRJuma3O9oLVVjdgSiVT2iW5JNxzlopdqvoHK7kGndmhp2k0fcAxmi6YPsDQu3EI8ySXnu9LTlgzry+bPtA0+tMxXmZ/OuIQ42WmaaRphKFvrG7BptiESehd61bYvdiev+dchh/5Sy3X2HvBbuR1zzSNYZ7i9YxjdMdBELZoE8Co4BlalhpGTijI1Vbn9+QKVKlEZVSpZfqMycVtkzv+/7Z2y6Uw8g8wD6BgHxpu0gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Message of the Day prompt on Window Terminal window&quot;
        title=&quot;Message of the Day prompt on Window Terminal window&quot;
        src=&quot;/static/c8fd10aefcec050ab132a25d40547c79/f058b/motd-0.png&quot;
        srcset=&quot;/static/c8fd10aefcec050ab132a25d40547c79/c26ae/motd-0.png 158w,
/static/c8fd10aefcec050ab132a25d40547c79/6bdcf/motd-0.png 315w,
/static/c8fd10aefcec050ab132a25d40547c79/f058b/motd-0.png 630w,
/static/c8fd10aefcec050ab132a25d40547c79/40601/motd-0.png 945w,
/static/c8fd10aefcec050ab132a25d40547c79/159fb/motd-0.png 1019w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Execute the following command on a &lt;em&gt;Terminal&lt;/em&gt; window to display the content of &lt;code class=&quot;language-text&quot;&gt;/run/motd&lt;/code&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /run/motd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This file is used to display system information, to alert users of system-wide changes, or to advertise information. In some cases, system administrators might want to display specific message to users after successful login.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/641f5de3e0fe6bd0f8caa21569a841a9/3dde1/motd-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.9873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB90lEQVQoz11S2W7bQAzUawPUbd4atCgQn9LeF/fSbUey0qL//zvFrhI7LTAgiF0OjyGLHz+/f3t62nzZfN5sPj08fH18ZEIorYWUUimZrUhYnWSVMcaAjbEwXfR95/o2nkfuAGlJwKg6yuAJaBEctSCjl8FzZ2X0KgYRnPCWB1cgLY+CnZSotCyVKJU4SV4qUSlxFPzA6YHTk+QryvyVYjglzhS6rac/v4dlptbI6Nt5qi/nYZmb6dJMF91EYs2e4i1BO4pveMZVBapg3taXkTl7EIx7a9oausb2rW6iGzo/9MxBKfmBkX3GjuJkCUagCwyaeyuCN22d4pRAWmLQxBrqABmFjJLRnyS/lb2ToWv7ZTZdw70N5xEbpZvIHLih669zO70wB0dOiTUi+KNgpUpd7AhKbbux765TOA+6iSr6PcWlEkdOkwR1gJyUe0stMGepA+rgwMgWZ/JRMB6cCA6btJgcZ5iz+6zKM662BCVkzVbZ9oxsCUptE9DUAQaNjMLJN9SalMLBSbzPuXLom2Z55kwO52FYru38Mv5amulSX87j69Jf5/F18WNfKYmM4t4S0DfmXbBKp/PAoAhobHSlJbFmPRhsVL4Wyb1FWubi+Fa5Al0cFFtnuI10d953s8XV24ZWcn48aVF8bGb9+P/lY7f/kv8ChCOd29xmLsEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Content of the /run/motd file show on Window Terminal window&quot;
        title=&quot;Content of the /run/motd file show on Window Terminal window&quot;
        src=&quot;/static/641f5de3e0fe6bd0f8caa21569a841a9/f058b/motd-1.png&quot;
        srcset=&quot;/static/641f5de3e0fe6bd0f8caa21569a841a9/c26ae/motd-1.png 158w,
/static/641f5de3e0fe6bd0f8caa21569a841a9/6bdcf/motd-1.png 315w,
/static/641f5de3e0fe6bd0f8caa21569a841a9/f058b/motd-1.png 630w,
/static/641f5de3e0fe6bd0f8caa21569a841a9/40601/motd-1.png 945w,
/static/641f5de3e0fe6bd0f8caa21569a841a9/3dde1/motd-1.png 1018w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To disable the &lt;em&gt;&quot;message of the day&quot;&lt;/em&gt; prompt, execute the following command on a &lt;em&gt;Terminal&lt;/em&gt; window and create a blank &lt;code class=&quot;language-text&quot;&gt;.hushlogin&lt;/code&gt; file at the root folder of the current user;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; ~/.hushlogin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manpages.ubuntu.com/manpages//precise/man5/motd.5.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Ubuntu Message of the Day ManPage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How to find and delete files by extension]]></title><description><![CDATA[Creating, modifying and deleting files are everyday tasks performed in any operating system mostly used by System Administrators. Linux…]]></description><link>https://devopstips.net/2021-08-10-how-to-find-and-delete-files-by-extension/</link><guid isPermaLink="false">https://devopstips.net/2021-08-10-how-to-find-and-delete-files-by-extension/</guid><pubDate>Tue, 10 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Creating, modifying and deleting files are everyday tasks performed in any operating system mostly used by &lt;em&gt;System Administrators&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Linux&lt;/em&gt; operating system provides users an easy way to delete files and directories. This can be done using the &lt;a href=&quot;http://www.linuxcommand.org/lc3_man_pages/rm1.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;rm&lt;/a&gt; command.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;rm&lt;/code&gt; command is the &lt;em&gt;remove&lt;/em&gt; command in the &lt;em&gt;Linux&lt;/em&gt; operating system. It can be used to delete &lt;em&gt;files&lt;/em&gt;, &lt;em&gt;directories&lt;/em&gt; and &lt;em&gt;links&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;System Administrator (&lt;em&gt;sysadmins&lt;/em&gt;), often need to clean things up to keep the system clean. This cleaning process may take quite a while, including finding and deleting files recursively in a folder structure.&lt;/p&gt;
&lt;p&gt;One method for removing batches of files based on file &lt;em&gt;extensions&lt;/em&gt;, or &lt;em&gt;filename patterns&lt;/em&gt;, is the &lt;a href=&quot;http://www.linuxcommand.org/lc3_man_pages/find1.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;find&lt;/a&gt; command.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;find&lt;/code&gt; command will search for all files and directories within a specific directory, and possibly even within nested subdirectories.&lt;/p&gt;
&lt;p&gt;To begin, you will need to identify the specific directory that you want to search, such as;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/root_folder&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you wanted to search for all files with a &lt;em&gt;&quot;.log&quot;&lt;/em&gt; extension, you would execute;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.log&quot;&lt;/span&gt; -type f&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the &lt;em&gt;&quot; . &quot;&lt;/em&gt; we indicate that it has to search from the directory in which we are, and, with the &lt;em&gt;&quot;*.log&quot;&lt;/em&gt; we tell it to search for all files with the &lt;em&gt;&quot;.log&quot;&lt;/em&gt; extension.&lt;/p&gt;
&lt;p&gt;Finally, to delete the files, just add the &lt;code class=&quot;language-text&quot;&gt;-delete&lt;/code&gt; parameter at the end of the command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; -name &lt;span class=&quot;token string&quot;&gt;&quot;*.log&quot;&lt;/span&gt; -type f -delete&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Good practices for creating Pull Requests]]></title><description><![CDATA[Before Git, the open source community used mailing lists for collaboration. Because of this, people had to write very long emails in order…]]></description><link>https://devopstips.net/2021-08-03-good-practices-for-creating-pull-requests/</link><guid isPermaLink="false">https://devopstips.net/2021-08-03-good-practices-for-creating-pull-requests/</guid><pubDate>Tue, 03 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before Git, the open source community used mailing lists for collaboration. Because of this, people had to write very long emails in order to justify their work. This caused a lot of friction because people had to spend a lot of time to write long emails and wait for a response from someone else.&lt;/p&gt;
&lt;p&gt;With Git, your changes are local and you can push changes as soon as they are ready. This leads to more efficient and focused discussions.&lt;/p&gt;
&lt;p&gt;Pull Requests are a relatively new tool that allow teams and developers to share, discuss, and merge code. They are a great tool for collaboration and communication. Pull Requests allow a developer to share their work with the team in progress, rather than showing up to a meeting with a completed feature or bug fix.&lt;/p&gt;
&lt;p&gt;This way, the team can review, discuss, and comment on the proposed changes. Pull Requests also allow a developer to get feedback on their code from peers. This is one of the best indicators of the health of a team.&lt;/p&gt;
&lt;p&gt;Pull Requests are a great way to introduce peer code review into the development process. The concept is simple: developers can request that a code change be pulled into the main branch of a project.&lt;/p&gt;
&lt;p&gt;This differs from a patch which is a piece of code that is sent by email to a project maintainer, who then reviews the code and either applies the patch or not. The great thing about pull requests is that they make it easy to discuss code with others.&lt;/p&gt;
&lt;p&gt;Pull requests are also a way to consolidate code reviews, discussions, and commits. They help ensure that the team&apos;s codebase is easy to work with, and they make it easier to keep track of who did what. By having everyone&apos;s code changes reviewed before they&apos;re merged into the project&apos;s codebase, you can ensure that the code that gets merged is clean and follows the project&apos;s guidelines. This helps the team avoid bugs, and it also helps avoid situations where one person&apos;s changes break another person&apos;s code.&lt;/p&gt;
&lt;p&gt;One of the other advantages of creating &lt;em&gt;Pull Requests&lt;/em&gt; is; it&apos;s helping drastically improve the quality of code and documentation. As the quality improves, the project team also gains more confidence and therefore has more time to solve more quality problems.&lt;/p&gt;
&lt;p&gt;Pull requests really help to share knowledge and adjust peoples thinking. Many people know more parts of the code than before, and learn some skills from each other.&lt;/p&gt;
&lt;h2 id=&quot;How-to-create-a-Pull-Request&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#How-to-create-a-Pull-Request&quot; aria-label=&quot;How to create a Pull Request permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to create a Pull Request&lt;/h2&gt;
&lt;p&gt;Creating a Pull Request is so trivial.&lt;/p&gt;
&lt;p&gt;First we need a service that hosts git repositories, such as, Github, Azure DevOps, Bitbucket, Gitlab, etc.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout -b &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;branch-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After checkout to the intended branch, developer will make the changes, and create a commit;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit -m &lt;span class=&quot;token string&quot;&gt;&quot;fix(shopping-cart): sum of the items prices in the shopping cart&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to push the changes to the remote repository;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push -u origin &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;branch-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&apos;s time to create the &lt;em&gt;Pull Request&lt;/em&gt;, &lt;a href=&quot;https://cli.github.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub CLI&lt;/a&gt; has a command to do this, &lt;a href=&quot;https://cli.github.com/manual/gh_pr_create&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;gh pr create&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gh &lt;span class=&quot;token function&quot;&gt;pr&lt;/span&gt; create --title &lt;span class=&quot;token string&quot;&gt;&quot;shopping cart grand total fix&quot;&lt;/span&gt; --body &lt;span class=&quot;token string&quot;&gt;&quot;sum of the items prices in the shopping cart calculated correct again 🥳&quot;&lt;/span&gt; --reviewer &lt;span class=&quot;token string&quot;&gt;&quot;polatengin&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;Good-practices-for-Pull-Requests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Good-practices-for-Pull-Requests&quot; aria-label=&quot;Good practices for Pull Requests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Good practices for Pull Requests&lt;/h2&gt;
&lt;p&gt;There are some tips and good practices that we can use when creating &lt;em&gt;Pull Requests&lt;/em&gt;, one of the most important parts of developers&apos; lives.&lt;/p&gt;
&lt;h3 id=&quot;Review-your-own-Pull-Request&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Review-your-own-Pull-Request&quot; aria-label=&quot;Review your own Pull Request permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review your own Pull Request&lt;/h3&gt;
&lt;p&gt;It is important that you review your pull request before asking someone else to review it. That is because you may miss important things due to your familiarity with the code that you have written.&lt;/p&gt;
&lt;p&gt;Also, check out the guidelines below to make sure that your code is ready for review, such as, tests, documentation and formatting.&lt;/p&gt;
&lt;p&gt;Sometimes, people have trouble reviewing their own code. It&apos;s a totally normal thing! We all have blind spots. When people start contributing to open source projects, they often need someone else to review their work before they submit it. This is because they are not used to the style and often don&apos;t catch their own mistakes. Even experienced developers frequently need review!&lt;/p&gt;
&lt;h3 id=&quot;Make-sure-the-code-builds-and-works&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Make-sure-the-code-builds-and-works&quot; aria-label=&quot;Make sure the code builds and works permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make sure the code builds and works&lt;/h3&gt;
&lt;p&gt;When you are going to contribute to an open source project, please do all testing on your local machine. Yes, it works on my machine is the worst excuse for not testing. It is unreliable and leads to frustration. If it doesn&apos;t work on your machine, it&apos;s unlikely to work on other machines as well.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have access to a machine that runs the software you&apos;re working with, it&apos;s your responsibility to find one — or build a virtual machine using a service like Vagrant. There&apos;s no excuse for not testing.&lt;/p&gt;
&lt;p&gt;It is also important to test the code on different environments as much as possible before sending a Pull Request. An important thing to check is that the page is working and that user interaction is possible.&lt;/p&gt;
&lt;h3 id=&quot;Make-small-Pull-Requests-and-often&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Make-small-Pull-Requests-and-often&quot; aria-label=&quot;Make small Pull Requests and often permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make small Pull Requests (and often)&lt;/h3&gt;
&lt;p&gt;We value quickness and agility in our team. In order to achieve this, we need effective communication and reviews in order to be able to close Pull Requests quickly. We do not enjoy when people do not follow the team&apos;s process and raise comments in an asynchronous manner.&lt;/p&gt;
&lt;p&gt;The goal of review should be to get code merged into the main branch as quickly as possible. As soon as the code is merged, it is out of the reviewers&apos; hands. Reviewers should be focused on the code in front of them, not distracted by discussions about unrelated topics.&lt;/p&gt;
&lt;p&gt;When we first started to use this way of working we saw that when we had a team member with a really big pull request it took a bit longer time to get the pull request reviewed and merged. After a while we learned that we should never create a pull request which contained more than one day of work from a team member. Instead we should split the story into smaller stories and do a pull request for each one. This also helps us to get the work done faster because we don&apos;t wait for all the feedback before we start working on the next story.&lt;/p&gt;
&lt;p&gt;Smaller commits lead to more frequent deployments and a greater feeling of progress. It also makes bugs easier to track down, since there are fewer changes to the codebase.&lt;/p&gt;
&lt;p&gt;The smaller the Pull Requests, the better.&lt;/p&gt;
&lt;h3 id=&quot;Write-a-good-description&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Write-a-good-description&quot; aria-label=&quot;Write a good description permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Write a good description&lt;/h3&gt;
&lt;p&gt;The description written in the pull request is one of the most important and useful parts of reviewing it. If someone reviewing the code sees that hundreds of lines have been added, dozens of lines deleted, and multiple files have been renamed, they probably don&apos;t know the reason for these changes, so in order to help them review your code, please leave a good description to explain what you are doing.&lt;/p&gt;
&lt;p&gt;Writing a complete description in the pull request will help provide context for the review.&lt;/p&gt;
&lt;h3 id=&quot;Automate-everything-possible&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Automate-everything-possible&quot; aria-label=&quot;Automate everything possible permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automate everything possible&lt;/h3&gt;
&lt;p&gt;Automation is a key part of good &lt;em&gt;DevOps&lt;/em&gt; practice. Ideally, automation leads to an increase in quality and consistency. It also helps to reduce the amount of time it takes to deploy new code to production.&lt;/p&gt;
&lt;p&gt;When you have automated steps in place, you can easily deploy your app and move on to the next task.&lt;/p&gt;
&lt;p&gt;There are some steps that can easily automated;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Tests:&lt;/em&gt; Tests should run automatically whenever a Pull Request is opened or updated. The branch should not be merged unless the tests pass.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Documentation:&lt;/em&gt; Maintaining documentation is a very tedious process, so the more automated the process, the better. For example, if we are developing a documented API, we can automatically generate it as OpenAPI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To generate documentation from code, we can use a code generator, such as Angular&apos;s &lt;a href=&quot;https://github.com/angular/angular.js/wiki/Contribution%3A-Writing-AngularJS-Documentation&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ngDoc&lt;/a&gt; tool or Swagger&apos;s code generator. These tools can generate documentation based on comments in the source code. You can then use a tool such as Swagger UI to display the documentation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Formatting the code:&lt;/em&gt; Checking the formatting of the code can also be automated and merging can be blocked if the format is not correct. Check the documentation format to avoid comments on the Pull Request, such as &quot;this line is too long&quot;, &quot;this method is too large&quot;, &quot;this class is not well formatted&quot;, &quot;variable name doesn&apos;t follow naming convention&quot;.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Create, Host and Share Docker Images with GitHub Packages]]></title><description><![CDATA[After the rise of cloud, and rise of microservices approaches, modular, plug-and-play and containerized applications are getting more…]]></description><link>https://devopstips.net/2021-03-30-create-host-and-share-docker-images-with-github-packages/</link><guid isPermaLink="false">https://devopstips.net/2021-03-30-create-host-and-share-docker-images-with-github-packages/</guid><pubDate>Tue, 30 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After the rise of &lt;em&gt;cloud&lt;/em&gt;, and rise of &lt;em&gt;microservices approaches&lt;/em&gt;, &lt;em&gt;modular&lt;/em&gt;, &lt;em&gt;plug-and-play&lt;/em&gt; and &lt;em&gt;containerized&lt;/em&gt; applications are getting more attention.&lt;/p&gt;
&lt;p&gt;So, literally &lt;em&gt;hundreds of thousands&lt;/em&gt; software engineers are working on projects that built with multiple &lt;em&gt;containerized&lt;/em&gt; pieces, all around the world.&lt;/p&gt;
&lt;p&gt;If you&apos;re using &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; and wanted a place to store and serve &lt;em&gt;Docker Images&lt;/em&gt; for your project, you can easily go and use &lt;a href=&quot;https://github.com/features/packages&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Packages&lt;/a&gt;, it&apos;s free &lt;sup&gt;(*)&lt;/sup&gt; and super easy to use 🥳&lt;/p&gt;
&lt;p&gt;You can have package registries for your;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Images&lt;/li&gt;
&lt;li&gt;npm packages&lt;/li&gt;
&lt;li&gt;Maven packages&lt;/li&gt;
&lt;li&gt;Gradle packages&lt;/li&gt;
&lt;li&gt;NuGet packages&lt;/li&gt;
&lt;li&gt;Ruby Gems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;&lt;sup&gt;(*)&lt;/sup&gt;: Actually, it&apos;s not free (🤦‍♂️) if you want to store more than 500MBs&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;Plan&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;Storage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Free&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;500 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Pro&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Team&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Enterprise&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;50 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Additional Storage&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;$0.25 per GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In this post you can find a guideline to publish, serve and pull a Docker Image to GitHub Packages.&lt;/p&gt;
&lt;h2 id=&quot;Creating-the-repo-and-Dockerfile&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-the-repo-and-Dockerfile&quot; aria-label=&quot;Creating the repo and Dockerfile permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating the repo and Dockerfile&lt;/h2&gt;
&lt;p&gt;Let&apos;s create a repo on &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; first;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f0ebbc4ed635e9807e930738e83e7b45/cda19/github-packages-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 74.0506329113924%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAABq0lEQVQoz4WTaW7bMBCFdZHCksx9uG+yYlmO4zQtmgIF+qP3P0pB0lYaoG2AD4MnEg8aDh+7cHiMD082LWG+hPmSls/x4cp0Rtxi4bDwqNTKfaVUcIjbjvkLCxeeX6g9EvBEBgKBqkhlJIVAZKAy0iqKrltURQy+G6geSAWrgagBy1ILcqxibFDdxH236M5NZ5NONq0mr0g4Ah5DaQwJVwz/pcunl+P19Xj9bvKKha+tRgwBg//YrPzcRsVUGrDsEfRY9rX5j81Y+B6JTyPbIUDcgp25yUJnxMy+MtKbqOi6cje//vj1/O3ntH4J8xNTyaTVTY/CTDsEjZG3Ecoy0cqb+bBcj5evzQz2AG7WcRF2YjoxlUoXrmiuM/WeeEec337eqbCYeAI3czNRmVi5xsB1LlQzU5mpxHSizhP33sxUZCoh7vbM7BC0gW09v2Mv+wa+0Q1E9RjGEpV7HloG2sG2eFA9sjvbmd101nF107mksuYRg6c1pIUiSmYRt3+5Kqm98VnFE4FwewDCkxqS9om4RcL9eUNvZmuN8w78kaq4RX97ADX56l+B+Q28wJlkVRc/owAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GitHub create repository screenshot&quot;
        title=&quot;GitHub create repository screenshot&quot;
        src=&quot;/static/f0ebbc4ed635e9807e930738e83e7b45/f058b/github-packages-0.png&quot;
        srcset=&quot;/static/f0ebbc4ed635e9807e930738e83e7b45/c26ae/github-packages-0.png 158w,
/static/f0ebbc4ed635e9807e930738e83e7b45/6bdcf/github-packages-0.png 315w,
/static/f0ebbc4ed635e9807e930738e83e7b45/f058b/github-packages-0.png 630w,
/static/f0ebbc4ed635e9807e930738e83e7b45/cda19/github-packages-0.png 785w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After creating the repo, &lt;em&gt;clone&lt;/em&gt; it and open it with your favorite editor (mine is &lt;a href=&quot;https://code.visualstudio.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Visual Studio Code&lt;/a&gt; 😎)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/polatengin/copenhagen.git

code copenhagen/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we need to create a &lt;em&gt;Dockerfile&lt;/em&gt; and build the image we need in the project. (&lt;em&gt;Example Dockerfile can be found on &lt;a href=&quot;https://github.com/polatengin/copenhagen&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Copenhagen&lt;/a&gt; repo, &lt;a href=&quot;https://github.com/polatengin/copenhagen/blob/master/Dockerfile&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Dockerfile&lt;/a&gt;&lt;/em&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;dockerfile&quot;&gt;&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ubuntu:latest&lt;/span&gt;

&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;LABEL&lt;/span&gt; org.opencontainers.image.source=https://github.com/polatengin/copenhagen&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;Logging-in-to-GitHub-Container-Registry-aka-GitHub-Packages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Logging-in-to-GitHub-Container-Registry-aka-GitHub-Packages&quot; aria-label=&quot;Logging in to GitHub Container Registry aka GitHub Packages permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Logging in to GitHub Container Registry (a.k.a. GitHub Packages)&lt;/h2&gt;
&lt;p&gt;Navigate to &lt;a href=&quot;https://github.com/settings/tokens&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Personal Access Tokens&lt;/a&gt; under &lt;a href=&quot;https://github.com/settings/profile&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Account Settings&lt;/a&gt;, and create a new one, just like below;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ca3e31f434ec99f0f2424d5be704f531/ec3e2/github-packages-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.17721518987341%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsklEQVQ4y4WTjZKcIBCEfZMcKjIIDCA/Iuome3n/d0qNbva29naTqq8sqLLtph2aziyAWU0L2NwKZMKw4YtWmA7sOxphgjDxfJUrb8JKTJUIdXSFcc0GohV4YJgw57rBsNq0Cx176bmaMG4Yd4ybDruJFx126dbRE4BZPiBMbHzeXfnp8kX5BTCNroBJEvOAlTDLgFXYdbAbH0Mv3YHvpaPYH7dUhg26l05PdfSFq+lHP35wdaNXjKv2b9o7zeOmAyvtLN3cgT3KI9r3fImpsNGHcsW4ASblZu0L2IXjxu3K7dbruQX7SPP0MT0VwNQdRxImgs2ASejYSfekfBYzgcrNaf2tfG0Fgs16qsovvbQvYr8Q25zqJ2Big5E2K7+oqQod2be2vsUG1L7oqXI1ddIJkygzkTug2HScB57bTvUa6udAVng6j66Mrkg7Dzr8pzCJyeeLcoUJFCbKszCTpJ0B87/EnUAa6bj3o2/PtjGdYjjm8ay9e+esbA7leg7JvTB60oJu3qBpSGnaXhTmZj//knY+YwNm8jwNSXPr+bUzmBjK1YS1JXFSnmbmfhmfftUfmuetEhiYZlcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GitHub create personal access token screenshot&quot;
        title=&quot;GitHub create personal access token screenshot&quot;
        src=&quot;/static/ca3e31f434ec99f0f2424d5be704f531/f058b/github-packages-1.png&quot;
        srcset=&quot;/static/ca3e31f434ec99f0f2424d5be704f531/c26ae/github-packages-1.png 158w,
/static/ca3e31f434ec99f0f2424d5be704f531/6bdcf/github-packages-1.png 315w,
/static/ca3e31f434ec99f0f2424d5be704f531/f058b/github-packages-1.png 630w,
/static/ca3e31f434ec99f0f2424d5be704f531/40601/github-packages-1.png 945w,
/static/ca3e31f434ec99f0f2424d5be704f531/ec3e2/github-packages-1.png 997w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;* Don&apos;t forget to set write:packages permission&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&apos;ll display the &lt;em&gt;PAT&lt;/em&gt;, copy it to the clipboard.&lt;/p&gt;
&lt;p&gt;Run the following command to login via &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/login/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;docker cli&lt;/a&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${GITHUB_PAT}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; login ghcr.io -u &lt;span class=&quot;token variable&quot;&gt;${GITHUB_USERNAME}&lt;/span&gt; --password-stdin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;* Don&apos;t forget to set your username and PAT to the GITHUB_USERNAME and GITHUB_PAT variables&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;Building-and-Pushing-Docker-Image-to-GitHub-Container-Registry-aka-GitHub-Packages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Building-and-Pushing-Docker-Image-to-GitHub-Container-Registry-aka-GitHub-Packages&quot; aria-label=&quot;Building and Pushing Docker Image to GitHub Container Registry aka GitHub Packages permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building and Pushing Docker Image to GitHub Container Registry (a.k.a. GitHub Packages)&lt;/h2&gt;
&lt;p&gt;It&apos;s time to &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/build/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;build&lt;/a&gt;, &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/tag/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;tag&lt;/a&gt; and &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/push/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;push&lt;/a&gt; the &lt;em&gt;Docker Image&lt;/em&gt; to the &lt;em&gt;GitHub Container Registry&lt;/em&gt; (&lt;em&gt;a.k.a. GitHub Packages&lt;/em&gt;);&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; build -t copenhagen &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; tag copenhagen ghcr.io/polatengin/copenhagen:latest

&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; push ghcr.io/polatengin/copenhagen:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After the Docker Image has been pushed, we can consume it in our projects;&lt;/p&gt;
&lt;video controls style=&quot;width:100%&quot;&gt;
  &lt;source src=&quot;/55012a93dba96634aacad5997e49ab45/github-packages-2.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;p&gt;We can see the packages in out GitHub Account, by navigating to the Packages tab (like, &lt;a href=&quot;https://github.com/polatengin?tab=packages&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/polatengin?tab=packages&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0d87561b82e4db2f4cf5e46f5d7e99f3/e996b/github-packages-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 93.0379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB8ElEQVQ4y4WT647bIBCF/SZVDOYy3AYwxjiJk81m1artj77/01Q2STeX3a30ybJlBg5nzjTn77/y7lX50qlAJVKJHDwHZODp/2hsGAEz4EiEIwKFSX0sY57BxA0zLbdf0NQCHSYdirADEUgkEulbgS13D2yY3TBTNyXCNdxEnw+xnNL27NK86QwRbvnHFyH3xZapCDgCjlTicjKDaNOeqyhMz3UkArnp6zqu+7X+XScO87B7S9uzMGnDTCPdgGnmOko7dOBb7tZd3U1ZPdZQiS5OVOI3qlq+KG+oxIu8Ve2Keb5tK2MHcdydYzlR8O167Yap6PPR5wMOBxsOxu9tmBVO0uVbIOypikQiU6G6tRhGBNbrMZ2EHlby8qniHbCkIJWjCVth0qVV4Ma+nML44tIefFZ+vFLuwAKYf/7+Y+JW2LS6YxtmAsRB6MVqpgJTofsIrnsKnql/vlbDwHOXOghMxU5FCqFl9pm17c6EyaW5U6HmpCEyUL2lOtd4fs5SvMZL12NrqzzX/TV6F+rSZx6zTaVXvoDL0qaVQZi4tPEBbtoPigX6POf92zj/iOW1354xH4n094Rrzp+mCuJRukIgEVWILkSP1BRqSmen9WXq3I6q4YORbIUjMrYCyXs21+et4DrYz7LJMn2fOvQ1fwEJ1cI3VOND/QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GitHub Packages screenshot&quot;
        title=&quot;GitHub Packages screenshot&quot;
        src=&quot;/static/0d87561b82e4db2f4cf5e46f5d7e99f3/f058b/github-packages-3.png&quot;
        srcset=&quot;/static/0d87561b82e4db2f4cf5e46f5d7e99f3/c26ae/github-packages-3.png 158w,
/static/0d87561b82e4db2f4cf5e46f5d7e99f3/6bdcf/github-packages-3.png 315w,
/static/0d87561b82e4db2f4cf5e46f5d7e99f3/f058b/github-packages-3.png 630w,
/static/0d87561b82e4db2f4cf5e46f5d7e99f3/40601/github-packages-3.png 945w,
/static/0d87561b82e4db2f4cf5e46f5d7e99f3/e996b/github-packages-3.png 1050w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;Using-images-from-GitHub-Container-Registry-aka-GitHub-Packages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Using-images-from-GitHub-Container-Registry-aka-GitHub-Packages&quot; aria-label=&quot;Using images from GitHub Container Registry aka GitHub Packages permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Using images from GitHub Container Registry (a.k.a. GitHub Packages)&lt;/h2&gt;
&lt;p&gt;After login to &lt;em&gt;GitHub Container Registry&lt;/em&gt;, we can easily pull and consume images;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;${GITHUB_PAT}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; login ghcr.io -u &lt;span class=&quot;token variable&quot;&gt;${GITHUB_USERNAME}&lt;/span&gt; --password-stdin

&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run -d -it ghcr.io/polatengin/copenhagen:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;* Don&apos;t forget to set your username and PAT to the GITHUB_USERNAME and GITHUB_PAT variables&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So, it&apos;s possible (&lt;em&gt;and relatively easy&lt;/em&gt;) to use &lt;em&gt;GitHub Packages&lt;/em&gt;, within your &lt;em&gt;CI/CD&lt;/em&gt; orchestration platform (&lt;em&gt;such as &lt;a href=&quot;https://github.com/features/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Actions&lt;/a&gt;&lt;/em&gt;), or &lt;em&gt;Kubernetes&lt;/em&gt; platform (&lt;em&gt;such as, &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/aks/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Kubernetes Service (AKS)&lt;/a&gt;&lt;/em&gt;)&lt;/p&gt;
&lt;h2 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/packages/learn-github-packages/about-github-packages&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Official GitHub Packages documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/login/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Docker CLI Login command documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How to troubleshoot AKS (Kubernetes) pods]]></title><description><![CDATA[Guidelines' are always help people to ensure if they made necessary checks before going deep dive. If your team faces the same issue more…]]></description><link>https://devopstips.net/2021-03-23-how-to-troubleshoot-aks-kubernetes-pods/</link><guid isPermaLink="false">https://devopstips.net/2021-03-23-how-to-troubleshoot-aks-kubernetes-pods/</guid><pubDate>Tue, 23 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Guidelines&apos; are always help people to ensure if they made &lt;em&gt;necessary&lt;/em&gt; checks before going deep dive.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your team faces the same issue more than several times, it&apos;s good to keep it recorded. So, next time, your response time will be significantly shorter. That leads happy customers 🥳&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post you can find a &lt;em&gt;guideline&lt;/em&gt; to determine the underlying issue when there is an issue with a pod.&lt;/p&gt;
&lt;h2 id=&quot;Check-if-cluster-is-healthy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Check-if-cluster-is-healthy&quot; aria-label=&quot;Check if cluster is healthy permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check if cluster is healthy&lt;/h2&gt;
&lt;p&gt;First thing first, let&apos;s check if the nodes are healthy. Run the following command and wait to see if all the nodes are in &lt;em&gt;Ready&lt;/em&gt; status;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get nodes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cf96e8baf0dc681e8a5edf34d96655bc/00d43/troubleshoot-aks-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 51.26582278481012%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAABYlAAAWJQFJUiTwAAABL0lEQVQoz3VP626CMBjlHbboss1sC4g3ei8FS8G2IIjxEn8te/8XWRQVdC45ab5z2vOdU+f9azD4/Hh+6T/1ev23Vx4LzCikBFKCGAEEA4IgJQFuT0AwpISK0JGVkdbwNKFK0mQe6WxEkI/hmCAfAaZkmKogZLFZTBgJM+VjSJWUVk85dey6TsvC1Ctptamrar/LyiLf1Iefb54qXVdqmQPBy902EHx12FMleZqY9QrGwontYm61rqvIZElh83UdG52VRbndoHkkdBZmasqpWuYTRpLcwliAKORpMmHEGQs0wmiIwF94MLgOPoZd2syOB4ELZl4DGLgw8MDsqrgn8ah36Wk4mq+bzrhsucedeDZfLtrM7us72rQ4FRnCoE2+Kd9p/jD5xuw+rPo/mj//AhgYbzccI5UIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terminal kubectl get nodes command screenshot&quot;
        title=&quot;Terminal kubectl get nodes command screenshot&quot;
        src=&quot;/static/cf96e8baf0dc681e8a5edf34d96655bc/f058b/troubleshoot-aks-0.png&quot;
        srcset=&quot;/static/cf96e8baf0dc681e8a5edf34d96655bc/c26ae/troubleshoot-aks-0.png 158w,
/static/cf96e8baf0dc681e8a5edf34d96655bc/6bdcf/troubleshoot-aks-0.png 315w,
/static/cf96e8baf0dc681e8a5edf34d96655bc/f058b/troubleshoot-aks-0.png 630w,
/static/cf96e8baf0dc681e8a5edf34d96655bc/40601/troubleshoot-aks-0.png 945w,
/static/cf96e8baf0dc681e8a5edf34d96655bc/00d43/troubleshoot-aks-0.png 1000w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If some of the nodes are &lt;em&gt;not&lt;/em&gt; in the &lt;em&gt;Ready&lt;/em&gt; status, that means those &lt;em&gt;nodes&lt;/em&gt; (&lt;em&gt;or VMs if you will&lt;/em&gt;) are &lt;em&gt;not&lt;/em&gt; healthy.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/344df29d480845bc41dd10e24a266155/d7050/troubleshoot-aks-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABuklEQVQoz31R2Y7bMAz0jxToJvLGhw5LPnQflg8l3t3+/+cUtpvkrcCAIEYih0NmTHLI6C9wvRHUKsmdGYzizrRKFg3eQfA7IW+mpCRTU/T3tWzpFdVmmeL24MG1VjMtr6j+H3CdidHH7cG0rFqqp0gEr7s2J+gCq5wggGH+BMAQoCPuSQ0wzHxaRXBEDADDXdOod29YvZILqgCqL08G4KNYz1GM4bPBOYaDt0xLNHRVSwGGjeSd1VQJpuXgLRG8M7sdOHTXU5kH59N6TmWWKdxTuCeXViIGNY2Dt2IM3FufloIRu0yNEq1R5/CZmkaXFqpl2TEe3FNKFZQUrCkouVHy2eCC7bOUrMkxvFHyz3NnNeHDjZLfVUGVUNOo54h4f4EVwHAf78D1FU/yVHbrHLcHPuqpEuTwWbDmVXx+PXyhc/+AoNNm1jnd7VdVN0bKlqKh+6hLgCHmPezbnafkdZ6z1wVW59r3hek5Tt+bW+feGrNMTEsRvF1mplXcHnG76znui0wrM2p/Hb2MobM6U3N0aZl/vkQMQ3BmnSHvqVHhkcQYpp+v5c+3S4tNi7+vvTdUSz46ZhTi/V9sCJAkdK016QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terminal kubectl describe node command screenshot&quot;
        title=&quot;Terminal kubectl describe node command screenshot&quot;
        src=&quot;/static/344df29d480845bc41dd10e24a266155/f058b/troubleshoot-aks-1.png&quot;
        srcset=&quot;/static/344df29d480845bc41dd10e24a266155/c26ae/troubleshoot-aks-1.png 158w,
/static/344df29d480845bc41dd10e24a266155/6bdcf/troubleshoot-aks-1.png 315w,
/static/344df29d480845bc41dd10e24a266155/f058b/troubleshoot-aks-1.png 630w,
/static/344df29d480845bc41dd10e24a266155/40601/troubleshoot-aks-1.png 945w,
/static/344df29d480845bc41dd10e24a266155/78612/troubleshoot-aks-1.png 1260w,
/static/344df29d480845bc41dd10e24a266155/d7050/troubleshoot-aks-1.png 1647w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can find the issue that causes the node to fail, by executing the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl describe &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;NODE_NAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If nodes are &lt;em&gt;Ready&lt;/em&gt;, check the logs, by executing the following commands;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# On Master node&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /var/log/kube-apiserver.log &lt;span class=&quot;token comment&quot;&gt;# Display API Server logs&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /var/log/kube-scheduler.log &lt;span class=&quot;token comment&quot;&gt;# Display Scheduler logs&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /var/log/kube-controller-manager.log &lt;span class=&quot;token comment&quot;&gt;# Display Replication Manager logs&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# On Worker nodes&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /var/log/kubelet.log &lt;span class=&quot;token comment&quot;&gt;# Display Kubelet logs&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /var/log/kube-proxy.log &lt;span class=&quot;token comment&quot;&gt;# Display KubeProxy logs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If nodes are healthy, continue with checking pods;&lt;/p&gt;
&lt;h2 id=&quot;Check-if-pods-are-healthy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Check-if-pods-are-healthy&quot; aria-label=&quot;Check if pods are healthy permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check if pods are healthy&lt;/h2&gt;
&lt;p&gt;Let&apos;s list the pods;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get pods&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0d13c6e6414a8b99909e078b34db8968/68e9c/troubleshoot-aks-2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.17721518987341%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAACh0lEQVQ4y02TWU/rMBCFp2SHhIDoTpomdpy9djYRNxsggdT//4uuWnOjngc/WDqeb86MoeAxZmt7Y6xWa8dxNpuNOGVZBgBFUYIgsCwLIfT6+rpcLjHGlmU5jqMoCiAvQB5x3t04jl3XTZLkdDpFUZSmqSzLqqq+v79rmpZlme/7tm3LsrxYLPI8Xy6XUNdVVZVt2w7DwDkfx7Gu67ZtCSGSJGma5jiOqqqc86IobNuGm5qm2W63wBg7n8/TNLVtyzm/XC7DMHRd9/b2BgCPj4+u6+q63vc9pVRcAkDXdY7jgO/7SZIghBhjnudFUcQ5F9gAYBjGfr+XZTkMQ8/zLMsSZkLI09MTnE6nvu/ruuacf3x8NDeJh0zTVFVVZFPXdZZlM/YfBaW0aZqu6wTtOI4/Pz/CLLCPx6Ou69M0FUVxj304HCAIgiRJgiBgjCGE0jRtmuZ0k6Zpuq7vdjtVVZMk8X3/+flZmP/SjqIoz/OyLAWCGBghZL/fu65r2/Z2u1VVtWmaPM9nM2NsvV5fe26a5nK5tG3b930cx2I9FouFwPY8T9f1z8/Psiyv1W4ax/GKjTGO45hSihAihOR5fh0gwMPDAwDM2GmaIoTuA7tWFt0WRXE8Hquq2u12c9nZrChKWZZpms6j+jOLVr++vsZxHIZBxAb/dY9dVdWcNqX0OmeMMUIoyzJKaVEUYRgyxnRdn81izgL75eVFcHmeJ0nS1RyGYZ7nGOMsy1zXhTvNG5amqfheACBJkugOxIb8/v4Ow3A+n7+/vymlnHPDMADANE2EkKZp0zTVdT1j931/9fu+jzEmhERR5Pt+lmVBEBBCxNuGYYi/jRA6HA6maQpzkiSr1eofGrVyfo0Gk7IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terminal kubectl get pods command screenshot&quot;
        title=&quot;Terminal kubectl get pods command screenshot&quot;
        src=&quot;/static/0d13c6e6414a8b99909e078b34db8968/f058b/troubleshoot-aks-2.png&quot;
        srcset=&quot;/static/0d13c6e6414a8b99909e078b34db8968/c26ae/troubleshoot-aks-2.png 158w,
/static/0d13c6e6414a8b99909e078b34db8968/6bdcf/troubleshoot-aks-2.png 315w,
/static/0d13c6e6414a8b99909e078b34db8968/f058b/troubleshoot-aks-2.png 630w,
/static/0d13c6e6414a8b99909e078b34db8968/68e9c/troubleshoot-aks-2.png 654w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re seeing some pods are not in &lt;em&gt;Running&lt;/em&gt; state, that means, we need to focus on those pods.&lt;/p&gt;
&lt;p&gt;Let&apos;s run the following command to see if there is a &lt;em&gt;metadata&lt;/em&gt; issue;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl describe pod &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;POD_NAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check the &lt;em&gt;Status&lt;/em&gt;, &lt;em&gt;Reason&lt;/em&gt; and &lt;em&gt;Message&lt;/em&gt; fields first.&lt;/p&gt;
&lt;p&gt;In the below example, we can clearly see that nodes doesn&apos;t have enough memory to run the pod.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4d675f645cd66d033a19fee681df4822/906b5/troubleshoot-aks-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.17721518987341%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAACCElEQVQ4y42TW3PbIBCFbcu62BJ3JHRBGKQoMAi7k7HHTf7/H+tEavuQOuN+Tzws7Nlzlo39cWJdThn13mutlVLGmHEcjTGccyEEpTTLss1D7refoqzTNLXW1nXdtm1VVcMwMMY2T2llB0CRZZm1dp7nuq6bpun7fu22Xfj2srWWMVYUxfV6RQgdDgeM8bc6v+Ccy/M8SRKlFEKoKAoAAISQMYYQevKKMYYQAgBomgYswAXOOaX0SWet9eVyieOYLZRlWdc1ISRb+DL21wOE8HQ6QQidcwCA4/EIAEiS5L9mzrLs7e3tfD6vIR+PR4RQtSClbJpGStn3PaW0LEshBMaYECKlFEJ8Cnh5efHeT9OklMrzXEq5LkkIwXtvrZ2mqe97pVTXdXmet23rnBvHcRNF0fV6/fj4CCGkaRpF0TRNYeH9/f1+v4cQpmlyznnvVwuNMbfbLYTwqXwcx7VCCAEAkFIOw6C1ds7N8/z6+jqOo1JKa/23YJ7nz86UUudcVVWc87quMcYQQkIIxphzXpZlVVVN0xBC4jje7/dpmsZ/2HRdNwyDEEJrjTEWQlRVxRjDGAMA9gtJkkRR9MBthNA8z5xza22zUBTFdrvdLfxbvyb8O2fv/eVyQQiFEFa3IYSU0nU9CSEIIYzx45wZY1mW7XY7Y0zf9+sfbtt2TbIsS8aYEOKh7F/w6z+/TM/GXAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Terminal kubectl describe pod command screenshot&quot;
        title=&quot;Terminal kubectl describe pod command screenshot&quot;
        src=&quot;/static/4d675f645cd66d033a19fee681df4822/f058b/troubleshoot-aks-3.png&quot;
        srcset=&quot;/static/4d675f645cd66d033a19fee681df4822/c26ae/troubleshoot-aks-3.png 158w,
/static/4d675f645cd66d033a19fee681df4822/6bdcf/troubleshoot-aks-3.png 315w,
/static/4d675f645cd66d033a19fee681df4822/f058b/troubleshoot-aks-3.png 630w,
/static/4d675f645cd66d033a19fee681df4822/40601/troubleshoot-aks-3.png 945w,
/static/4d675f645cd66d033a19fee681df4822/906b5/troubleshoot-aks-3.png 950w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;Eviction-Reasons&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Eviction-Reasons&quot; aria-label=&quot;Eviction Reasons permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Eviction Reasons&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MemoryPressure&lt;/strong&gt;: Available memory on the node has satisfied an eviction threshold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DiskPressure&lt;/strong&gt;: Available disk space and inodes on either the node&apos;s root filesystem or image filesystem has satisfied an eviction threshold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PIDPressure&lt;/strong&gt;: Available processes identifiers on the (Linux) node has fallen below an eviction threshold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If there is no &lt;em&gt;issue&lt;/em&gt; with the &lt;em&gt;Status&lt;/em&gt;, &lt;em&gt;Reason&lt;/em&gt; and &lt;em&gt;Message&lt;/em&gt; fields, check the &lt;em&gt;Image&lt;/em&gt; field.&lt;/p&gt;
&lt;h2 id=&quot;Check-Pod-Image-is-correct&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Check-Pod-Image-is-correct&quot; aria-label=&quot;Check Pod Image is correct permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check Pod Image is correct&lt;/h2&gt;
&lt;p&gt;Somehow, your &lt;em&gt;CI/CD Pipeline&lt;/em&gt; may not be able to push the new image to the &lt;em&gt;Container Registry&lt;/em&gt;, but update the &lt;em&gt;Kubernetes Pod Metadata&lt;/em&gt;, so, &lt;em&gt;Kubernetes&lt;/em&gt; cannot fetch the new image and ...&lt;em&gt;will fail&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If the image data is correct, check the integrity of &lt;em&gt;Pod Metadata&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;Check-Pod-Metadata-Integrity&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Check-Pod-Metadata-Integrity&quot; aria-label=&quot;Check Pod Metadata Integrity permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check Pod Metadata Integrity&lt;/h2&gt;
&lt;p&gt;Since the pod is not running properly, let&apos;s delete it safely and validate the &lt;em&gt;Pod Metadata&lt;/em&gt; first, by executing the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply --validate -f deploy.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If there is an issue with the metadata, &lt;code class=&quot;language-text&quot;&gt;--validate&lt;/code&gt; option detects the issue &lt;em&gt;before&lt;/em&gt; applying it to the &lt;em&gt;Kubernetes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If everything up to this point is fine, that means, pod is running, it&apos;s time to check the logs&lt;/p&gt;
&lt;h2 id=&quot;Check-Logs-of-the-Running-Pod&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Check-Logs-of-the-Running-Pod&quot; aria-label=&quot;Check Logs of the Running Pod permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Check Logs of the Running Pod&lt;/h2&gt;
&lt;p&gt;Run the following command to check the logs of the running pod;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get pods

kubectl logs &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;POD_NAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you don&apos;t spot any issue with the logs of the pod, connect to the pod and check the system in the pod;&lt;/p&gt;
&lt;h2 id=&quot;Connect-to-a-Shell-in-the-Container&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Connect-to-a-Shell-in-the-Container&quot; aria-label=&quot;Connect to a Shell in the Container permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Connect to a Shell in the Container&lt;/h2&gt;
&lt;p&gt;To get a shell to the running container, execute the running command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; -ti &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;POD_NAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; -- &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the running pod doesn&apos;t have &lt;code class=&quot;language-text&quot;&gt;bash&lt;/code&gt;, use &lt;code class=&quot;language-text&quot;&gt;sh&lt;/code&gt; instead of &lt;code class=&quot;language-text&quot;&gt;bash&lt;/code&gt;, use the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; -ti &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;POD_NAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; -- &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/debug-application-cluster/debug-cluster/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Official Kubernetes Troubleshoot Clusters Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Configure Out of Resource Handling Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Developing a simple Terratest Module for Azure Container Registry (ACR)]]></title><description><![CDATA[Terratest is a Go library that makes it easier to write automated tests for the infrastructure code. Terratest provides us a variety of…]]></description><link>https://devopstips.net/2021-03-16-developing-a-simple-terratest-module-for-azure-container-registry-acr/</link><guid isPermaLink="false">https://devopstips.net/2021-03-16-developing-a-simple-terratest-module-for-azure-container-registry-acr/</guid><pubDate>Tue, 16 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest&lt;/a&gt; is a &lt;a href=&quot;https://golang.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Go&lt;/a&gt; library that makes it easier to write automated tests for the infrastructure code. &lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest&lt;/a&gt; provides us a variety of helper functions and patterns to test our infrastructure easily.&lt;/p&gt;
&lt;p&gt;In this post, we&apos;re gonna develop a simple &lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest&lt;/a&gt; Module for &lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-registry/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Container Registry (ACR)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re gonna follow the steps below;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#Forking-the-official-repo&quot;&gt;Fork the official repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Adding-the-module&quot;&gt;Add the module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Running-the-CI-workflow-to-test-the-module&quot;&gt;Run the CI workflow to test the module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h2 id=&quot;Forking-the-official-repo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Forking-the-official-repo&quot; aria-label=&quot;Forking the official repo permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Forking the official repo&lt;/h2&gt;
&lt;p&gt;Let&apos;s go to the official &lt;em&gt;Terratest&lt;/em&gt; repo (&lt;a href=&quot;https://github.com/gruntwork-io/terratest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;https://github.com/gruntwork-io/terratest&lt;/em&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4a09095094e68898a7d62a435924e28a/2e237/terratest-acr-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.9620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB6UlEQVQozy2QyW7cMBBEdfaMRHFp7uIikhI10lgeL2M7gHPIZ+SW//+JQE6APlQdCvW6ms+vX/vLR563+bKX+RrSEnL1qeZp2/a3bX+93u631895vV1v95gvuV7r9vz+42dd92Z9useyYaa5Dky6DosOy44oJr0Js3JF+ymUTfvJjQuVjpuRqRDLql1uemaRqsQ99noi9gL5juXY9vyEoCOyLE8uLcZP0qZYNpcWNeRUd58uVAxND0b6mahIhBc2U50wH6gYmPKgAjdR2JEpJ4aRmwMNVCDcUj4gqhpCpbMBQCEqmXIYdM8UogqDxWBPCHqqzw8cnRVCssWCcNti0ZFDN6D8tOyl7hjMCcEJAQY9rTef1yHOy/rG53H8/bT8+RDv2bq5xeKhYycER/gojtXGmUnfM43BUBlsnKVNXAczFIhRf83Drwtfx1hWEyb7fR2RDZODdVn7wyuX1ZCJnbkeCbdnBJhKJhzFVvKRwRDLmupjrrvPa0tkQ4XTrnAd2v74BFQA5bkOXAdhRlChxYLKf/v5y/5S6nW5PvtU/2MPsWpfWiwQU8JEriPoAN95Jj2iin9bwq3yFcmEROpFaolqQIc0P4Ly554jqrQvxh/80ibtirTjueeggw4TBoNFxGbBpmI9d1T/BUhFSst29mrMAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Gruntwork Terratest repo screenshot&quot;
        title=&quot;Gruntwork Terratest repo screenshot&quot;
        src=&quot;/static/4a09095094e68898a7d62a435924e28a/f058b/terratest-acr-0.png&quot;
        srcset=&quot;/static/4a09095094e68898a7d62a435924e28a/c26ae/terratest-acr-0.png 158w,
/static/4a09095094e68898a7d62a435924e28a/6bdcf/terratest-acr-0.png 315w,
/static/4a09095094e68898a7d62a435924e28a/f058b/terratest-acr-0.png 630w,
/static/4a09095094e68898a7d62a435924e28a/2e237/terratest-acr-0.png 790w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fork&lt;/em&gt; it to your own &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; account.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a4827d9c3fc87ff4cd664723f6cd6dce/2e237/terratest-acr-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.9620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB30lEQVQozzWQyW7bQBBEebZEjmbfOTOchbtJS5FkB3CA5DNyy///RCAZBvrQh66q11V9fP7ZLu+pLP205WH1cXRxcHGIZVm327Jdl/26Xz76+W19u4U0pX4dlvP9569h3qp5v4c8QyyZdITbGvIGyQZJIpz2vWyzcsXnRbnSdiPmjumOSB/yrNpUnYhGdibhB7IrDhfi9waJBvIDoA0SedxdHLUrwsSQlzaO0qY4bC5OmNuK6ZDmK49n6jddbkRnSBTmLZGOSs904KbDsuW2Y9oT0VLpETOYWYBlBZGwqqWEA8QJN5DqE1EAS0gNpOYA6Amr4wsDRwmAqCFHzDxfe+wVla6MWxn3r9MDoJCafjn7NNvQj8uV9V33dx//vfN7Mm1fQ/7SkAOgDzHXwadJ2ox5+52ppU1cB6aCsoUGrz5783tiUxfyon0xz2mQqFKZz5e7tMn4otskTFcj8e3NINOIWgyNYB0mNuQ5Dq9p2FyaayQqxK1q85emwZKpR0nsGct1R6WrIcfCPvtz03bJwzquZxeHBzYRrQ2DcqmGHGD5pPX0OUx5Ihx4OlL1KFm6AYgIeDzxWCNZUeVj/0qlO54YwFK5rF2RD/74RXQ8Maa89gVRDXmAeoR6gKpvsPoPaVBLbGegjykAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Forked Terratest repo screenshot&quot;
        title=&quot;Forked Terratest repo screenshot&quot;
        src=&quot;/static/a4827d9c3fc87ff4cd664723f6cd6dce/f058b/terratest-acr-1.png&quot;
        srcset=&quot;/static/a4827d9c3fc87ff4cd664723f6cd6dce/c26ae/terratest-acr-1.png 158w,
/static/a4827d9c3fc87ff4cd664723f6cd6dce/6bdcf/terratest-acr-1.png 315w,
/static/a4827d9c3fc87ff4cd664723f6cd6dce/f058b/terratest-acr-1.png 630w,
/static/a4827d9c3fc87ff4cd664723f6cd6dce/2e237/terratest-acr-1.png 790w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And &lt;em&gt;clone&lt;/em&gt; it to your development environment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re a &lt;em&gt;Microsoft&lt;/em&gt; employee, let &lt;a href=&quot;https://github.com/aztfmod&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;aztfmod&lt;/a&gt; team (or my manager &lt;a href=&quot;https://github.com/rguthriemsft&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Richard Guthrie&lt;/a&gt;, or my fellow team-mate &lt;a href=&quot;https://github.com/hattan&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Hattan Shobokshi&lt;/a&gt; or myself - &lt;a href=&quot;https://github.com/polatengin&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Engin Polat&lt;/a&gt;) know, so you can directly use &lt;a href=&quot;https://github.com/aztfmod/terratest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;aztfmod/terratest&lt;/a&gt; repo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;We&apos;re gonna use &lt;a href=&quot;https://github.com/features/codespaces&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Codespaces&lt;/a&gt; throughout this blog post.&lt;/em&gt;&lt;/p&gt;
&lt;video controls style=&quot;width:100%&quot;&gt;
  &lt;source src=&quot;/9f1075225d8668ba774585e3a4244ab3/terratest-acr-2.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;br /&gt;
&lt;h2 id=&quot;Adding-the-module&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Adding-the-module&quot; aria-label=&quot;Adding the module permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Adding the module&lt;/h2&gt;
&lt;p&gt;First thing first, let&apos;s run the following command to download missing dependencies;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go mod tidy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we&apos;re ready to add the module, to do that, create a file in the &lt;code class=&quot;language-text&quot;&gt;modules/&lt;/code&gt; folder;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; modules/azure/acr.go&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;There is a subfolder for Azure related modules, &lt;code class=&quot;language-text&quot;&gt;modules/azure&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s put the module into the &lt;code class=&quot;language-text&quot;&gt;azure&lt;/code&gt; package by adding the following line at the beginning of the file;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; azure&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Start simple by creating a function that returns the &lt;code class=&quot;language-text&quot;&gt;*containerregistry.Registry&lt;/code&gt; structure, for given Azure Subscription Id, Resource Group Name and ACR (Azure Container Registry) Name;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetACRClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;testing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This function will allow &lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest&lt;/a&gt; users to get the underlying &lt;code class=&quot;language-text&quot;&gt;Registry&lt;/code&gt; structure easily.&lt;/p&gt;
&lt;p&gt;In the future we might need to add more functions, so let&apos;s create an &lt;em&gt;internal&lt;/em&gt; facing function that has the same signature (accepts the same parameters and return the same type);&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getACRClientE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTargetAzureSubscription&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  managedServicesClient &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NewRegistriesClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  authorizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;NewAuthorizer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  managedServicesClient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Authorizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;authorizer

  resource&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; managedServicesClient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;resource&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In this function, first, we&apos;re checking if the provided subscription is valid;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTargetAzureSubscription&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then creating the &lt;code class=&quot;language-text&quot;&gt;Authorizer&lt;/code&gt; and setting it as the &lt;code class=&quot;language-text&quot;&gt;Authorizer&lt;/code&gt; of the underlying service client;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;managedServicesClient &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NewRegistriesClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
authorizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;NewAuthorizer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

managedServicesClient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Authorizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;authorizer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything went well up until this point, we can get the Container Registry instance by calling the Get() method of the client;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;resource&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; managedServicesClient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;resource&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As a &lt;code class=&quot;language-text&quot;&gt;go&lt;/code&gt; rule, if the function starts with lower-case character, it means the function is &lt;em&gt;private&lt;/em&gt; and cannot be accessible from outside of the package, but if the function starts with upper-case character, it means the function is &lt;em&gt;public&lt;/em&gt; and can be accessible from outside of the package.&lt;/p&gt;
&lt;p&gt;This is the main difference between the following function signatures;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetACRClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;testing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getACRClientE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also, if function returns both the structure and an error, function name usually ends with &lt;em&gt;capital E&lt;/em&gt; character, to make it easier to see the function may return an &lt;code class=&quot;language-text&quot;&gt;Error&lt;/code&gt; object;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getACRClientE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After having the &lt;em&gt;private&lt;/em&gt; function, we can call it from the &lt;em&gt;public&lt;/em&gt; function;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;GetACRClient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;testing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;T&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resourceName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;containerregistry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Registry &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  resource&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getACRClientE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resourceName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; resGroupName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscriptionID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  require&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NoError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; resource
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2 id=&quot;Running-the-CI-workflow-to-test-the-module&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Running-the-CI-workflow-to-test-the-module&quot; aria-label=&quot;Running the CI workflow to test the module permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running the CI workflow to test the module&lt;/h2&gt;
&lt;p&gt;If you have access to an &lt;em&gt;Azure Subscription&lt;/em&gt; (get a free &lt;em&gt;Azure Subscription&lt;/em&gt; from: &lt;a href=&quot;https://azure.microsoft.com/en-us/free/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Create your Azure free account today&lt;/a&gt;) you can run the CI workflow on it. If you don&apos;t have access to an &lt;em&gt;Azure Subscription&lt;/em&gt;, you can run the CI workflow on &lt;a href=&quot;https://github.com/aztfmod/terratest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;aztfmod/terratest&lt;/a&gt; repo.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e290afd7e38a14dff9c8a33ebfad2f1f/6f2be/terratest-acr-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.12658227848101%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByElEQVQoz2VS3WoWMRDdx9OWWrS9UFQKSkHwSXwGwTfwUbwQFAp6U2j72d1vN9kk85tkItlPC+JwOAkZDjNzJsPlu/cXby4fnZyePD07fvLs6C8e/8vHp2fHp2dH2+XlxdvzF6/Pn78apiXezbRb5HoS4GJmpVqpdeM/EM37xccECQmQiCVEQOLBr3Fa4hLofk4JGVmQOvekaEJi7pwQSZQ1s2bRzNJ5UEKOIasCAjN3JRIyJ0BRhY2Z1WprrZVacykbail1ENEQUilb8r/IJQvq9+nHhy8fP337PLq55PKQHYg5xN4UIiIREgEgYAcREwsCjev89fbq5/568X5Z3OL8PC8qMhBrBErIAShuCAlDopAoIiFpBEYSoVJK2+/nm5ub3W7nnDOzYe/i7bTu5jR6HD3+WmD0NK08erp3OHpyUKaV7+Y4eohAPpKPjNLHHFZqa6Kcs1n3I/WeCZFLqWbNWrNm1YxYDhvyAVGqqHWxQ3Mh1ZJba2Y19m2mrJpzVlXizFpaM4DuifYQpm2GgzihdKG1Wq1bleAQTCRatVh/719DEvSzlzm4vVLzAbLqVrlXSAkSUACNqEySVc2sW8/inA8xPazqN1ARjnkgeKULAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;aztfmod/terratest repo screenshot&quot;
        title=&quot;aztfmod/terratest repo screenshot&quot;
        src=&quot;/static/e290afd7e38a14dff9c8a33ebfad2f1f/f058b/terratest-acr-3.png&quot;
        srcset=&quot;/static/e290afd7e38a14dff9c8a33ebfad2f1f/c26ae/terratest-acr-3.png 158w,
/static/e290afd7e38a14dff9c8a33ebfad2f1f/6bdcf/terratest-acr-3.png 315w,
/static/e290afd7e38a14dff9c8a33ebfad2f1f/f058b/terratest-acr-3.png 630w,
/static/e290afd7e38a14dff9c8a33ebfad2f1f/40601/terratest-acr-3.png 945w,
/static/e290afd7e38a14dff9c8a33ebfad2f1f/6f2be/terratest-acr-3.png 1029w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;Running-CI-workflow-on-your-own-Azure-Subscription&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Running-CI-workflow-on-your-own-Azure-Subscription&quot; aria-label=&quot;Running CI workflow on your own Azure Subscription permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running CI workflow on your own Azure Subscription&lt;/h3&gt;
&lt;p&gt;Official &lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest&lt;/a&gt; repo and &lt;a href=&quot;https://github.com/aztfmod/terratest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;aztfmod/terratest&lt;/a&gt; fork has a &lt;em&gt;GitHub Action&lt;/em&gt; in &lt;a href=&quot;https://github.com/aztfmod/terratest/blob/master/.github/workflows/ci.yml&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;.github/workflows/ci.yml&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;If you fork one of those repos, &lt;a href=&quot;https://github.com/aztfmod/terratest/blob/master/.github/workflows/ci.yml&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;.github/workflows/ci.yml&lt;/a&gt; file will be exist in your repo too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CI workflow&lt;/em&gt; needs the following &lt;em&gt;Secrets&lt;/em&gt; set up in the repo &lt;em&gt;Settings&lt;/em&gt;;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;AZURE_CREDENTIALS&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To have permission to the Azure Subscription, to be able to provision &quot;&lt;em&gt;terraform script under test&lt;/em&gt;&quot;, you need to create a &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az_ad_sp_create_for_rbac&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Service Principal&lt;/a&gt; by executing the following script in your &lt;em&gt;Terminal&lt;/em&gt;;&lt;/p&gt;
&lt;p&gt;You can generate the credential by executing following script;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az ad sp create-for-rbac --sdk-auth --name terratest_workflow&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output of this command is in json format, copy and paste it in a &lt;em&gt;Secret&lt;/em&gt;, named, &lt;em&gt;AZURE_CREDENTIALS&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;PAT&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the &lt;em&gt;CI workflow&lt;/em&gt; finishes, it creates a comment in the &lt;em&gt;PR&lt;/em&gt;, it&apos;s working against.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CI workflow&lt;/em&gt; uses &lt;em&gt;PAT&lt;/em&gt; to create the comment.&lt;/p&gt;
&lt;p&gt;To create the &lt;em&gt;PAT&lt;/em&gt;, go to &lt;a href=&quot;https://github.com/settings/tokens&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Personal Access Tokens&lt;/a&gt; page under &lt;a href=&quot;https://github.com/settings/apps&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Developer Settings&lt;/a&gt; menu.&lt;/p&gt;
&lt;p&gt;Copy the generated &lt;em&gt;PAT&lt;/em&gt;, and paste it in a &lt;em&gt;Secret&lt;/em&gt;, named, &lt;em&gt;PAT&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Your for is ready to run the tests now, you can use the same guideline in the next section.&lt;/p&gt;
&lt;h3 id=&quot;Running-CI-workflow-on-aztfmodterratest-repo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Running-CI-workflow-on-aztfmodterratest-repo&quot; aria-label=&quot;Running CI workflow on aztfmodterratest repo permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Running CI workflow on aztfmod/terratest repo&lt;/h3&gt;
&lt;p&gt;Since the &lt;em&gt;CI workflow&lt;/em&gt; has &lt;em&gt;workflow_dispatch&lt;/em&gt; trigger, you can go to GitHub Actions page and manually run the workflow.&lt;/p&gt;
&lt;h4 id=&quot;Actors-of-the-workflow&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Actors-of-the-workflow&quot; aria-label=&quot;Actors of the workflow permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Actors of the workflow&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Source repo: official terratest repo (&lt;em&gt;gruntwork-io/terratest&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Forked repo: (&lt;em&gt;e.g., aztfmod/terratest, polatengin/terratest&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;PR: created from forked repo, against source repo (&lt;em&gt;gruntwork-io/terratest/pull/{PR NUMBER}&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h4 id=&quot;Flow-of-the-workflow&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Flow-of-the-workflow&quot; aria-label=&quot;Flow of the workflow permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flow of the workflow&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Developer fork the source repo&lt;/li&gt;
&lt;li&gt;Developer creates a branch in the forked repo&lt;/li&gt;
&lt;li&gt;Developer does the development 😎&lt;/li&gt;
&lt;li&gt;Developer creates a PR&lt;/li&gt;
&lt;li&gt;Developer triggers the CI workflow manually with the following values;
&lt;ul&gt;
&lt;li&gt;Repo: name of the forked repo (&lt;em&gt;e.g. xyz/terratest&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Branch: branch name on the forked repo (&lt;em&gt;e.g. feature/adding-some-important-module&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Target repository: home of the target_pr, which is the source repo (&lt;em&gt;gruntwork-io/terratest&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Target PR: pr number on the source repo (&lt;em&gt;e.g. 14, 25, etc.&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e1d4a0240e2d21c74466fd9904873a0e/99f37/terratest-acr-4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 91.13924050632912%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJElEQVQ4y5WSW27bMBBFtZRaFkmRFN8UJZF6UJYl23HipGjSAl1Au4Fuo19F91vEbhAg7UcMnI9LYC7vkDPJ5vCRWy+sZ6pChUHMFspX3ezauQzbqt+dxcRMeMGLaqy6JQxLgqXHdpvbGbv9mpg052ssM6IuAKLXWDITynbLTJBuUG7gNtgwFdonOXdYtVB2SHWQGq7qvDCQGkAUpDrDEhYmIxIVFlCNmAVEpYivc5EinmCmICIQF8JFKquy6qswQWouFX9B4lU/H3l6JsnLA+s/4/oBNZ+AmjKqMmqy5+vFuUK8iFdWiOXcUdkkxeGH+fpbPP0kj7/y+J3JUjdDoRsqqxccVTUz/kKhPZF1oRrMXZJm+Yc1XK3hKgMpILSceXtHqoW4hVQ7Uu1otcdmk+uIdMzNSMpNNZ7q6QHrNklz+QoS0Pa0OWA3Z7IHOgIVgRqBaEW9VX5hbmRubMajn+5y2SRv3gOY4MZTWQEiIVUAixWgGVbdfJqOT/Ww082o6kHVERXmrTmFfAXZs8jFhRXigGjnpyZM2nVUe2YCL1v4H/M/rCDLiGr6JY5H387MBqobZt9tBkRbv7FhW4bJ+I1wPS+7K5LbYR/Hm27Yl2Frw6Tq+P5kpeuRlx23rSi7M/0V5n4+Dbv7frkfdg9huq363RVtD8vD5uZpOj7286nd3vrx5opk0290H4VrL0v63lGliGW5ar5M8dtex6hcVHW8fNgfjyfKlrRWDscAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Triggering CI workflow screenshot&quot;
        title=&quot;Triggering CI workflow screenshot&quot;
        src=&quot;/static/e1d4a0240e2d21c74466fd9904873a0e/f058b/terratest-acr-4.png&quot;
        srcset=&quot;/static/e1d4a0240e2d21c74466fd9904873a0e/c26ae/terratest-acr-4.png 158w,
/static/e1d4a0240e2d21c74466fd9904873a0e/6bdcf/terratest-acr-4.png 315w,
/static/e1d4a0240e2d21c74466fd9904873a0e/f058b/terratest-acr-4.png 630w,
/static/e1d4a0240e2d21c74466fd9904873a0e/40601/terratest-acr-4.png 945w,
/static/e1d4a0240e2d21c74466fd9904873a0e/99f37/terratest-acr-4.png 1100w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://terratest.gruntwork.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://terratest.gruntwork.io/docs/getting-started/quick-start/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Getting started with Terratest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://terratest.gruntwork.io/docs/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Terratest Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://terratest.gruntwork.io/docs/community/contributing/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Contributing to Terratest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How to remove file from git history]]></title><description><![CDATA[When we commit a file to a git system (such as, Azure DevOps or GitHub) it shows up in the folder structure of the repo. And also, there is…]]></description><link>https://devopstips.net/2021-03-09-how-to-remove-file-from-git-history/</link><guid isPermaLink="false">https://devopstips.net/2021-03-09-how-to-remove-file-from-git-history/</guid><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When we commit a file to a git system (such as, &lt;a href=&quot;https://dev.azure.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps&lt;/a&gt; or &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;) it shows up in the folder structure of the repo.&lt;/p&gt;
&lt;p&gt;And also, there is a record created in the underlying &lt;em&gt;history&lt;/em&gt; structure.&lt;/p&gt;
&lt;p&gt;We can &lt;strong&gt;delete&lt;/strong&gt; the file that needs to be &lt;em&gt;confidential&lt;/em&gt;, after we &lt;em&gt;accidentally&lt;/em&gt; commit it.&lt;/p&gt;
&lt;p&gt;But it&apos;ll stay in the &lt;strong&gt;commit history&lt;/strong&gt; of the git system.&lt;/p&gt;
&lt;p&gt;And anyone who can access the git system, can search through the commit history and find that file.&lt;/p&gt;
&lt;p&gt;To delete a file from the git system, we can use the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;FILE_PATH_AND_NAME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src/backend/.env&quot;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; -rf --cached --ignore-unmatch &lt;span class=&quot;token variable&quot;&gt;${FILE_PATH_AND_NAME}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But, it&apos;ll not remove the file from the &lt;strong&gt;commit history&lt;/strong&gt;. To remove it from the history as well, we can use the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; filter-branch --index-filter &lt;span class=&quot;token string&quot;&gt;&quot;git rm -rf --cached --ignore-unmatch &lt;span class=&quot;token variable&quot;&gt;${FILE_PATH_AND_NAME}&lt;/span&gt;&quot;&lt;/span&gt; HEAD&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This command will delete the file from the &lt;strong&gt;commit history&lt;/strong&gt; and re-write the commit history without it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It may take so long to complete, regarding the size of the commit history of the repo. To give a scale, it may need almost a full hour if you have 10K commits and wanted to remove a file from one of the first commits.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After the command finishes, we just need to commit the changed history, by executing the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push --force&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Git&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Git on Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Viewing the Git Commit History&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/docs/git-rm&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Remove file from the working tree&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Rewrite branch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch#Documentation/git-filter-branch.txt---index-filterltcommandgt&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Index-Filter option of the Filter-Branch command&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Scenario : DevOps for Unity3D game projects]]></title><description><![CDATA[Game projects usually consist of a combination of more than one piece. Such as, game itself, a backend, a messaging platform, notification…]]></description><link>https://devopstips.net/2021-03-02-scenario-devops-for-unity3d-game-projects/</link><guid isPermaLink="false">https://devopstips.net/2021-03-02-scenario-devops-for-unity3d-game-projects/</guid><pubDate>Tue, 02 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Game projects usually consist of a combination of more than one piece. Such as, game itself, a backend, a messaging platform, notification system, etc.&lt;/p&gt;
&lt;p&gt;In this scenario, we&apos;ll create a game project with a &lt;a href=&quot;https://dotnet.microsoft.com/download/dotnet/5.0&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;.Net 5.0&lt;/a&gt; backend and a &lt;a href=&quot;https://unity.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Unity3D&lt;/a&gt; game project.&lt;/p&gt;
&lt;p&gt;We&apos;ll create required &lt;em&gt;infrastructure&lt;/em&gt; resources on one of the most advanced cloud platform; &lt;a href=&quot;https://azure.microsoft.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Microsoft Azure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And we&apos;ll store all the codes on &lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; and apply &lt;em&gt;DevOps practices&lt;/em&gt; by creating couple of &lt;a href=&quot;https://github.com/features/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Actions&lt;/a&gt; in the project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;TL;DR,&lt;/em&gt; you can find the &lt;em&gt;source code&lt;/em&gt;, &lt;em&gt;GitHub Actions&lt;/em&gt; and &lt;em&gt;Bash scripts&lt;/em&gt; in &lt;a href=&quot;https://github.com/polatengin/sarajevo&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;polatengin/sarajevo&lt;/a&gt; repo on &lt;em&gt;GitHub&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&apos;s start with creating the infrastructure on &lt;a href=&quot;https://azure.microsoft.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Microsoft Azure&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;Creating-Infrastructure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-Infrastructure&quot; aria-label=&quot;Creating Infrastructure permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating Infrastructure&lt;/h2&gt;
&lt;p&gt;First, to create &lt;code class=&quot;language-text&quot;&gt;infra.sh&lt;/code&gt; file in &lt;code class=&quot;language-text&quot;&gt;.iac&lt;/code&gt; folder, run the following command on terminal;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; .iac &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; .iac

&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; ./infra.sh

&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x ./infra.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;chmod&lt;/em&gt; command will give &lt;em&gt;executable&lt;/em&gt; capability to the &lt;code class=&quot;language-text&quot;&gt;infra.sh&lt;/code&gt; file, so we can run it by calling it (more details about &lt;em&gt;chmod&lt;/em&gt; command can be found on &lt;a href=&quot;https://en.wikipedia.org/wiki/Chmod&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;chmod wikipedia page&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;./infra.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;First thing first, let&apos;s create couple of variables to hold &lt;em&gt;common&lt;/em&gt; information for the &lt;code class=&quot;language-text&quot;&gt;infra.sh&lt;/code&gt; script;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;PROJECT_NAME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sarajevo&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;LOCATION&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;westeurope&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can find the list of available locations by running the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az account list-locations --output table

DisplayName               Name                 RegionalDisplayName
------------------------  -------------------  -------------------------------------
East US                   eastus               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East US
East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;                 eastus2              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
South Central US          southcentralus       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; South Central US
West US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;                 westus2              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Australia East            australiaeast        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Australia East
Southeast Asia            southeastasia        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Southeast Asia
North Europe              northeurope          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; North Europe
UK South                  uksouth              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; UK South
West Europe               westeurope           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West Europe
Central US                centralus            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Central US
North Central US          northcentralus       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; North Central US
West US                   westus               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West US
South Africa North        southafricanorth     &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Africa&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; South Africa North
Central India             centralindia         &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Central India
East Asia                 eastasia             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East Asia
Japan East                japaneast            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Japan East
Korea Central             koreacentral         &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Korea Central
Canada Central            canadacentral        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Canada&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Canada Central
France Central            francecentral        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; France Central
Germany West Central      germanywestcentral   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Germany West Central
Norway East               norwayeast           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Norway East
Switzerland North         switzerlandnorth     &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Switzerland North
UAE North                 uaenorth             &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Middle East&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; UAE North
Brazil South              brazilsouth          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;South America&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Brazil South
Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;        centralusstage       &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
East US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           eastusstage          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;         eastus2stage         &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
North Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  northcentralusstage  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; North Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
South Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  southcentralusstage  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; South Central US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
West US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;           westusstage          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West US &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
West US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;         westus2stage         &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Asia                      asia                 Asia
Asia Pacific              asiapacific          Asia Pacific
Australia                 australia            Australia
Brazil                    brazil               Brazil
Canada                    canada               Canada
Europe                    europe               Europe
Global                    global               Global
India                     india                India
Japan                     japan                Japan
United Kingdom            uk                   United Kingdom
United States             unitedstates         United States
East Asia &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;         eastasiastage        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East Asia &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Southeast Asia &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    southeastasiastage   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Southeast Asia &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Stage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Central US EUAP           centraluseuap        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Central US EUAP
East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; EUAP            eastus2euap          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; East US &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; EUAP
West Central US           westcentralus        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West Central US
West US &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;                 westus3              &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;US&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West US &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
South Africa West         southafricawest      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Africa&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; South Africa West
Australia Central         australiacentral     &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Australia Central
Australia Central &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;       australiacentral2    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Australia Central &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
Australia Southeast       australiasoutheast   &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Australia Southeast
Japan West                japanwest            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Japan West
Korea South               koreasouth           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Korea South
South India               southindia           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; South India
West India                westindia            &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Asia Pacific&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; West India
Canada East               canadaeast           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Canada&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Canada East
France South              francesouth          &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; France South
Germany North             germanynorth         &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Germany North
Norway West               norwaywest           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Norway West
Switzerland West          switzerlandwest      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Switzerland West
UK West                   ukwest               &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Europe&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; UK West
UAE Central               uaecentral           &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Middle East&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; UAE Central
Brazil Southeast          brazilsoutheast      &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;South America&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; Brazil Southeast&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We need to create a &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Resource Group&lt;/a&gt; to put the project resources in it;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az group create --name &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-rg&quot;&lt;/span&gt; --location &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${LOCATION}&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;A resource group is a container that holds related resources for an Azure solution. The resource group can include all the resources for the solution, or only those resources that you want to manage as a group.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We can create an &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/app-service/app-service-plan-manage&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;App Service Plan&lt;/a&gt; by running the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az appservice plan create --resource-group &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-rg&quot;&lt;/span&gt; --name &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-plan&quot;&lt;/span&gt; --location &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${LOCATION}&lt;/span&gt;&quot;&lt;/span&gt; --sku &lt;span class=&quot;token string&quot;&gt;&quot;FREE&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;An Azure App Service Plan provides the resources that an App Service App needs to run.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Only thing missing is the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/app-service/overview&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;App Service&lt;/a&gt; resource itself, let&apos;s create it with the following command;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az webapp create --resource-group &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-rg&quot;&lt;/span&gt; --plan &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-plan&quot;&lt;/span&gt; --name &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${PROJECT_NAME}&lt;/span&gt;-web&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Azure App Service is an HTTP-based service for hosting web applications, REST APIs, and mobile back ends. You can develop in your favorite language, be it .NET, .NET Core, Java, Ruby, Node.js, PHP, or Python. Applications run and scale with ease on both Windows and Linux-based environments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, we have the infra that can run the backend project.&lt;/p&gt;
&lt;h2 id=&quot;Creating-Backend-Project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-Backend-Project&quot; aria-label=&quot;Creating Backend Project permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating Backend Project&lt;/h2&gt;
&lt;p&gt;To create the backend project, let&apos;s create a folder named &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt;, at the root of the solution;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; backend &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; backend&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&apos;ll use &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/core/tools/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;dotnet cli&lt;/a&gt; to create a &lt;code class=&quot;language-text&quot;&gt;WebApi&lt;/code&gt; project;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dotnet new webapi&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;We created the backend project with the webapi template, alternatively we could use another template for the backend, such as, grpc, mvc, web, etc. More information about the templates can be found on &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new#arguments&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;dotnet new arguments&lt;/a&gt; page&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Based on the genre of the game, we need to add code into the &lt;em&gt;backend&lt;/em&gt; project, for the sake of simplicity of this post, we&apos;re gonna skip adding code into the backend project.&lt;/p&gt;
&lt;h2 id=&quot;Creating-Unity3D-Game-Project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-Unity3D-Game-Project&quot; aria-label=&quot;Creating Unity3D Game Project permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating Unity3D Game Project&lt;/h2&gt;
&lt;p&gt;To create the game project, let&apos;s create a folder named &lt;code class=&quot;language-text&quot;&gt;game&lt;/code&gt;, at the root of the solution;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; game &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; game&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&apos;ll use &lt;code class=&quot;language-text&quot;&gt;Unity3D v2020.2.6.f1&lt;/code&gt; to create the game project;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 272px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/817df82816d4868fbdc206974935438e/2aae8/scenario-game-unity3d-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.24050632911393%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA4ElEQVQ4y+2Ry2qFMBRF/VKn4r/pRBwa8AtUyMyBAx8oBiU6kDxOci5t2iuU4rWdFbrJIAlZWWyOJ6TUABpAKSWEUFq748WCz42ntUZEYwzezvPxB4yIwzBEUTSOIyJaa7/F3P2yLFLKE87znBAShiEhBBEB4MLMOVdKvcGISCn1fT+O4zRN67q+MH+JpzU4c5ZlQRA8zXf4s/M8z0mSTNP0AzOAEUL0fc8YO45j3/dt29q25Zy//MWzFtd1raqqKApKadd1TdOUZckYew27zm501lrznpsDPzv/Iv/wn4EfHvIc9KAmPGAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Unity3D v2020.2.6.f1 screenshot&quot;
        title=&quot;Unity3D v2020.2.6.f1 screenshot&quot;
        src=&quot;/static/817df82816d4868fbdc206974935438e/2aae8/scenario-game-unity3d-0.png&quot;
        srcset=&quot;/static/817df82816d4868fbdc206974935438e/c26ae/scenario-game-unity3d-0.png 158w,
/static/817df82816d4868fbdc206974935438e/2aae8/scenario-game-unity3d-0.png 272w&quot;
        sizes=&quot;(max-width: 272px) 100vw, 272px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Based on the genre of the game, we can select one of the templates at the &lt;em&gt;New Game Creation Dialog&lt;/em&gt;, at the time of writing this post, available options are;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D&lt;/li&gt;
&lt;li&gt;3D&lt;/li&gt;
&lt;li&gt;High Definition RP&lt;/li&gt;
&lt;li&gt;Universal Render Pipeline&lt;/li&gt;
&lt;li&gt;Mobile 2D&lt;/li&gt;
&lt;li&gt;Mobile 3D&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c912f3ee778b463a4e4329d93e1a541e/18539/scenario-game-unity3d-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgklEQVQoz3VR227UMBDNZ1bim9rCqkVCULpNdwvimVe+ANGHCoU+hKa72a2W0o2DL/FlxjMoNqAC7dGRNfbM+Ph4ihfv5k/Lo4Oz8uBN+fzt6eFZuTt9dZ/7J0e7xy/3y9fPTo8zJ7PpZHYymU8LO1hrhghIMY7EyDEyEROnlZg5xfw/CqU1IjIzAFhrY4xE5LyzzhERIPoQlFLe+/g3iKjwIQghqqqiJNKuVuv1mpkRsWkaAEBEAMjZf5Wtc957IQQlaKWklMzkvc+CiKi1ds7db/ulbIYBEWOMIQRpnHagHajBheBDQrbzcLM2BgCY2Xq46QYb4hBo04/PyUU5+yBGz1KqL1UVkKWLt5sbIbrejjfXdZ09Z0e5gYhjIhEX46SMuft+q23oDGy32/6HvNMhIHZdl3/rcWXn84QBcKtCP6Aw2CmgNG0aM/hbcxTvHX/6xh833Eou6sV10y6v2mXTLq//cDVur5aLJp2ngsX5xcXl5ef3582Teb0zq/c+fP0JwzxlRD3em80AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;New game dialog screenshot&quot;
        title=&quot;New game dialog screenshot&quot;
        src=&quot;/static/c912f3ee778b463a4e4329d93e1a541e/f058b/scenario-game-unity3d-1.png&quot;
        srcset=&quot;/static/c912f3ee778b463a4e4329d93e1a541e/c26ae/scenario-game-unity3d-1.png 158w,
/static/c912f3ee778b463a4e4329d93e1a541e/6bdcf/scenario-game-unity3d-1.png 315w,
/static/c912f3ee778b463a4e4329d93e1a541e/f058b/scenario-game-unity3d-1.png 630w,
/static/c912f3ee778b463a4e4329d93e1a541e/40601/scenario-game-unity3d-1.png 945w,
/static/c912f3ee778b463a4e4329d93e1a541e/18539/scenario-game-unity3d-1.png 1074w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After creating the game project, we need to actually develop the game, for the sake of simplicity of this post, we&apos;re gonna skip developing a game with Unity3D.&lt;/p&gt;
&lt;h2 id=&quot;Creating-GitHub-Actions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-GitHub-Actions&quot; aria-label=&quot;Creating GitHub Actions permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating GitHub Actions&lt;/h2&gt;
&lt;p&gt;We&apos;ll use &lt;a href=&quot;https://github.com/features/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Actions&lt;/a&gt; as the &lt;strong&gt;orchestrator&lt;/strong&gt; of pipelines of this project.&lt;/p&gt;
&lt;p&gt;Let&apos;s start with creating &lt;code class=&quot;language-text&quot;&gt;.github/workflows&lt;/code&gt; folder at the root of the solution;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; .github/workflows &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; .github/workflows&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;Creating-GitHub-Action-for-Net-5-Backend-Project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-GitHub-Action-for-Net-5-Backend-Project&quot; aria-label=&quot;Creating GitHub Action for Net 5 Backend Project permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating GitHub Action for .Net 5 Backend Project&lt;/h3&gt;
&lt;p&gt;Create a file named &lt;code class=&quot;language-text&quot;&gt;backend.yml&lt;/code&gt; in the &lt;code class=&quot;language-text&quot;&gt;.github/workflows&lt;/code&gt; folder&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; backend.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open &lt;code class=&quot;language-text&quot;&gt;backend.yml&lt;/code&gt; file with the favorite code editor (in this post we&apos;ll use &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Visual Studio Code&lt;/a&gt;) and start with giving a name to our pipeline;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ci_backend&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We need to define &lt;strong&gt;triggers&lt;/strong&gt; for the pipeline, so pipeline can be start based on an event on &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;workflow_dispatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;backend/**&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&apos;re using 2 &lt;em&gt;triggers&lt;/em&gt;;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;workflow_dispatch&lt;/a&gt;, so we can start the pipeline on &lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; UI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions/reference/events-that-trigger-workflows#push&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;push&lt;/a&gt;, so pipeline will automatically start when there is a commit to GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But, since we have &lt;code class=&quot;language-text&quot;&gt;.iac&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;game&lt;/code&gt; folders, and don2t want to &lt;strong&gt;build&lt;/strong&gt; and &lt;strong&gt;deploy&lt;/strong&gt; backend when there is a commit to &lt;code class=&quot;language-text&quot;&gt;game&lt;/code&gt; folder, we add couple of filters to the &lt;code class=&quot;language-text&quot;&gt;push&lt;/code&gt; trigger;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;branches&lt;/em&gt;, so pipeline will start only if the &lt;em&gt;main&lt;/em&gt; branch gets a commit&lt;/li&gt;
&lt;li&gt;&lt;em&gt;paths&lt;/em&gt;, so pipeline will start only if the listed folders have changed files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can continue with adding &lt;em&gt;jobs&lt;/em&gt; structure to the pipeline, so we can define what type of runner we&apos;ll use &lt;em&gt;under-the-hood&lt;/em&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    steps&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt; provides cloud hosted runners for us, for free, to use them in our pipelines. There are a few &lt;em&gt;flavors&lt;/em&gt; we can choose;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: &lt;em&gt;windows-latest&lt;/em&gt;, &lt;em&gt;windows-2019&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;: &lt;em&gt;ubuntu-latest&lt;/em&gt;, &lt;em&gt;ubuntu-20.04&lt;/em&gt;, &lt;em&gt;ubuntu-18.04&lt;/em&gt;, &lt;em&gt;ubuntu-16.04&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MacOS&lt;/strong&gt;: &lt;em&gt;macos-latest&lt;/em&gt;, &lt;em&gt;macos-11.0&lt;/em&gt;, &lt;em&gt;macos-10.15&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Windows&lt;/em&gt; and &lt;em&gt;Linux&lt;/em&gt; runners have the following hardware specs;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2-core CPU&lt;/li&gt;
&lt;li&gt;7 GB of RAM memory&lt;/li&gt;
&lt;li&gt;14 GB of SSD disk space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;MacOS&lt;/em&gt; runners have the following hardware specs;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3-core CPU&lt;/li&gt;
&lt;li&gt;14 GB of RAM memory&lt;/li&gt;
&lt;li&gt;14 GB of SSD disk space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More details about the hosted runners can be found on &lt;a href=&quot;https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub-hosted runners&lt;/a&gt; page&lt;/p&gt;
&lt;p&gt;First step will be checking out to the branch, so, the runner will have the latest code;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, we need to login to &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/install-azure-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt;, so we can deploy the &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; project code to &lt;a href=&quot;https://azure.microsoft.com/en-us/services/app-service/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure App Service&lt;/a&gt; resource (we provisioned the resource on &lt;a href=&quot;#Creating-Infrastructure&quot;&gt;Creating Infrastructure&lt;/a&gt; section)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; azure cli login
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; azure/login@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;creds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.AZURE_CREDENTIALS &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The runner, will need to login to &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/install-azure-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt; when it&apos;s started, but we don&apos;t want to leak the credentials to our &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/cost-management-billing/manage/create-subscription&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure Subscription&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We need to create a &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/active-directory/develop/app-objects-and-service-principals&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Service Principal&lt;/a&gt; and store the &lt;strong&gt;Service Principal Object&lt;/strong&gt; in a safe place that the runner can access.&lt;/p&gt;
&lt;p&gt;To create the &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Service Principal&lt;/a&gt;, we&apos;ll use &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/install-azure-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt;. Run the following command on your terminal;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;az ad sp create-for-rbac --name &lt;span class=&quot;token string&quot;&gt;&quot;sarajevo-sp&quot;&lt;/span&gt; --sdk-auth --role contributor&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When the &lt;strong&gt;Service Principal Object&lt;/strong&gt; created, it&apos;ll display on the terminal, like below;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;clientId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;GUID&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;clientSecret&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;GUID&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;subscriptionId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;GUID&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tenantId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;GUID&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;activeDirectoryEndpointUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://login.microsoftonline.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;resourceManagerEndpointUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://management.azure.com/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;activeDirectoryGraphResourceId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://graph.windows.net/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sqlManagementEndpointUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://management.core.windows.net:8443/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;galleryEndpointUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://gallery.azure.com/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;managementEndpointUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://management.core.windows.net/&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copy the output and create a &lt;em&gt;Secret&lt;/em&gt; on GitHub&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://github.com/polatengin/sarajevo&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/{ACCOUNT_NAME}/{REPO_NAME}/settings/secrets/actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add a new &lt;em&gt;repository secret&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Paste the output&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please notice that the name of the &lt;em&gt;secret&lt;/em&gt; should be the same with what we&apos;re using in the &lt;strong&gt;Azure CLI Login&lt;/strong&gt; step;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; azure cli login
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; azure/login@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;creds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.AZURE_CREDENTIALS &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the third step, we can set the .Net version to what we&apos;re using in the &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; project;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Setup DotNet Core
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dotnet@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;dotnet-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5.0.x&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the fourth step, we can build and publish the &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; project, so the upcoming steps can access the compiled version of it;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build
  &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
    cd backend&lt;/span&gt;

    dotnet restore
    dotnet build &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;no&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;restore
    dotnet publish &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;configuration release &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;output ./published&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the last step, we actually publish the &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; project to the &lt;strong&gt;Azure App Service&lt;/strong&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deploy to Azure
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; azure/webapps&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;deploy@v2
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;app-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sarajevo-web&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./backend/published&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, we&apos;re ready to start &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; project pipeline, go to &lt;a href=&quot;https://github.com/polatengin/sarajevo/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/{ACCOUNT_NAME}/{REPO_NAME}/actions&lt;/a&gt; and click &lt;em&gt;Run workflow&lt;/em&gt; button;&lt;/p&gt;
&lt;video controls style=&quot;width:100%&quot;&gt;
  &lt;source src=&quot;/50b16475abaffd145b5f7236331758f0/scenario-game-unity3d-2.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;h3 id=&quot;Creating-GitHub-Action-for-Unity3D-Game-Project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Creating-GitHub-Action-for-Unity3D-Game-Project&quot; aria-label=&quot;Creating GitHub Action for Unity3D Game Project permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating GitHub Action for Unity3D Game Project&lt;/h3&gt;
&lt;p&gt;Create a file named &lt;code class=&quot;language-text&quot;&gt;game.yml&lt;/code&gt; in the &lt;code class=&quot;language-text&quot;&gt;.github/workflows&lt;/code&gt; folder&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; game.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open &lt;code class=&quot;language-text&quot;&gt;game.yml&lt;/code&gt; file with the favorite code editor (in this post we&apos;ll use &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Visual Studio Code&lt;/a&gt;) and start with giving a name to our pipeline;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ci_game&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We need to define &lt;strong&gt;triggers&lt;/strong&gt; for the pipeline, so pipeline can be start based on an event on &lt;a href=&quot;https://github.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub&lt;/a&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;workflow_dispatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;game/**&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;You can find more detailed explanation about the triggers at the &lt;a href=&quot;#Creating-GitHub-Action-for-Net-5-Project&quot;&gt;Creating GitHub Action for .Net 5 Backend Project&lt;/a&gt; section of this post.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We can continue with defining the &lt;code class=&quot;language-text&quot;&gt;job&lt;/code&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This time, we&apos;ll do something different, before starting &lt;code class=&quot;language-text&quot;&gt;steps&lt;/code&gt;, we&apos;ll define &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt; to add &lt;code class=&quot;language-text&quot;&gt;matrix&lt;/code&gt; to the game project pipeline;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;strategy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;fail-fast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;targetPlatform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; StandaloneOSX &lt;span class=&quot;token comment&quot;&gt;# Build a macOS standalone (Intel 64-bit).&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; StandaloneWindows &lt;span class=&quot;token comment&quot;&gt;# Build a Windows standalone.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; StandaloneWindows64 &lt;span class=&quot;token comment&quot;&gt;# Build a Windows 64-bit standalone.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; StandaloneLinux64 &lt;span class=&quot;token comment&quot;&gt;# Build a Linux 64-bit standalone.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; iOS &lt;span class=&quot;token comment&quot;&gt;# Build an iOS player.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Android &lt;span class=&quot;token comment&quot;&gt;# Build an Android .apk standalone app.&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; WebGL &lt;span class=&quot;token comment&quot;&gt;# WebGL.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;More detailed information about the &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;matrix&lt;/code&gt; structures can be found on &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategy&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Workflow syntax for GitHub Actions&lt;/a&gt; page&lt;/p&gt;
&lt;p&gt;Basically, we&apos;re telling &lt;a href=&quot;https://github.com/features/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Action&lt;/a&gt; to run the &lt;code class=&quot;language-text&quot;&gt;steps&lt;/code&gt; for the &lt;code class=&quot;language-text&quot;&gt;job&lt;/code&gt; parallely for each of the items in the &lt;code class=&quot;language-text&quot;&gt;targetPlatform&lt;/code&gt; variable in the &lt;code class=&quot;language-text&quot;&gt;matrix&lt;/code&gt; node.&lt;/p&gt;
&lt;p&gt;So, instead of running &lt;code class=&quot;language-text&quot;&gt;steps&lt;/code&gt; once, &lt;a href=&quot;https://github.com/features/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GitHub Action&lt;/a&gt; will run the &lt;code class=&quot;language-text&quot;&gt;steps&lt;/code&gt; more than once (&lt;em&gt;7 times for this example, because there are 7 items in the targetPlatform variable&lt;/em&gt;), but in parallel.&lt;/p&gt;
&lt;p&gt;First step is the same first step we used in the &lt;code class=&quot;language-text&quot;&gt;backend&lt;/code&gt; pipeline;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the second step, we&apos;ll build the &lt;em&gt;Unity3D Game Project&lt;/em&gt;, for each of the items in the &lt;code class=&quot;language-text&quot;&gt;targetPlatform&lt;/code&gt; variable in the &lt;code class=&quot;language-text&quot;&gt;matrix&lt;/code&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Unity &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Builder
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; game&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci/unity&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;builder@v2.0&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;alpha&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;UNITY_LICENSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.UNITY_LICENSE &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;targetPlatform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; matrix.targetPlatform &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;projectPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;game&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Building a Unity3D Game Project requires a Unity3D License, to get a license, we need to run the following GitHub Action steps one-time;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; getManualLicenseFile
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; game&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci/unity&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;activation&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;file@v2

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/upload&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;artifact@v1
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.getManualLicenseFile.outputs.filePath &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.getManualLicenseFile.outputs.filePath &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&apos;s better to create a seperate GitHub Action for these steps;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; onetime_to_get_unity3d_license
&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; workflow_dispatch &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;license&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; getManualLicenseFile
      &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; game&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci/unity&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;activation&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;file@v2
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/upload&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;artifact@v1
      &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.getManualLicenseFile.outputs.filePath &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; steps.getManualLicenseFile.outputs.filePath &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When we run this pipeline one-time, it&apos;ll create a file, named like, &lt;em&gt;Unity_v2019.2.6f1.alf.zip&lt;/em&gt;, we need to download and extract the file to get the &lt;em&gt;Unity_v2019.2.6f1.alf&lt;/em&gt; file.&lt;/p&gt;
&lt;p&gt;After getting the &lt;em&gt;Unity_v2019.2.6f1.alf&lt;/em&gt; file, we need to visit the &lt;a href=&quot;https://license.unity3d.com/manual&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Unity3D Manual License Activation Page&lt;/a&gt; and upload the file.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/89a085e5bbdd0c544267e80452ac73a6/00d43/scenario-game-unity3d-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.17721518987341%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAACCUlEQVQ4y32ST2sTQRjG5ysFrImkLfFc1BYseqogFYtJN/G76N168QNEBMFLevEkgmnBxrb5t2idmc3uzs7s/N0d2V1q4ybxx8sww8zD887DC+5sbKzX641GY23tVqVSuV2tNna3Nx/vbD7aXt+9X394r7aztaqA4zjtdrvT6TiO02w2W63W4WGrnXPw/GD/2f7ek71VAEppv9/3PM91XWOMLSGNTVK7AjCdTo+O3vaOj7vdru/71to0vXmd/AqtNkmaaK1Ta5VS87dg/lAoC5IkE3AltdZSSsG5UorzWEpprgF+ECCEZrOZ5808z/PyDcYeISRmLGYxy4mXASBEZ4Pz4Wg8mboXw/FwPBmNJ+eXQ9/3hRB8jiViEoZeYYozYw/jYkEIQ4QghAghiBDGeNEfBEEAYXaXP8BhThD+QxAG2S8WnRljlNK/axzHfAGlVBbeQucgDEnued0qRCUTxhjC+Oo3JISU9ABxCgUVLKa5rVLKGJPkFDMTUfr0xcva3a0PHz9lxyi6EXNGJSUiIiqKaETCMKSUzvfMGPs++PH12wmESAgxHxt4N7qq9k4ffD6r9U7fT6GVgi6kmiTG2lRKUQocfIGz1wP3zeXPVwP3BAeac8rKkCgiUVQkyq6HhsUxSLW2SVHGaCWkLLL9H0ppLrSUQBvDpZBK56WUkqVpX4JJbMSt1H8A8vB6xLOmvJEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Unity3D manual license activation screenshot&quot;
        title=&quot;Unity3D manual license activation screenshot&quot;
        src=&quot;/static/89a085e5bbdd0c544267e80452ac73a6/f058b/scenario-game-unity3d-3.png&quot;
        srcset=&quot;/static/89a085e5bbdd0c544267e80452ac73a6/c26ae/scenario-game-unity3d-3.png 158w,
/static/89a085e5bbdd0c544267e80452ac73a6/6bdcf/scenario-game-unity3d-3.png 315w,
/static/89a085e5bbdd0c544267e80452ac73a6/f058b/scenario-game-unity3d-3.png 630w,
/static/89a085e5bbdd0c544267e80452ac73a6/40601/scenario-game-unity3d-3.png 945w,
/static/89a085e5bbdd0c544267e80452ac73a6/00d43/scenario-game-unity3d-3.png 1000w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When the page process the file, there&apos;ll be a button to download the license file, named like &lt;em&gt;Unity_v2019.x.ulf&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now we can open &lt;em&gt;Unity_v2019.x.ulf&lt;/em&gt; file with the favorite code editor and copy its content, then we can create a new &lt;em&gt;Secret&lt;/em&gt; on GitHub&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://github.com/polatengin/sarajevo&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/{ACCOUNT_NAME}/{REPO_NAME}/settings/secrets/actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add a new &lt;em&gt;repository secret&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Paste the output&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please notice that the name of the &lt;em&gt;secret&lt;/em&gt; should be the same with what we&apos;re using in the &lt;strong&gt;Unity - Builder&lt;/strong&gt; step;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Unity &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; Builder
  &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; game&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci/unity&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;builder@v2.0&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;alpha&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;UNITY_LICENSE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secrets.UNITY_LICENSE &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;targetPlatform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; matrix.targetPlatform &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;projectPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;game&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Final step is for uploading compiled artifacts of the &lt;em&gt;Unity3D Game Project&lt;/em&gt;;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/upload&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;artifact@v2
  &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build/$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; matrix.targetPlatform &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, we&apos;re ready to start &lt;code class=&quot;language-text&quot;&gt;game&lt;/code&gt; project pipeline, go to &lt;a href=&quot;https://github.com/polatengin/sarajevo/actions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://github.com/{ACCOUNT_NAME}/{REPO_NAME}/actions&lt;/a&gt; and click &lt;em&gt;Run workflow&lt;/em&gt; button;&lt;/p&gt;
&lt;video controls style=&quot;width:100%&quot;&gt;
  &lt;source src=&quot;/ff04e106a52cf3ee2355fa328da98408/scenario-game-unity3d-4.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;p&gt;At the end of the pipeline, we can download artifacts for all of the &lt;code class=&quot;language-text&quot;&gt;targetPlatform&lt;/code&gt;s, or we can add other steps into the pipeline to &lt;em&gt;sign&lt;/em&gt; and &lt;em&gt;publish&lt;/em&gt; the artifacts into stores, such as, &lt;a href=&quot;https://www.microsoft.com/en-us/store/apps/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Microsoft Store&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play Store&lt;/a&gt;, &lt;a href=&quot;https://www.apple.com/app-store/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Apple App Store&lt;/a&gt;, etc.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Software Testing Types]]></title><description><![CDATA[Software Testing Types There are different types of tests that we can use and implement in the CI/CD pipelines to make sure that changes to…]]></description><link>https://devopstips.net/2021-02-22-software-testing-types/</link><guid isPermaLink="false">https://devopstips.net/2021-02-22-software-testing-types/</guid><pubDate>Mon, 22 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;Software-Testing-Types&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Software-Testing-Types&quot; aria-label=&quot;Software Testing Types permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software Testing Types&lt;/h2&gt;
&lt;p&gt;There are different types of tests that we can use and implement in the CI/CD pipelines to make sure that changes to our code are working as expected.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/79d685382aae1bdc512427ab2d76f63e/d326d/software-testing-types-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.58227848101265%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAACe0lEQVQoz5WSWXPSYBiF82OVtZW6duryP5xxvPDWG6sUIYEWkEWahMKUhGxf9j0hIWEtZYkTuKuOjjPn9plzzvseKJN+dJRN5p6kc8fpo0wikXqcyaZPz15ljzPJVCKZSh/nTl6/eZc7eZbKZNPJxIunJ2/PTl8+f5pJJSGByMvDgqfU5lZzYjYxotroXXaI+q2AMvqg2adqGNUHJql4A9HhsDrolEO2G4u7gVyp4oplWygvnNZu3hvwHYxpCQ5pTHk15DFa7JDKQBpJ47XgLk0S03v1MY1FJhMZNKTSRY3+rnOlpdPaBBit4AOpy5kDZcxIHotSQutWqHdpSguAPZP7bRWvWoP2WiXXKgk5QsXiEVesRCG2CXHNp9QQqGNWGbOyz6GU0CHl9oDHGY2zZgaBajfVkMV3Bh3DJoBtoWzz5YXd3E26qjdUxpyyhyWPpXWPMaaMOaGNKbBnJok6RPteITbacKMNIYUqWDxiAmRuNX6HBXcqevfC6E70VvvYLaP/wyU7NvFzIfQhiy9bABnJl9EE34T4Axg4Ie/e8e6Cd+/2ztiIaK8UYqUQ+85i2eKRUK9vA/TvMGfNVjq70+PA20NsnS0ZXMnk4Ln1h84P4KVGbzXyUDiGNaaos8WxWo0m2D+dH8JxbIDMrEY0u9kE2P/BJohP7YqVbYCuA0wZkbLPyj4j+4w4Yjg7AM4SOHPgLFlzulCpjUocFnL4M2IB2OBK8Z/nPSOg9QmvT4A+AWoARG8m+WvJX0l+PM97k4tMKjLpg6Bq8eNV4QP89X278umm9Rmun8ONC7iRhxv5Yj1/UW0Vamihdl2ooRdX7WvkWxf5giPnB/0Cu4Tx81p/HDwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Software Testing Types screenshot&quot;
        title=&quot;Software Testing Types screenshot&quot;
        src=&quot;/static/79d685382aae1bdc512427ab2d76f63e/f058b/software-testing-types-0.png&quot;
        srcset=&quot;/static/79d685382aae1bdc512427ab2d76f63e/c26ae/software-testing-types-0.png 158w,
/static/79d685382aae1bdc512427ab2d76f63e/6bdcf/software-testing-types-0.png 315w,
/static/79d685382aae1bdc512427ab2d76f63e/f058b/software-testing-types-0.png 630w,
/static/79d685382aae1bdc512427ab2d76f63e/40601/software-testing-types-0.png 945w,
/static/79d685382aae1bdc512427ab2d76f63e/d326d/software-testing-types-0.png 1197w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Some of the most known and used test types;&lt;/p&gt;
&lt;h3 id=&quot;Unit-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Unit-Tests&quot; aria-label=&quot;Unit Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Unit Tests&lt;/h3&gt;
&lt;p&gt;Unit testing is a software testing method by which individual units of source code—sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures—are tested to determine whether they are fit for use.&lt;/p&gt;
&lt;h3 id=&quot;Integration-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Integration-Tests&quot; aria-label=&quot;Integration Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Integration Tests&lt;/h3&gt;
&lt;p&gt;Integration testing is the phase in software testing in which individual software modules are combined and tested as a group. Integration testing is conducted to evaluate the compliance of a system or component with specified functional requirements. It occurs after unit testing and before validation testing&lt;/p&gt;
&lt;h3 id=&quot;Load-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Load-Tests&quot; aria-label=&quot;Load Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Load Tests&lt;/h3&gt;
&lt;p&gt;Load testing generally refers to the practice of modeling the expected usage of a software program by simulating multiple users accessing the program concurrently. As such, this testing is most relevant for multi-user systems; often one built using a client/server model, such as web servers. However, other types of software systems can also be load tested.&lt;/p&gt;
&lt;h3 id=&quot;UIUX-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#UIUX-Tests&quot; aria-label=&quot;UIUX Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;UI/UX Tests&lt;/h3&gt;
&lt;p&gt;UI/UX testing is the process of testing a product&apos;s graphical user interface (&lt;em&gt;GUI&lt;/em&gt;) to ensure it meets its specifications. This is normally done through the use of a variety of test cases.&lt;/p&gt;
&lt;h3 id=&quot;Penetration-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Penetration-Tests&quot; aria-label=&quot;Penetration Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Penetration Tests&lt;/h3&gt;
&lt;p&gt;Penetration Tests (&lt;em&gt;colloquially known as pentest or ethical hacking&lt;/em&gt;), is an authorized simulated cyberattack on a computer system, performed to evaluate the security of the system.&lt;/p&gt;
&lt;h3 id=&quot;AB-Tests&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#AB-Tests&quot; aria-label=&quot;AB Tests permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A/B Tests&lt;/h3&gt;
&lt;p&gt;A/B testing is a way to compare two versions of a single variable, typically by testing a subject&apos;s response to variant A against variant B, and determining which of the two variants is more effective.&lt;/p&gt;
&lt;h2 id=&quot;References&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#References&quot; aria-label=&quot;References permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.optimizely.com/optimization-glossary/testing-in-production/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Testing in Production by Optimizely&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Deployment_environment&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Deployment Environments by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Unit_testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Unit testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Integration_testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Integration testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Graphical_user_interface_testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;GUI testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Load_testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Load testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Penetration_test&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Penetration testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/A/B_testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;A/B testing by Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mabl.com/blog/software-testing-in-staging-phase-of-deployment&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Software Testing in the Staging Phase of Deployment by Mable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Different types of software testing by Atlassian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.softwaretestinghelp.com/types-of-software-testing/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Types Of Software Testing by Software Testing Help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Azure DevOps - State Transition Restriction Rules]]></title><description><![CDATA[What is State Transition Restriction Rule Since the release of Sprint #172 (official documentation: Sprint #172 Updates) on Azure DevOps, it…]]></description><link>https://devopstips.net/2021-02-15-azure-devops-state-transition-restriction-rules/</link><guid isPermaLink="false">https://devopstips.net/2021-02-15-azure-devops-state-transition-restriction-rules/</guid><pubDate>Mon, 15 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;What-is-State-Transition-Restriction-Rule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#What-is-State-Transition-Restriction-Rule&quot; aria-label=&quot;What is State Transition Restriction Rule permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is State Transition Restriction Rule&lt;/h2&gt;
&lt;p&gt;Since the release of &lt;em&gt;Sprint #172&lt;/em&gt; (&lt;em&gt;official documentation: &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/release-notes/2020/sprint-172-update&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Sprint #172 Updates&lt;/a&gt;&lt;/em&gt;) on &lt;a href=&quot;https://dev.azure.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps&lt;/a&gt;, it&apos;s possible to create rules to restrict state transition of &lt;em&gt;Work Items&lt;/em&gt; on &lt;a href=&quot;https://azure.microsoft.com/en-us/services/devops/boards/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps Boards&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With this new feature, it&apos;s possible to restrict work items from being moved from one state to another directly. For example, you can restrict &lt;em&gt;Bugs&lt;/em&gt; transitioning from &lt;em&gt;New&lt;/em&gt; to &lt;em&gt;Resolved&lt;/em&gt; directly, instead, they must go from &lt;em&gt;New&lt;/em&gt; to &lt;em&gt;Active&lt;/em&gt;, then they can go to &lt;em&gt;Resolved&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;Guideline&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#Guideline&quot; aria-label=&quot;Guideline permalink&quot; class=&quot;header-link before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; width=&quot;14&quot; height=&quot;14&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Guideline&lt;/h2&gt;
&lt;p&gt;To create a &lt;em&gt;State Transition Restriction Rule&lt;/em&gt; you need to create a new &lt;em&gt;process&lt;/em&gt; or &lt;em&gt;child process&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this guideline, you&apos;ll find how to create an Agile Child Process and how to add a State Transition Restriction Rule into it&lt;/p&gt;
&lt;p&gt;First, go to &lt;em&gt;Process list&lt;/em&gt; of the &lt;em&gt;Azure DevOps Organization&lt;/em&gt; (&lt;em&gt;&lt;span&gt;https://&lt;/span&gt;dev.azure.com/{ORG_NAME}/_settings/process&lt;/em&gt;) and create a child process, for example, from &lt;em&gt;Agile&lt;/em&gt; template...&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 625px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/eb627e7d1f4f6f1b2255535c85ef9d79/80d71/azure-devops-state-transition-restriction-rules-0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 98.73417721518987%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHUlEQVQ4y42TyW7bMBCG9QJFDz00trgNqYWkKFkiJWqxA/SS+EF66LmHvFEvPRR5xUKiYyu2UxT4wE36xZn5RxGjBBgNIwcGjIZtOFlvb4kEh6beTWO/q8zQe9+1XeucbbrW2Xpnm7reVYf9pJWMt5trMTBqCm0KXWhVaFWaojRFWGslS1NoJavSLHN+FUXEgfmubeq6a13r7Dj049D3vuta17Xu8fHQtm4ah/00Dr0XHCjBF3GaCGubJcaqKsvSmKo0ieAo3mIUx9sNjrfojbXylPMiM4WeAwvRpongwASHRHDB4QwHFhDAgJIIo7gqjbN2HPxhGvfTOA39YT819Y5Rcn57DQBLOHBGI0YJwQgYTQQPpMu4vucup5zHod9Po7M1wYhgRAkOMErOa0rw2faz+fPNtqlDhX3XjoNvnfWzy41t6qH3rWuW8z5LRGikUA5gdPZZyWyuVZbKPCu0UjKXebaMaVhrJbWSa5PDJ6LQkhjFIeY1lOD1dm3SRRyyv0rp3PB3O/xNvDxYF+l/uNycZZlIkjRNszT5tz2XJgkF4wCV7cu621mvZH43/rucrKI4pjgmOL4JGwOJOUEBIDGj73t7nhg98V7JAJCQDyzbsOyB5YhLAKAYYRSvxLcwxtHXL/Xz5x+/9ctr8vOPenn99P3Xxuy/Tf74/GQKTQmOPqonEIQTvXXP4I/MH1l/3NonIrI8FUrJ+aej5C9F0a1lvzoxnwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Create inherited process from Agile screenshot&quot;
        title=&quot;Create inherited process from Agile screenshot&quot;
        src=&quot;/static/eb627e7d1f4f6f1b2255535c85ef9d79/80d71/azure-devops-state-transition-restriction-rules-0.png&quot;
        srcset=&quot;/static/eb627e7d1f4f6f1b2255535c85ef9d79/c26ae/azure-devops-state-transition-restriction-rules-0.png 158w,
/static/eb627e7d1f4f6f1b2255535c85ef9d79/6bdcf/azure-devops-state-transition-restriction-rules-0.png 315w,
/static/eb627e7d1f4f6f1b2255535c85ef9d79/80d71/azure-devops-state-transition-restriction-rules-0.png 625w&quot;
        sizes=&quot;(max-width: 625px) 100vw, 625px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Then, click one of the work item types;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2e7e4f4d0093a95f970b907226ba8d19/f0685/azure-devops-state-transition-restriction-rules-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABL0lEQVQoz31SCW4DIQzkIeHywZXsstD//60CJxu6TSuNLGz5mjGKObS6131rRy05WaOt0UbfrNHOmv+hat1iYPCOEBC8s6ak2I4aA1ujvbMfy/yEesSExMMfedY7G5hKToFJ2i0WCEFciagjhpjKuiSCD0xMmGKIgWPgwDTtgLiSoHqBFMOlmAmZkBDEPkFIc6DEwTuVw733RghnPSIwo/TmaWU+E4k6b8EKpMtkEe+kRwh/qt1y2raH1bczRAjCapIcD7nCh+J78SXnNSSc31QnvLO/z6aQuLdj3fwp2GQr2ggCj4uuBBUS1n1nwjP65kyIL3kJUZpOBlqSR/FX79fJc6z8E3kwjVbCH7wTzRXE8RlzSpe114UX0Bmfk2tvdX/cy487rwWv/7SQJ7nfN5Z0ceyT8IXPAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Work Item Types screenshot&quot;
        title=&quot;Work Item Types screenshot&quot;
        src=&quot;/static/2e7e4f4d0093a95f970b907226ba8d19/f058b/azure-devops-state-transition-restriction-rules-1.png&quot;
        srcset=&quot;/static/2e7e4f4d0093a95f970b907226ba8d19/c26ae/azure-devops-state-transition-restriction-rules-1.png 158w,
/static/2e7e4f4d0093a95f970b907226ba8d19/6bdcf/azure-devops-state-transition-restriction-rules-1.png 315w,
/static/2e7e4f4d0093a95f970b907226ba8d19/f058b/azure-devops-state-transition-restriction-rules-1.png 630w,
/static/2e7e4f4d0093a95f970b907226ba8d19/f0685/azure-devops-state-transition-restriction-rules-1.png 835w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Go to &lt;em&gt;Rules&lt;/em&gt; tab and create a new &lt;em&gt;Rule&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/10564fe7f104e2088af814c0d35b226e/5bb8b/azure-devops-state-transition-restriction-rules-2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.15189873417721%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAACN0lEQVQoz22SSWsUQRTH5xMoYRIn07X2Ult3dfcs3V3dM5NMjxMSQkSCilHxIpJLVCKeFBQPrggK4tGLePEs6CV+AT+C3r2LV0/SMzGZaIo/RVW996u3VNWiUGdpmiZdk6W+Ut1OOzcmz7NebnKT5bmJ47DbaSVJx3Nd5h1RTQd+0u3owM/SxFeyV+Sh1oIzKbiSQkkxXftKcebNah+Oo1BJ0W5FSsmok0gpBfMEZweaes+eCM6UFDWbEgQBwWg6Q9DECFKCbZs6tu3YlGDoOrZNCcFoVp7r1FzHppRU3hMz89yV00PHcebnTs7PnWgs1DFCWZb2cgOBZU88p/oLTzZVCqBZjtcujuS5bOH8tVvbt+9ubl2Fi3XGWNEfKsGmSR0PQ2Cd2dhYGZePXr3e+/7r64/fX7793Ln35NNuc3eryPslaDYOgv8XGYL11ZVL1288fb+3e//Zw7cfH7/7/ODNh5d3zm6f65fjVWvx1DEwwQgjgKAVhaEOgrIcjkelMZkx2Xi03DHLQmkdKAgARpBgdAgTjKRgrTiKtI5DHYVaScGYF0c6jiLOueRuGPhRqCXn7Vbsuc5htwlGgnsmS4rcDJcGS0uDXn+QtuMi7RTddq8oupnp9YpBv2/SahyBKcEYQdehVWZShDrgQsH+BWfjJl7bQek641wIEfgqikNaFQj/bdjkhqqkagbN+mibXHluXX5RzzaptTBBAATW8U81bfhUlBIbWdRqUNCwMah+Ed23zsJ/ALwKlTy1HjSsAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Create new Rule screenshot&quot;
        title=&quot;Create new Rule screenshot&quot;
        src=&quot;/static/10564fe7f104e2088af814c0d35b226e/f058b/azure-devops-state-transition-restriction-rules-2.png&quot;
        srcset=&quot;/static/10564fe7f104e2088af814c0d35b226e/c26ae/azure-devops-state-transition-restriction-rules-2.png 158w,
/static/10564fe7f104e2088af814c0d35b226e/6bdcf/azure-devops-state-transition-restriction-rules-2.png 315w,
/static/10564fe7f104e2088af814c0d35b226e/f058b/azure-devops-state-transition-restriction-rules-2.png 630w,
/static/10564fe7f104e2088af814c0d35b226e/5bb8b/azure-devops-state-transition-restriction-rules-2.png 749w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can create a new &lt;em&gt;Rule&lt;/em&gt;, select &lt;em&gt;&quot;A work item state moved from ...&quot;&lt;/em&gt; from the &quot;&lt;em&gt;Conditions&lt;/em&gt;&quot; section, and, &lt;em&gt;&quot;Restriction the transition to state ...&quot;&lt;/em&gt; from the &lt;em&gt;&quot;Actions&quot;&lt;/em&gt; section, like this;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; border: 1px solid #777; margin-left: 0 !important; margin-right: 0 !important;&quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d06cd1e5b3939037a6b9c3c3ba6449e0/f0551/azure-devops-state-transition-restriction-rules-3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 94.30379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB90lEQVQ4y5VTyW7bQAzVT6RBY2sWkrNrGUm241iSN/TYW8+99D/678VIiZvCdpACTwRB6ZGcpzdZG+Oqa723RfAh+CK4IngEyfIlZ/kr8hTZa1yyKXKWZ1VZdF3btU2sqxjrpq6bprbWKEKjtVakFRmtjCarlSa0JhWt0QohK4Ifh37o+2Hox6Hfj2O/2x32+3EczqfzOPTHw3g6HVfb4Xk3bnbjy3he7/bb/ljVTaYICQFBzoki1ISKUEoBIFAKkEIKxjlnjAkhGJvz9GRlEaqyNJpWbdM2cd2163SGCqeOCJJACpYLziZckoQMpNCKCEEIIQUXnEnB5+Q9riuJ7Ix+2T5vNmsuMV8ukphvuHw0i3yL7Kz3FhG9c8FPcLbwzhkDUiBIkIIQiuAJASYJ5mIiB++K4BI5JT7BuzJ4b+17clWEG2TOcgSYX8zb8s+vzZOSOU7tk1R35LkjmDVt0yCpm70/RmaNjnVFpC4/6RqC88v8N0zkELw1mkh33SrZu67bWMeqLLyTgiefIFjiqxhiVSNIKfjsyESWQiAAIhAhQlKSMBkLkyv/zpmd++86LONcFGXVNtFoNYnHLjfx/fGuK9NktmBfH/jikbM8Xy7+T7Av8dvyx++H4y9nzWbVEcL1hLvkp7B9Ovx8XH/XhMlqkxKfJP8Bdqmf5kZVVrMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;New Work Item Rule screenshot&quot;
        title=&quot;New Work Item Rule screenshot&quot;
        src=&quot;/static/d06cd1e5b3939037a6b9c3c3ba6449e0/f058b/azure-devops-state-transition-restriction-rules-3.png&quot;
        srcset=&quot;/static/d06cd1e5b3939037a6b9c3c3ba6449e0/c26ae/azure-devops-state-transition-restriction-rules-3.png 158w,
/static/d06cd1e5b3939037a6b9c3c3ba6449e0/6bdcf/azure-devops-state-transition-restriction-rules-3.png 315w,
/static/d06cd1e5b3939037a6b9c3c3ba6449e0/f058b/azure-devops-state-transition-restriction-rules-3.png 630w,
/static/d06cd1e5b3939037a6b9c3c3ba6449e0/f0551/azure-devops-state-transition-restriction-rules-3.png 862w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;All of the possible &lt;em&gt;&quot;Conditions&quot;&lt;/em&gt;;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A work item is created ...&lt;/li&gt;
&lt;li&gt;A work item state changes to ...&lt;/li&gt;
&lt;li&gt;A work item state is not changed ...&lt;/li&gt;
&lt;li&gt;A work item state changes from ...&lt;/li&gt;
&lt;li&gt;A work item state is ...&lt;/li&gt;
&lt;li&gt;A work item state is not ...&lt;/li&gt;
&lt;li&gt;A work item state moved from ...&lt;/li&gt;
&lt;li&gt;The value of ... (equals)&lt;/li&gt;
&lt;li&gt;The value of ... (not equals)&lt;/li&gt;
&lt;li&gt;A value is defined for ...&lt;/li&gt;
&lt;li&gt;No value is defined for ...&lt;/li&gt;
&lt;li&gt;A change was made to the value of ...&lt;/li&gt;
&lt;li&gt;No change was made to the value of ...&lt;/li&gt;
&lt;li&gt;Current user is member of group ...&lt;/li&gt;
&lt;li&gt;Current user is not member of group ...&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Azure CLI DevOps Extension]]></title><description><![CDATA[The Azure command-line interface (Azure CLI) is a set of commands used to create and manage Azure resources. The Azure CLI is available…]]></description><link>https://devopstips.net/2021-02-08-azure-cli-devops-extension/</link><guid isPermaLink="false">https://devopstips.net/2021-02-08-azure-cli-devops-extension/</guid><pubDate>Mon, 08 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;The Azure command-line interface (Azure CLI) is a set of commands used to create and manage Azure resources.&lt;/p&gt;
&lt;p&gt;The Azure CLI is available across Azure services and is designed to get you working quickly with Azure, with an emphasis on automation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Official documentation of the &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;With the &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/devops?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps extension&lt;/a&gt;, we can reach most of the Azure DevOps services from the terminal, such as;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/devops/project?view=azure-cli-latest#ext-azure-devops-az-devops-project-create&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Create a Team Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/devops/user?view=azure-cli-latest#ext-azure-devops-az-devops-user-add&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Add user to a Team Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/devops/wiki?view=azure-cli-latest#ext-azure-devops-az-devops-wiki-create&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Create a Wiki Page in a Team Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/repos/import?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Import a Repo to a Team Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/repos/pr?view=azure-cli-latest#ext-azure-devops-az-repos-pr-create&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Create a PR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/pipelines?view=azure-cli-latest#ext-azure-devops-az-pipelines-create&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Create a Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/pipelines?view=azure-cli-latest#ext-azure-devops-az-pipelines-run&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Run a Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Capabilities are almost endless with the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/cli/?view=azure-devops&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps extension&lt;/a&gt; 🎉&lt;/p&gt;
&lt;p&gt;But, you need to install the extension first.&lt;/p&gt;
&lt;p&gt;Fortunately, installing an extension to &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt; is trivial, you just need to add it to the extension list of &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure CLI&lt;/a&gt; and configure it;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/polatengin/762ab742a98e0685493b923093625a94.js?file=install-and-configure.sh&quot;&gt;&lt;/script&gt;
&lt;p&gt;Usage is simple;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ az devops --help

Group
    az devops &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage Azure DevOps organization level operations.
        Related Groups
        az pipelines: Manage Azure Pipelines
        az boards: Manage Azure Boards
        az repos: Manage Azure Repos
        az artifacts: Manage Azure Artifacts.

Subgroups:
    admin            &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage administration operations.
    extension        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage extensions.
    project          &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage team projects.
    security         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage security related operations.
    service-endpoint &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; endpoints/service connections.
    team             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage teams.
    user             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage users.
    wiki             &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Manage wikis.

Commands:
    configure        &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Configure the Azure DevOps CLI or view your configuration.
    feedback         &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Displays information on how to provide feedback to the Azure DevOps CLI team.
    invoke           &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; This &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; will invoke request &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; any DevOps area and resource. Please use
                       only json output as the response of this &lt;span class=&quot;token builtin class-name&quot;&gt;command&lt;/span&gt; is not fixed. Helpful docs -
                       https://docs.microsoft.com/rest/api/azure/devops/.
    login            &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Set the credential &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;PAT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; to use &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; a particular organization.
    &lt;span class=&quot;token builtin class-name&quot;&gt;logout&lt;/span&gt;           &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; Clear the credential &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; all or a particular organization.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you want to take a look at (and hopefully contribute to) &lt;em&gt;Azure CLI DevOps Extension&lt;/em&gt; code, it&apos;s open-sourced on GitHub with ❤ &lt;a href=&quot;https://github.com/Azure/azure-devops-cli-extension&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Azure DevOps Extension for Azure CLI&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[What is DevOps!]]></title><description><![CDATA[Donovan Brown himself described What is DevOps? as the following; DevOps is the union of people, process, and products to enable continuous…]]></description><link>https://devopstips.net/2021-02-01-what-is-devops/</link><guid isPermaLink="false">https://devopstips.net/2021-02-01-what-is-devops/</guid><pubDate>Mon, 01 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://donovanbrown.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Donovan Brown&lt;/a&gt; himself described &lt;em&gt;What is DevOps?&lt;/em&gt; as the following;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DevOps is the union of people, process, and products to enable continuous delivery of value to our end users.&lt;/p&gt;
&lt;p&gt;I am very deliberate in the terms used in this definition. I choose value over software.  DevOps is not just automating a pipeline so we can quickly deliver software. Our goal is to deliver value.  The term end users was also very carefully chosen.  The value we produce must reach our end users.  If the value only reaches the Dev and QA environments but is held up before reaching production where it can be realized by our end users, we are still failing.&lt;/p&gt;
&lt;p&gt;It is very important to realize that DevOps is not a product.  You cannot buy DevOps and install it.  DevOps is not just automation or infrastructure as code.  DevOps is people following a process enabled by products to deliver value to our end users.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can find the official DevOps page of Microsoft in &lt;a href=&quot;https://azure.microsoft.com/en-us/overview/what-is-devops/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;What is DevOps?&lt;/a&gt; page.&lt;/p&gt;</content:encoded></item></channel></rss>