<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luiz Bernardo</title>
    <description>The latest articles on DEV Community by Luiz Bernardo (@bernardo).</description>
    <link>https://dev.to/bernardo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F664876%2F77f5bf99-e24c-4685-853b-4e870e508450.jpeg</url>
      <title>DEV Community: Luiz Bernardo</title>
      <link>https://dev.to/bernardo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bernardo"/>
    <language>en</language>
    <item>
      <title>Comparativo entre os Protocolos de Comunicação PROFINET e PROFIBUS PA</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Tue, 01 Aug 2023 01:24:23 +0000</pubDate>
      <link>https://dev.to/bernardo/comparativo-entre-os-protocolos-de-comunicacao-profinet-e-profibus-pa-4e9j</link>
      <guid>https://dev.to/bernardo/comparativo-entre-os-protocolos-de-comunicacao-profinet-e-profibus-pa-4e9j</guid>
      <description>&lt;p&gt;Os protocolos de comunicação são essenciais para garantir a troca eficiente e segura de dados entre dispositivos em sistemas de automação e controle industrial. Dois dos protocolos mais amplamente utilizados na indústria são o PROFINET e o PROFIBUS PA. Ambos foram desenvolvidos pela PROFIBUS &amp;amp; PROFINET International (PI) e são amplamente adotados em diferentes aplicações industriais. Neste artigo técnico, faremos um comparativo detalhado entre esses dois protocolos, abordando suas principais características, funcionamento, características técnicas, meios físicos de comunicação, vantagens, desvantagens e tipos de aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  PROFINET
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Principais Características:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFINET é um protocolo de comunicação Ethernet industrial em tempo real.&lt;/li&gt;
&lt;li&gt;É uma tecnologia avançada que combina o padrão Ethernet com as vantagens do PROFIBUS.&lt;/li&gt;
&lt;li&gt;Suporta uma ampla variedade de dispositivos, desde controladores lógicos programáveis (PLCs) até sensores e atuadores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Princípio de Funcionamento:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFINET utiliza uma arquitetura baseada em Ethernet para fornecer comunicação em tempo real e não em tempo real.&lt;/li&gt;
&lt;li&gt;Utiliza o conceito de "slots" e "subslots" para endereçar dispositivos, permitindo comunicação direta entre eles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Características Técnicas:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Taxas de comunicação variáveis de 100 Mbps a 1 Gbps, proporcionando alta velocidade de transferência de dados.&lt;/li&gt;
&lt;li&gt;Suporte para comunicação assíncrona (TCP/IP) e síncrona (RT) em uma única infraestrutura.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meio Físico de Comunicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFINET utiliza cabos Ethernet padrão (Cat 5e ou Cat 6) para a comunicação entre dispositivos.&lt;/li&gt;
&lt;li&gt;Possibilita a utilização de redes Ethernet existentes, tornando a instalação mais conveniente e econômica.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Alta velocidade e largura de banda, adequadas para aplicações de controle em tempo real.&lt;/li&gt;
&lt;li&gt;Flexibilidade e escalabilidade, permitindo a fácil adição de dispositivos à rede.&lt;/li&gt;
&lt;li&gt;Suporte a comunicação em tempo real e não em tempo real em uma única rede.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requer maior conhecimento técnico para a instalação e configuração em comparação com protocolos mais simples.&lt;/li&gt;
&lt;li&gt;Custo inicial pode ser maior devido à infraestrutura de rede * Ethernet necessária.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos de Aplicações:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automação de processos industriais em linhas de produção.&lt;/li&gt;
&lt;li&gt;Controle de máquinas e equipamentos em indústrias manufatureiras.&lt;/li&gt;
&lt;li&gt;Sistemas de transporte automatizados em logística.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  PROFIBUS PA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Principais Características:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFIBUS PA é uma variação do protocolo PROFIBUS DP (Decentralized Periphery) projetado especificamente para automação de processos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Princípio de Funcionamento:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFIBUS PA utiliza uma arquitetura de barramento, onde os dispositivos são conectados em série a um único cabo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Características Técnicas:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Taxa de comunicação de 31.25 kbps, adequada para aplicações de automação de processos.&lt;/li&gt;
&lt;li&gt;Suporte para comunicação em tempo real e não em tempo real.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meio Físico de Comunicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PROFIBUS PA utiliza cabos de par trançado (intrinsecamente seguro) ou segmentos de tronco Exd/Exi (à prova de explosão) para a comunicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adequado para ambientes industriais agressivos e classificados como áreas explosivas (Ex).&lt;/li&gt;
&lt;li&gt;Baixo custo de instalação e manutenção devido à simplicidade da topologia em barramento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Velocidade limitada em comparação com protocolos Ethernet, não sendo ideal para aplicações de controle de alta velocidade.&lt;/li&gt;
&lt;li&gt;Escalabilidade limitada em grandes redes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos de Aplicações:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automação de processos em indústrias químicas, petroquímicas e de óleo e gás.&lt;/li&gt;
&lt;li&gt;Controle de processos de produção em indústrias de alimentos e bebidas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Tanto o PROFINET quanto o PROFIBUS PA são protocolos confiáveis e amplamente utilizados na indústria. A escolha entre eles dependerá das necessidades específicas de cada aplicação. O PROFINET é mais adequado para aplicações de alta velocidade e controle em tempo real, enquanto o PROFIBUS PA é mais adequado para ambientes com classificação Ex e aplicações de automação de processos. Em última análise, ambas as tecnologias fornecem soluções eficientes para uma variedade de aplicações industriais, contribuindo para maior eficiência e segurança em processos industriais.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>infrastructure</category>
      <category>automation</category>
      <category>industrialsystems</category>
    </item>
    <item>
      <title>Azure Board com quadro Kanban</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Fri, 02 Jun 2023 12:39:13 +0000</pubDate>
      <link>https://dev.to/bernardo/azure-board-com-quadro-kanban-55j7</link>
      <guid>https://dev.to/bernardo/azure-board-com-quadro-kanban-55j7</guid>
      <description>&lt;p&gt;Coisas do dia a dia que aprendi usando o Azure Board com quadro Kanban&lt;/p&gt;

&lt;p&gt;Os quadros Kanban proporcionam uma representação visual do fluxo de trabalho, mostrando os itens do backlog, histórias de usuário ou bugs em diferentes estágios de conclusão.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_NCSdnGx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4bvsshtwpn5kxmlt7tm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_NCSdnGx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4bvsshtwpn5kxmlt7tm.png" alt="Image description" width="783" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Kanban prioriza duas práticas principais: visualizar o fluxo de trabalho e limitar a quantidade de trabalho em andamento (WIP).&lt;/p&gt;

&lt;p&gt;Para utilizar um quadro Kanban, é necessário se conectar a um projeto e ser adicionado a uma equipe ou projeto. Também é preciso ter as permissões adequadas para adicionar e modificar itens de trabalho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3MKFsF6c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtwj2vmnxrw2y3hdt7s8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3MKFsF6c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtwj2vmnxrw2y3hdt7s8.png" alt="Image description" width="464" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode acessar o seu quadro Kanban pelo portal da web, selecionando a equipe correta no menu de seleção de equipes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jBnZ2Ohk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vaax5w3dpj0wvr1ygib3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jBnZ2Ohk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vaax5w3dpj0wvr1ygib3.png" alt="Image description" width="722" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao utilizar um quadro Kanban, é importante mapear os estágios do fluxo de trabalho da sua equipe e configurar o quadro de acordo. É possível personalizar as colunas para corresponder aos estágios do seu fluxo de trabalho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UVKyW4sL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nz8rzljj3l3ynlc2279w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UVKyW4sL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nz8rzljj3l3ynlc2279w.png" alt="Image description" width="236" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É fundamental estabelecer limites de WIP para cada estágio do fluxo de trabalho, a fim de garantir uma carga de trabalho gerenciável e identificar possíveis gargalos.&lt;br&gt;
É possível adicionar itens de trabalho ao quadro Kanban inserindo um título e pressionando Enter. Os itens de trabalho podem ser atualizados ao movê-los para diferentes estágios ou modificando os campos diretamente no quadro.&lt;/p&gt;

&lt;p&gt;Existem opções de filtragem disponíveis para focar em subconjuntos específicos de trabalho com base em palavras-chave, valores de campo ou tags.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--voU3hjK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b30id9a6zwjpgrlyjgel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--voU3hjK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b30id9a6zwjpgrlyjgel.png" alt="Image description" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monitorar as métricas é uma parte essencial do Kanban. O Diagrama de Fluxo Cumulativo (CFD) fornece insights sobre o progresso do trabalho e pode ajudar a otimizar os processos.&lt;br&gt;
As atualizações em tempo real podem ser ativadas para que o quadro Kanban seja atualizado automaticamente quando ocorrerem alterações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PyNBBjrX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohd4h1fk92oyqx4fu1ri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PyNBBjrX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohd4h1fk92oyqx4fu1ri.png" alt="Image description" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Widgets de análise e o Serviço de Análise podem ser utilizados para uma análise mais aprofundada e visualização das métricas.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>beginners</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Evite Commits Problemáticos e Mantenha seu Projeto Limpo</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Tue, 23 May 2023 12:47:36 +0000</pubDate>
      <link>https://dev.to/bernardo/evite-commits-problematicos-e-mantenha-seu-projeto-limpo-4fhp</link>
      <guid>https://dev.to/bernardo/evite-commits-problematicos-e-mantenha-seu-projeto-limpo-4fhp</guid>
      <description>&lt;p&gt;Um commit é um registro das alterações feitas em um projeto por meio de um sistema de controle de versão, como o Git. É importante evitar fazer commits com código quebrado ou com bugs, pois isso pode ter consequências negativas. Esses commits comprometem a qualidade do código, dificultam a manutenção futura, tornam mais complicado o rastreamento de problemas, afetam a integração contínua e prejudicam a reputação do desenvolvedor. Para manter um código de qualidade, facilitar a colaboração e preservar a confiança da equipe, é fundamental evitar commits problemáticos.&lt;/p&gt;

&lt;p&gt;Uma maneira eficaz de garantir commits limpos é utilizar o SonarLint. O SonarLint é uma ferramenta de análise de código que auxilia os desenvolvedores a identificar e corrigir problemas de qualidade em tempo real. Ele se integra perfeitamente a ambientes de desenvolvimento populares, destacando problemas no código-fonte e fornecendo sugestões de correção. Essa ferramenta é uma versão local do SonarQube, projetada especificamente para atender às necessidades dos desenvolvedores individuais.&lt;/p&gt;

&lt;p&gt;Para saber mais: What is SonarLint?&lt;/p&gt;

&lt;p&gt;Como configurar o SonarLint&lt;/p&gt;

&lt;p&gt;Primeiramente você vai precisar do Sonar, seja SonarQube (Self-managed) ou SonarCloud (As a service).&lt;/p&gt;

&lt;p&gt;A instalação do SonarLint é similar em quase todas IDE:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Instale a extensão pelo marketing place da própria IDE &lt;/li&gt;
&lt;li&gt; Configure a conexão com token. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2vvT8lsf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wr2qd811wi11926p4akz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2vvT8lsf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wr2qd811wi11926p4akz.png" alt="sonarlint" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar um token de usuário no SonarQube ou SonarCloud, siga estes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Faça login no SonarQube ou SonarCloud com uma conta de administrador.&lt;/li&gt;
&lt;li&gt; No painel, clique no ícone do seu avatar no canto superior direito e selecione "My Account" (Minha Conta).&lt;/li&gt;
&lt;li&gt; Na página "My Account", clique na guia "Security" (Segurança) no menu lateral esquerdo.&lt;/li&gt;
&lt;li&gt; Role a página até encontrar a seção "Tokens" e clique em "Generate Tokens" (Gerar Tokens).&lt;/li&gt;
&lt;li&gt; Na página de criação de token, forneça um nome descritivo para o token, que possa identificar seu propósito ou uso.&lt;/li&gt;
&lt;li&gt; Selecione as permissões que deseja conceder ao token. Você pode optar por Global User Token ou User token (com menos permissão).
&lt;/li&gt;
&lt;li&gt; Após selecionar as permissões, clique em "Generate" (Gerar).&lt;/li&gt;
&lt;li&gt; O SonarQube irá gerar o token e exibi-lo na tela. Anote o token em um local seguro, pois ele será mostrado apenas uma vez. Tenha cuidado para não perdê-lo, pois você precisará do token para autenticação em API ou integração com outras ferramentas.&lt;/li&gt;
&lt;li&gt; Após anotar o token, clique em "Done" (Concluído).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ao incorporar o SonarLint em seu fluxo de trabalho, você poderá identificar problemas de qualidade do código enquanto estiver escrevendo, permitindo que os resolva antes de fazer um commit. Isso ajuda a melhorar a qualidade geral do código, facilita a manutenção futura e evita problemas que possam surgir durante o desenvolvimento. Além disso, commits mais limpos e livres de bugs tornam mais fácil o rastreamento de problemas, promovem uma integração contínua suave e contribuem para a reputação positiva do desenvolvedor e da equipe.&lt;/p&gt;

</description>
      <category>development</category>
      <category>codequality</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Como utilizar o Kibana para visualizar e analisar dados no Elastic</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Thu, 11 May 2023 19:56:11 +0000</pubDate>
      <link>https://dev.to/bernardo/como-utilizar-o-kibana-para-visualizar-e-analisar-dados-no-elastic-4ikn</link>
      <guid>https://dev.to/bernardo/como-utilizar-o-kibana-para-visualizar-e-analisar-dados-no-elastic-4ikn</guid>
      <description>&lt;p&gt;Antes de começar a usar o Kibana, você precisa instalar o Elastic Stack. O Elastic Stack é composto pelo Elasticsearch, Logstash e Kibana. Você pode baixá-lo em elastic.co/downloads. Siga as instruções de instalação para o seu sistema operacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciar o Elasticsearch e o Kibana
&lt;/h2&gt;

&lt;p&gt;Após a instalação, inicie o Elasticsearch e o Kibana. Você pode fazer isso usando o terminal ou a interface gráfica do Elastic. Para iniciá-los pelo terminal, use os seguintes comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /caminho/do/elasticsearch
bin/elasticsearch

&lt;span class="nb"&gt;cd&lt;/span&gt; /caminho/do/kibana
bin/kibana
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Indexar seus dados
&lt;/h2&gt;

&lt;p&gt;Antes de poder visualizar seus dados no Kibana, você precisa indexá-los no Elasticsearch. Existem várias maneiras de fazer isso, como por exemplo, usando o Logstash, que é um pipeline de processamento de dados. O Logstash pode ajudar a coletar, transformar e enviar dados para o Elasticsearch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conectar o Kibana ao Elasticsearch
&lt;/h2&gt;

&lt;p&gt;Depois de indexar seus dados, é hora de conectar o Kibana ao Elasticsearch. Abra o Kibana no seu navegador (geralmente em &lt;a href="http://localhost:5601"&gt;http://localhost:5601&lt;/a&gt;) e siga os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na página inicial do Kibana, clique em "Connect to your Elasticsearch index".&lt;/li&gt;
&lt;li&gt;Escolha uma das opções de conexão disponíveis (por exemplo, local ou remota).&lt;/li&gt;
&lt;li&gt;Selecione o índice que você deseja visualizar no Kibana.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Criar um Dashboard
&lt;/h2&gt;

&lt;p&gt;Agora que você conectou o Kibana ao Elasticsearch, é hora de começar a visualizar seus dados. Uma maneira fácil de fazer isso é criando um dashboard, que é uma coleção de painéis que mostram visualizações diferentes dos seus dados. Siga os seguintes passos para criar um dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique em "Dashboard" no menu à esquerda do Kibana.&lt;/li&gt;
&lt;li&gt;Clique em "Create Dashboard".&lt;/li&gt;
&lt;li&gt;Escolha o tipo de visualização que deseja adicionar ao seu painel (por exemplo, gráfico de barras ou tabela).&lt;/li&gt;
&lt;li&gt;Escolha o índice que deseja usar para a visualização.&lt;/li&gt;
&lt;li&gt;Selecione a coluna que você deseja visualizar.&lt;/li&gt;
&lt;li&gt;Selecione a métrica que deseja usar para a visualização.&lt;/li&gt;
&lt;li&gt;Clique em "Create Visualization" para adicionar a visualização ao seu painel.&lt;/li&gt;
&lt;li&gt;Repita os passos 3 a 7 para adicionar outras visualizações ao seu painel.&lt;/li&gt;
&lt;li&gt;Clique em "Save" para salvar seu painel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora você tem um dashboard personalizado para visualizar seus dados no Kibana. Mas isso é apenas o começo. Existem muitos recursos e funcionalidades no Kibana que você pode explorar para melhorar a análise de seus dados. Aqui estão algumas dicas adicionais para ajudá-lo a aproveitar ao máximo o Kibana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use filtros para restringir a visualização de seus dados a um subconjunto específico. Você pode usar filtros para selecionar dados com base em um intervalo de tempo, valores de campo específicos ou outros critérios.&lt;/li&gt;
&lt;li&gt;Experimente com diferentes tipos de visualizações, como gráficos de dispersão, mapas geográficos e gráficos de pizza. Cada tipo de visualização pode ajudá-lo a entender diferentes aspectos de seus dados.&lt;/li&gt;
&lt;li&gt;Personalize suas visualizações usando opções de formatação e estilos. Você pode mudar a cor, tamanho e tipo de letra dos seus gráficos, por exemplo, para torná-los mais atraentes e legíveis.&lt;/li&gt;
&lt;li&gt;Explore os recursos de colaboração do Kibana. Por exemplo, você pode compartilhar seus painéis e visualizações com colegas de trabalho ou criar permissões de acesso personalizadas para diferentes usuários.&lt;/li&gt;
&lt;li&gt;Aprenda a usar consultas KQL (Kibana Query Language) para pesquisar seus dados com mais precisão. Você pode usar consultas KQL para filtrar e agrupar seus dados com base em critérios complexos.&lt;/li&gt;
&lt;li&gt;Considere a possibilidade de usar plug-ins do Kibana para adicionar funcionalidades adicionais ao seu sistema. Existem muitos plug-ins disponíveis no mercado, desde ferramentas de monitoramento até visualizações personalizadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com essas dicas em mente, você estará bem equipado para começar a explorar os recursos do Kibana e aprofundar seus insights sobre seus dados. Boa sorte!&lt;/p&gt;

</description>
      <category>elasticsearch</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Configurando um Cluster Elasticsearch em Contêineres Docker</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Sun, 30 Apr 2023 03:03:08 +0000</pubDate>
      <link>https://dev.to/bernardo/configurando-um-cluster-elasticsearch-em-conteineres-docker-4mgb</link>
      <guid>https://dev.to/bernardo/configurando-um-cluster-elasticsearch-em-conteineres-docker-4mgb</guid>
      <description>&lt;p&gt;O Elasticsearch é uma poderosa ferramenta de análise e busca de dados distribuída que permite que os usuários armazenem, pesquisem e analisem grandes volumes de dados em tempo real. É construído em cima do Apache Lucene, uma biblioteca de busca de texto de código aberto e amplamente utilizada.&lt;/p&gt;

&lt;p&gt;No entanto, configurar um cluster Elasticsearch pode ser uma tarefa complexa e desafiadora, envolvendo vários processos, como a instalação do software, a configuração de rede e o gerenciamento de nós. Além disso, é importante garantir que o cluster esteja disponível, escalável e seguro.&lt;/p&gt;

&lt;p&gt;É aí que entra o Docker, uma plataforma de virtualização de software que permite que os usuários empacotem e executem aplicativos em contêineres leves e portáteis. Com o Docker, os usuários podem criar contêineres que possuem todas as dependências necessárias para executar seus aplicativos, incluindo o Elasticsearch.&lt;/p&gt;

&lt;p&gt;O elastic-docker, um projeto de código aberto desenvolvido por Guilherme Silveira, é uma excelente opção para quem deseja configurar um cluster Elasticsearch facilmente. O projeto fornece um conjunto de scripts e configurações para executar um cluster Elasticsearch em contêineres Docker. Além disso, o elastic-docker é compatível com as versões mais recentes do Elasticsearch e do Docker.&lt;/p&gt;

&lt;p&gt;Com o elastic-docker, é possível configurar um cluster Elasticsearch com várias instâncias em contêineres Docker separados de forma fácil e rápida. O projeto oferece scripts para configurar o número de nós, o tamanho do cluster e outras opções avançadas. Além disso, o elastic-docker pode ser personalizado de acordo com as necessidades específicas do usuário. É possível modificar as configurações padrão do Elasticsearch e utilizar plugins personalizados para adicionar recursos adicionais ao seu cluster.&lt;/p&gt;

&lt;p&gt;Uma das principais vantagens do elastic-docker é que ele simplifica o processo de configuração de um cluster Elasticsearch, eliminando a necessidade de configurar a rede e gerenciar os nós manualmente. Com o elastic-docker, os usuários podem criar um cluster Elasticsearch escalável e disponível em questão de minutos.&lt;/p&gt;

&lt;p&gt;Para começar com o elastic-docker, é necessário instalar o Docker em seu computador e, em seguida, baixar os scripts e configurações do projeto no GitHub e seguir as instruções de configuração fornecidas. Com sua personalização e facilidade de uso, o elastic-docker se torna a solução perfeita para aqueles que desejam configurar seu cluster Elasticsearch sem enfrentar os desafios comuns dessa tarefa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Guilherme-Silveira/elastic-docker#elastic-stack-on-docker"&gt;Projeto elastic-docker no GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elasticsearch</category>
      <category>docker</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Usando Terraform no Azure Pipelines</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Wed, 26 Apr 2023 14:06:00 +0000</pubDate>
      <link>https://dev.to/bernardo/usando-terraform-no-azure-pipelines-34n7</link>
      <guid>https://dev.to/bernardo/usando-terraform-no-azure-pipelines-34n7</guid>
      <description>&lt;p&gt;Já vimos o que é Azure Pipelines e agora vamos construir uma pipeline para executar um código Terraform. &lt;/p&gt;

&lt;p&gt;Para saber mais o que é o Terraform: &lt;a href="https://developer.hashicorp.com/terraform/tutorials/aws-get-started" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/tutorials/aws-get-started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para executar um código terraform precisaremos do programa binário de Terraform e o AWS CLI, vamos ver como configurar cada um deles. &lt;/p&gt;

&lt;p&gt;Primeira configuração e a trigger, nessa configuração informamos qual branch será utilizado para iniciar a pipeline de forma contínua e integrada.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Em seguida, escrevemos as estruturas básicas do Azure Pipelines de stages, jobs e steps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DeployTerraform&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy Terraform&lt;/span&gt;
  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DeployTerraform&lt;/span&gt;
    &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Deploy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;infrastructure&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Terraform'&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos criar nosso primeiro step de instalação do programa binário de Terraform no job que estamos executando. &lt;/p&gt;

&lt;p&gt;Relembrando o job funciona como um container para a execução das etapas da nossa pipeline.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;bash&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;echo "# Downloading Terraform v1.3.7"&lt;/span&gt;
    &lt;span class="s"&gt;wget https://releases.hashicorp.com/terraform/1.3.7/terraform_1.3.7_linux_amd64.zip&lt;/span&gt;
    &lt;span class="s"&gt;echo "# Unzipping files"&lt;/span&gt;
    &lt;span class="s"&gt;unzip terraform_1.3.7_linux_amd64.zip&lt;/span&gt;

    &lt;span class="s"&gt;echo "# Configuring terraform and checking version"&lt;/span&gt;
    &lt;span class="s"&gt;export TERRAFORM_PATH=$(which terraform)&lt;/span&gt;
    &lt;span class="s"&gt;ls -lha&lt;/span&gt;
    &lt;span class="s"&gt;sudo mv terraform $TERRAFORM_PATH&lt;/span&gt;

    &lt;span class="s"&gt;terraform -v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Por último, vamos instalar o AWS Cli utilizando a task AWSShellScript@1 e executar os comandos do Terraform para realizarmos o build e deploy do nosso Terraform.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWSShellScript@1&lt;/span&gt;
      &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Deploy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service'&lt;/span&gt;
      &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;awsCredentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-teste-dev&lt;/span&gt;
          &lt;span class="na"&gt;regionName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(AWS_REGION)&lt;/span&gt;
          &lt;span class="na"&gt;scriptType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inline'&lt;/span&gt;
          &lt;span class="na"&gt;inlineScript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;terraform init&lt;/span&gt;
            &lt;span class="s"&gt;terraform plan&lt;/span&gt;
            &lt;span class="s"&gt;terraform apply -auto-approve&lt;/span&gt;
            &lt;span class="s"&gt;terraform destroy -auto-approve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Beleza, mas a task AWSShellScript@1 exige a utilização de credenciais de acesso aos serviços AWS, para isso, precisamos criar uma IAM user credentials. &lt;/p&gt;

&lt;p&gt;Para criar a IAM user credentials basta seguir o passo a passo da AWS no link &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos configurar a credencial criada no Azure Pipelines, para isso vamos utilizar a configuração Service Connections. &lt;/p&gt;

&lt;p&gt;O Service Connections do Azure Pipelines é um recurso que permite que você conecte seus pipelines a serviços externos, como Azure, GitHub, Bitbucket, Jenkins, Docker Hub, etc.&lt;/p&gt;

&lt;p&gt;Essa conexão é estabelecida por meio de um endpoint seguro, que é uma configuração de conexão que inclui as credenciais necessárias para se comunicar com o serviço externo. O endpoint é criado e gerenciado pelo Azure Pipelines e pode ser usado em seus pipelines para se conectar ao serviço externo.&lt;/p&gt;

&lt;p&gt;Ao criar um Service Connection, você pode configurá-lo com diferentes tipos de autenticação, dependendo do serviço externo que está sendo usado. Por exemplo, ao conectar-se ao Azure, você pode usar a autenticação baseada em certificado, enquanto que para o GitHub, você pode usar autenticação baseada em token.&lt;/p&gt;

&lt;p&gt;Uma vez que o Service Connection é criado e configurado, ele pode ser usado em seus pipelines para conectar seus repositórios, contêineres, máquinas virtuais e outros serviços. Por exemplo, você pode usar um Service Connection para se conectar ao seu repositório GitHub e implementar seu aplicativo em um ambiente de hospedagem do Azure.&lt;/p&gt;

&lt;p&gt;Além disso, o Azure Pipelines também permite que você compartilhe seus Service Connections com outros projetos e equipes na organização, o que simplifica o gerenciamento de credenciais e aumenta a segurança.&lt;/p&gt;

&lt;p&gt;Agora vamos instalar o  AWS Toolkit for Azure DevOps No Azure Devops &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Acesse o link: &lt;a href="https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Clique em "Get it free"&lt;/li&gt;
&lt;li&gt; Selecione a organização que deseja instalar e clique no botão "Install" 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2F9evZAqlFS2X4dDzIu2d_CNigcXwlkHJ91PUbE1c1o7qz-lG-ObRRorWcx4H0wLQXfyCoz2kXhvvJ5nwUurdeCiNW4rcN5Z2BIGWpH4aQ4tvaJRdgsf4_nQGqqrzt-2uypflkBV3zt_Ww4nGNAaA2Yio" alt="Azure Devops AWS"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora podemos utilizar as credenciais criadas no Service Connections através do AWS Toolkit for Azure DevOps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Acesse o projeto no Azure Devops e clique em Project Settings&lt;/li&gt;
&lt;li&gt; Em pipelines, clique em Service Connection&lt;/li&gt;
&lt;li&gt; Clique em New service connection e selecione AWS, clique em Next&lt;/li&gt;
&lt;li&gt; Insira as credenciais criadas em Access Key ID e Secret Access Key&lt;/li&gt;
&lt;li&gt; Inclua o Service connection name, marque o checkbox Grant access permission to all pipelines e clique em Save
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2FV3ksjYr01mDslbZ2L9L5k_dasRhZTIxTDH_wOcy7F_SgmDkpaH-NYFoMvdtFXiiUmQKDDFa1IniEPMdEQj5i-6Bykw5w8HnJew4hymFm7DfIs3n6eF8wAPue2YKuvPELInvaWOq_A5C1HZZ75OJuzTk" alt="credenciais"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O Service connection name é muito importante pois ele será utilizado na task AWSShellScript@1 no input awsCredentials. &lt;/p&gt;

&lt;p&gt;Por último, vamos criar um código Terraform simples. Utilizei o mesmo código utilizado no AWS get started da Hashicorp.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/aws"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 4.16"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;required_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.2.0"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-west-2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"app_server"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-830c94e3"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t2.micro"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ExampleAppServerInstance"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora é só seguir o passo a passo de como executar uma pipeline, post com mais detalhes:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FxjPeQ2ZIj9W7FPHWqpgGHbAf1njmZrZg7jk40uH65VYVENJdKF3hZP3_fc7KhCAAeF8iu_LcvLTXs4gYERoetQP8zl9JpWomtD5px3w8ZIA5iy7otoX4eUOp2p-Qj8wUZ0WuvPbItLanDFwWW4vJicw" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh4.googleusercontent.com%2FxjPeQ2ZIj9W7FPHWqpgGHbAf1njmZrZg7jk40uH65VYVENJdKF3hZP3_fc7KhCAAeF8iu_LcvLTXs4gYERoetQP8zl9JpWomtD5px3w8ZIA5iy7otoX4eUOp2p-Qj8wUZ0WuvPbItLanDFwWW4vJicw" alt="executar uma pipeline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, você tem uma pipeline executando código Terraform.  &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FJqfHg_RLItIjwRZWDMxvqRNPLWVHVkxGGbzZULFp6q4WSk970cO6o9ndANxeAZ92RM_mjtQJxPuR3r2izMusubgEjJPkBRIKckeWaUbFhdAhfJEXzYzkRk60LSxPHfLYpegytCPpV0BBkMcprS0fZOE" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FJqfHg_RLItIjwRZWDMxvqRNPLWVHVkxGGbzZULFp6q4WSk970cO6o9ndANxeAZ92RM_mjtQJxPuR3r2izMusubgEjJPkBRIKckeWaUbFhdAhfJEXzYzkRk60LSxPHfLYpegytCPpV0BBkMcprS0fZOE" alt="terraform com azure pipelines"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>pipeline</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Build no Azure Pipelines</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Tue, 25 Apr 2023 12:34:29 +0000</pubDate>
      <link>https://dev.to/bernardo/build-no-azure-pipelines-33c8</link>
      <guid>https://dev.to/bernardo/build-no-azure-pipelines-33c8</guid>
      <description>&lt;p&gt;Existem basicamente quatro níveis de linguagens de programação:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VXB_JULr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcg28kjly0uz9t5lkiex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VXB_JULr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcg28kjly0uz9t5lkiex.png" alt="Niveis de linguagens" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linguagens declarativas&lt;/strong&gt;: linguagens que descrevem a lógica de um programa, sem especificar os passos para alcançar um resultado específico. Elas se concentram mais no que deve ser feito do que em como deve ser feito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linguagens de alto nível&lt;/strong&gt;: linguagens abstratas e de fácil entendimento para os programadores, que oferecem recursos poderosos para resolver problemas em diferentes áreas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linguagens de montagem&lt;/strong&gt;: linguagem de baixo nível que utiliza códigos mnemônicos para representar as instruções do processador, facilitando a programação em baixo nível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linguagens de máquina&lt;/strong&gt;: linguagem de baixo nível que utiliza códigos binários para interagir diretamente com o hardware do computador.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As linguagens mais altas precisam ser interpretadas e compiladas para uma linguagem mais próxima da linguagem da máquina, a esse processo damos o nome de build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt; é o processo de compilar, vincular e empacotar código fonte em um produto de software executável ou em uma biblioteca. O objetivo do build é transformar o código fonte em um formato que possa ser executado pelo sistema operacional ou plataforma de destino.&lt;/p&gt;

&lt;p&gt;Transformar as fontes em um sistema em execução pode muitas vezes ser um processo complicado envolvendo compilação, mover arquivos, carregar esquemas nas bases de dados, e assim por diante. No entanto, como a maioria das tarefas nesta parte do desenvolvimento de software, isso pode ser automatizado - e, como resultado, deve ser automatizado. &lt;/p&gt;

&lt;p&gt;Para isso temos sistemas como o Maven, um compilador de códigos Java. O Maven constrói um projeto usando seu modelo de objeto de projeto (POM) e um conjunto de plugins. Depois de se familiarizar com um projeto Maven, você saberá como todos os projetos Maven são construídos. Isso economiza tempo ao navegar em muitos projetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Maven possui uma arquitetura em camadas que consiste em quatro componentes principais:
&lt;/h3&gt;

&lt;p&gt;Repositório: é um local onde os artefatos (bibliotecas, plugins, etc.) são armazenados e compartilhados entre projetos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Plugin: é um conjunto de metadados que define um objetivo específico que pode ser executado pelo Maven, como compilar o código fonte ou gerar um relatório.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Core: é o coração do Maven, responsável por orquestrar a execução dos plugins e gerenciar as dependências do projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CLI (Command Line Interface): é a interface de linha de comando que os desenvolvedores usam para interagir com o Maven.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basicamente usamos o CLI do Maven para realizar um build. &lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos pro build
&lt;/h2&gt;

&lt;p&gt;Porém, uma boa forma é um build e fazermos com automação. Bora usar o Azure Pipelines pra isso. &lt;/p&gt;

&lt;p&gt;Crie um hello world simples para demonstração e subi no repositório &lt;a href="https://github.com/brbernardo/hello-world-java-maven"&gt;https://github.com/brbernardo/hello-world-java-maven&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos para o YML, já vimos como construir uma pipeline simples no post &lt;a href="https://dev.to/bernardo/azure-pipelines-3k9"&gt;https://dev.to/bernardo/azure-pipelines-3k9&lt;/a&gt;, mas dessa vez, vamos usar uma task ja pronta. Vamos utilizar a task: Maven@4&lt;/p&gt;

&lt;p&gt;A task: Maven@4 e mantida pela Microsoft e seu repositorio é o &lt;a href="https://github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/MavenV4"&gt;https://github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/MavenV4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Só precisamos incluir o bloco de código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maven@4&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mavenPomFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pom.xml'&lt;/span&gt;
    &lt;span class="na"&gt;mavenOptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-Xmx3072m'&lt;/span&gt;
    &lt;span class="na"&gt;javaHomeOption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;JDKVersion'&lt;/span&gt;
    &lt;span class="na"&gt;jdkVersionOption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1.8'&lt;/span&gt;
    &lt;span class="na"&gt;jdkArchitectureOption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x64'&lt;/span&gt;
    &lt;span class="na"&gt;goals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;package'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E executar a pipeline que seu primeiro build será feito :) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lZY1BdjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0eg6n385xoasaqoztvv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lZY1BdjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0eg6n385xoasaqoztvv7.png" alt="build pipeline" width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>pipeline</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Azure Pipelines</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Wed, 19 Apr 2023 17:44:29 +0000</pubDate>
      <link>https://dev.to/bernardo/azure-pipelines-3k9</link>
      <guid>https://dev.to/bernardo/azure-pipelines-3k9</guid>
      <description>&lt;p&gt;O Azure DevOps é um conjunto de ferramentas de colaboração e gerenciamento de projetos desenvolvido pela Microsoft para suportar a entrega de software de maneira ágil e eficiente. Ele inclui recursos para gerenciamento de código-fonte, planejamento de projetos, rastreamento de problemas, implantação automatizada, testes e integração contínua.&lt;/p&gt;

&lt;p&gt;O Azure DevOps é composto por vários serviços, incluindo o Azure Repos para controle de versão de código-fonte, o Azure Boards para gerenciamento de projetos e planejamento ágil, o Azure Artifacts para gerenciamento de pacotes e artefatos de build, o Azure Test Plans para gerenciamento de testes e o Azure Pipelines para executar as pipelines dos projetost.&lt;/p&gt;

&lt;p&gt;Bora falar de Azure Pipelines =D &lt;/p&gt;

&lt;p&gt;O Azure Pipelines permite a criação de pipelines de integração contínua e entrega contínua (CI/CD), ajudando as equipes de desenvolvimento a automatizar todo o processo de criação e implantação de aplicativos, desde a compilação até a implantação em diferentes ambientes.&lt;/p&gt;

&lt;p&gt;O Azure Pipelines pode interagir com outros serviços do Azure Devops, uma sugestão de interação seria essa: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0pA7MmDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yhlr14fswqjm73drou1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0pA7MmDo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yhlr14fswqjm73drou1n.png" alt="Azure Devops" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; No Azure Board você gerencia o seu projeto e cria a sua task. Você também pode associar o repositório do Azure Repos a sua task. &lt;/li&gt;
&lt;li&gt; O Azure Repos é utilizado como servidor de repositório remoto de código ele pode ser criado com base no Git ou TFVC. Recomendo criar com base em Git.&lt;/li&gt;
&lt;li&gt; O Azure Pipelines executa as pipelines que vamos ver aqui como funciona. &lt;/li&gt;
&lt;li&gt; O Azure Test armazena os planos de execução e os testes executados pela pipeline.&lt;/li&gt;
&lt;li&gt; O Azure Artifacts armazena os artefatos binários gerados pelos builds das aplicações do Azure Pipelines.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Composição de pipelines no Azure
&lt;/h2&gt;

&lt;p&gt;Existem 3 agrupamentos lógicos na construção da pipeline no Azure Pipelines: &lt;strong&gt;pipelines&lt;/strong&gt;, &lt;strong&gt;stages&lt;/strong&gt; e &lt;strong&gt;steps&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sJwgp6zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y7animpmlunhraxdq5xp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sJwgp6zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y7animpmlunhraxdq5xp.png" alt="Composição de pipelines no Azure" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Um &lt;strong&gt;"trigger"&lt;/strong&gt; diz a um &lt;strong&gt;"Pipeline"&lt;/strong&gt; para executar.  &lt;/li&gt;
&lt;li&gt; Um &lt;strong&gt;"pipeline"&lt;/strong&gt; é composto por uma ou mais "stages". &lt;/li&gt;
&lt;li&gt; Um &lt;strong&gt;"pipeline"&lt;/strong&gt; pode ser implantado em um ou mais ambientes.&lt;/li&gt;
&lt;li&gt; Uma &lt;strong&gt;"stages"&lt;/strong&gt; é uma maneira de organizar &lt;strong&gt;"job"&lt;/strong&gt; em um "pipeline" e cada "stages" pode ter um ou mais job.&lt;/li&gt;
&lt;li&gt; Cada &lt;strong&gt;"job"&lt;/strong&gt; é executado por um &lt;strong&gt;"Agent"&lt;/strong&gt;. Um &lt;strong&gt;"job"&lt;/strong&gt; também pode não ter agente.&lt;/li&gt;
&lt;li&gt; Cada &lt;strong&gt;"agent"&lt;/strong&gt; executa um &lt;strong&gt;"Job"&lt;/strong&gt; que contém uma ou mais steps.&lt;/li&gt;
&lt;li&gt; Uma &lt;strong&gt;"step"&lt;/strong&gt; pode ser uma tarefa ou script e é o menor bloco de construção de um &lt;strong&gt;"pipeline"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Uma &lt;strong&gt;"task"&lt;/strong&gt; é um script pré-embalado que realiza uma ação, como invocar uma API REST ou publicar um artefato de construção.&lt;/li&gt;
&lt;li&gt; Um artefato é uma coleção de arquivos ou pacotes publicados por uma execução.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Escrevendo a Pipeline
&lt;/h2&gt;

&lt;p&gt;As pipelines são escritas com um arquivo de configuração YAML, ele seria um JSON melhorado, para saber mais: &lt;a href="https://yaml.org/"&gt;https://yaml.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como vimos anteriormente, vamos precisar de 4 blocos de código: trigger, stages, jobs e steps. Cada um deles tem seus parâmetros e atributos, vejamos como fica em um código simples.&lt;br&gt;
&lt;br&gt;
 &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AzurePipelines&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;World&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipelines'&lt;/span&gt;
  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AzurePipelines&lt;/span&gt;
    &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;World&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipelines'&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "hello to my first pipeline"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Para saber mais sobre os parâmetros e atributos consulte a referencia de schema da Microsoft &lt;a href="https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/"&gt;https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tudo certo você terá sua primeira execução de pipeline. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V5VAbQxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m87k4rz3fovso2nt4s1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V5VAbQxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m87k4rz3fovso2nt4s1y.png" alt="primeira execução de pipeline" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Log de execução
&lt;/h2&gt;

&lt;p&gt;Achei interessante trazer o log de execução para vermos cada comando executado na pipeline a partir do nosso código simples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;##[section]Starting: Hello World for pipelines&lt;/span&gt;
&lt;span class="c"&gt;##[section]Starting: Initialize job&lt;/span&gt;
Agent name: &lt;span class="s1"&gt;'Azure Pipelines 2'&lt;/span&gt;
Agent machine name: &lt;span class="s1"&gt;'fv-az179-88'&lt;/span&gt;
Current agent version: &lt;span class="s1"&gt;'2.220.0'&lt;/span&gt;
&lt;span class="c"&gt;##[group]Operating System&lt;/span&gt;
Ubuntu
22.04.2
LTS
&lt;span class="c"&gt;##[endgroup]&lt;/span&gt;
&lt;span class="c"&gt;##[group]Runner Image&lt;/span&gt;
Image: ubuntu-22.04
Version: 20230402.1
Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20230402.1/images/linux/Ubuntu2204-Readme.md
Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20230402.1
&lt;span class="c"&gt;##[endgroup]&lt;/span&gt;
&lt;span class="c"&gt;##[group]Runner Image Provisioner&lt;/span&gt;
2.0.139.1
&lt;span class="c"&gt;##[endgroup]&lt;/span&gt;
Current image version: &lt;span class="s1"&gt;'20230402.1'&lt;/span&gt;
Agent running as: &lt;span class="s1"&gt;'vsts'&lt;/span&gt;
Prepare build directory.
Set build variables.
Download all required tasks.
Downloading task: CmdLine &lt;span class="o"&gt;(&lt;/span&gt;2.212.0&lt;span class="o"&gt;)&lt;/span&gt;
Checking job knob settings.
   Knob: DockerActionRetries &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true &lt;/span&gt;Source: &lt;span class="si"&gt;$(&lt;/span&gt;VSTSAGENT_DOCKER_ACTION_RETRIES&lt;span class="si"&gt;)&lt;/span&gt; 
   Knob: AgentToolsDirectory &lt;span class="o"&gt;=&lt;/span&gt; /opt/hostedtoolcache Source: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AGENT_TOOLSDIRECTORY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; 
   Knob: AgentPerflog &lt;span class="o"&gt;=&lt;/span&gt; /home/vsts/perflog Source: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VSTS_AGENT_PERFLOG&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; 
   Knob: ContinueAfterCancelProcessTreeKillAttempt &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true &lt;/span&gt;Source: &lt;span class="si"&gt;$(&lt;/span&gt;VSTSAGENT_CONTINUE_AFTER_CANCEL_PROCESSTREEKILL_ATTEMPT&lt;span class="si"&gt;)&lt;/span&gt; 
Finished checking job knob settings.
Start tracking orphan processes.
&lt;span class="c"&gt;##[section]Finishing: Initialize job&lt;/span&gt;
&lt;span class="c"&gt;##[section]Starting: Checkout Dev Wiki@master to s&lt;/span&gt;
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : &lt;span class="o"&gt;[&lt;/span&gt;More Information]&lt;span class="o"&gt;(&lt;/span&gt;https://go.microsoft.com/fwlink/?LinkId&lt;span class="o"&gt;=&lt;/span&gt;798199&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Syncing repository: Dev Wiki &lt;span class="o"&gt;(&lt;/span&gt;Git&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;##[command]git version&lt;/span&gt;
git version 2.40.0
&lt;span class="c"&gt;##[command]git lfs version&lt;/span&gt;
git-lfs/3.3.0 &lt;span class="o"&gt;(&lt;/span&gt;GitHub&lt;span class="p"&gt;;&lt;/span&gt; linux amd64&lt;span class="p"&gt;;&lt;/span&gt; go 1.19.3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;##[command]git init "/home/vsts/work/1/s"&lt;/span&gt;
hint: Using &lt;span class="s1"&gt;'master'&lt;/span&gt; as the name &lt;span class="k"&gt;for &lt;/span&gt;the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use &lt;span class="k"&gt;in &lt;/span&gt;all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:   git config &lt;span class="nt"&gt;--global&lt;/span&gt; init.defaultBranch &amp;lt;name&amp;gt;
hint: 
hint: Names commonly chosen instead of &lt;span class="s1"&gt;'master'&lt;/span&gt; are &lt;span class="s1"&gt;'main'&lt;/span&gt;, &lt;span class="s1"&gt;'trunk'&lt;/span&gt; and
hint: &lt;span class="s1"&gt;'development'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; The just-created branch can be renamed via this &lt;span class="nb"&gt;command&lt;/span&gt;:
hint: 
hint:   git branch &lt;span class="nt"&gt;-m&lt;/span&gt; &amp;lt;name&amp;gt;
Initialized empty Git repository &lt;span class="k"&gt;in&lt;/span&gt; /home/vsts/work/1/s/.git/
&lt;span class="c"&gt;##[command]git remote add origin https://brbernardo.visualstudio.com/Dev%AZP2520Wiki/_git/Dev%AZP2520Wiki&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config gc.auto 0&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config --get-all http.https://brbernardo.visualstudio.com/Dev%AZP2520Wiki/_git/Dev%AZP2520Wiki.extraheader&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config --get-all http.extraheader&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config --get-regexp .*extraheader&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config --get-all http.proxy&lt;/span&gt;
&lt;span class="c"&gt;##[command]git config http.version HTTP/1.1&lt;/span&gt;
&lt;span class="c"&gt;##[command]git --config-env=http.extraheader=env_var_http.extraheader fetch --force --tags --prune --prune-tags --progress --no-recurse-submodules origin --depth=1 +ef8b3e859aedc2469c92a222fdf63fce2497ecc2:refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2&lt;/span&gt;
remote: Azure Repos        
remote: 
remote: Found 45 objects to send. &lt;span class="o"&gt;(&lt;/span&gt;0 ms&lt;span class="o"&gt;)&lt;/span&gt;        
From https://brbernardo.visualstudio.com/Dev%20Wiki/_git/Dev%20Wiki
 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;new ref]         ef8b3e859aedc2469c92a222fdf63fce2497ecc2 -&amp;gt; origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2
&lt;span class="c"&gt;##[command]git --config-env=http.extraheader=env_var_http.extraheader fetch --force --tags --prune --prune-tags --progress --no-recurse-submodules origin --depth=1 +ef8b3e859aedc2469c92a222fdf63fce2497ecc2&lt;/span&gt;
remote: Azure Repos        
remote: 
remote: Found 0 objects to send. &lt;span class="o"&gt;(&lt;/span&gt;0 ms&lt;span class="o"&gt;)&lt;/span&gt;        
From https://brbernardo.visualstudio.com/Dev%20Wiki/_git/Dev%20Wiki
 &lt;span class="k"&gt;*&lt;/span&gt; branch            ef8b3e859aedc2469c92a222fdf63fce2497ecc2 -&amp;gt; FETCH_HEAD
&lt;span class="c"&gt;##[command]git checkout --progress --force refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2&lt;/span&gt;
Note: switching to &lt;span class="s1"&gt;'refs/remotes/origin/ef8b3e859aedc2469c92a222fdf63fce2497ecc2'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

You are &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'detached HEAD'&lt;/span&gt; state. You can look around, make experimental
changes and commit them, and you can discard any commits you make &lt;span class="k"&gt;in &lt;/span&gt;this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
&lt;span class="k"&gt;do &lt;/span&gt;so &lt;span class="o"&gt;(&lt;/span&gt;now or later&lt;span class="o"&gt;)&lt;/span&gt; by using &lt;span class="nt"&gt;-c&lt;/span&gt; with the switch command. Example:

  git switch &lt;span class="nt"&gt;-c&lt;/span&gt; &amp;lt;new-branch-name&amp;gt;

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to &lt;span class="nb"&gt;false

&lt;/span&gt;HEAD is now at ef8b3e8 update
&lt;span class="c"&gt;##[section]Finishing: Checkout Dev Wiki@master to s&lt;/span&gt;
&lt;span class="c"&gt;##[section]Starting: CmdLine&lt;/span&gt;
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Task         : Command line
Description  : Run a &lt;span class="nb"&gt;command &lt;/span&gt;line script using Bash on Linux and macOS and cmd.exe on Windows
Version      : 2.212.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Generating script.
Script contents:
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello to my first pipeline"&lt;/span&gt;
&lt;span class="o"&gt;==========================&lt;/span&gt; Starting Command Output &lt;span class="o"&gt;===========================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;/usr/bin/bash &lt;span class="nt"&gt;--noprofile&lt;/span&gt; &lt;span class="nt"&gt;--norc&lt;/span&gt; /home/vsts/work/_temp/caf7686d-81a0-417e-86b7-0a7f102f78ce.sh
hello to my first pipeline
&lt;span class="c"&gt;##[section]Finishing: CmdLine&lt;/span&gt;
&lt;span class="c"&gt;##[section]Starting: Checkout Dev Wiki@master to s&lt;/span&gt;
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Task         : Get sources
Description  : Get sources from a repository. Supports Git, TfsVC, and SVN repositories.
Version      : 1.0.0
Author       : Microsoft
Help         : &lt;span class="o"&gt;[&lt;/span&gt;More Information]&lt;span class="o"&gt;(&lt;/span&gt;https://go.microsoft.com/fwlink/?LinkId&lt;span class="o"&gt;=&lt;/span&gt;798199&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;==============================================================================&lt;/span&gt;
Cleaning any cached credential from repository: Dev Wiki &lt;span class="o"&gt;(&lt;/span&gt;Git&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;##[section]Finishing: Checkout Dev Wiki@master to s&lt;/span&gt;
&lt;span class="c"&gt;##[section]Starting: Finalize Job&lt;/span&gt;
Cleaning up task key
Start cleaning up orphan processes.
&lt;span class="c"&gt;##[section]Finishing: Finalize Job&lt;/span&gt;
&lt;span class="c"&gt;##[section]Finishing: Hello World for pipelines&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As pipelines no Azure Pipelines utilizam arquivos descritivos baseados em YAML. Isso traz algumas facilidades diminuindo a complexidade. &lt;/p&gt;

&lt;p&gt;Estarei trazendo mais alguns exemplos de YAMLs para o Azure Pipelines. &lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>O que é uma pipeline? </title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Thu, 13 Apr 2023 14:47:16 +0000</pubDate>
      <link>https://dev.to/bernardo/o-que-e-uma-pipeline-62c</link>
      <guid>https://dev.to/bernardo/o-que-e-uma-pipeline-62c</guid>
      <description>&lt;p&gt;Para entender o que é pipeline precisamos dar um passo pra trás e entender o que é um comando.&lt;/p&gt;

&lt;p&gt;A palavra comando tem significados diferentes no Linux: Um programa, um comando simples ou um comando combinado.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Um programa&lt;/strong&gt; é um executável nomeado e executado com uma única palavra, como "ls";&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Um comando simples&lt;/strong&gt; é um argumento de um programa opcionalmente, como "ls -l /bin";&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Um comando combinado&lt;/strong&gt; se trata da saída de um comando simples ser utilizada para entrada de um novo comando simples, como "ls -l /bin | less".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fucDuBqe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i61n6tqqi5w2lyj67bb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fucDuBqe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i61n6tqqi5w2lyj67bb7.png" alt="pipelines" width="508" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizamos o caractere combinador pipe para anotar o limite de um comando simples para que a saída dele seja utilizada no próximo comando.&lt;/p&gt;

&lt;p&gt;Então, pipeline é uma linha de comando onde temos programas sendo utilizados na construção de comandos simples e a saída desse comando simples e utilizado na entrada de um outro comando simples criando os comandos combinados através do caractere pipe. &lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>linux</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Criando AMI usando o Packer e Amazon Linux 2023 (AL2023) com o Azure Pipelines</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Mon, 03 Apr 2023 13:52:21 +0000</pubDate>
      <link>https://dev.to/bernardo/criando-ami-usando-o-packer-e-amazon-linux-2023-al2023-com-o-azure-pipelines-5bh</link>
      <guid>https://dev.to/bernardo/criando-ami-usando-o-packer-e-amazon-linux-2023-al2023-com-o-azure-pipelines-5bh</guid>
      <description>&lt;p&gt;Recentemente a AWS anunciou o novo sistema operacional da AWS baseado em Linux. Tem um comparativo super legal entre Amazon Linux 2 e Amazon Linux 2023 [nesse link](&lt;a href="https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html).%C2%A0" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html). &lt;/a&gt;&lt;br&gt;
Resolvi testar o novo sistema operacional criando a AMI com o Packer. &lt;/p&gt;

&lt;p&gt;Packer HashiCorp é uma ferramenta de automação de criação de imagens de máquinas virtuais que permite criar imagens idênticas para múltiplas plataformas usando arquivos de configuração.&lt;/p&gt;

&lt;p&gt;Para instalar o Packer, siga as etapas abaixo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Acesse o site oficial do Packer: &lt;a href="https://www.packer.io/downloads" rel="noopener noreferrer"&gt;https://www.packer.io/downloads&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Faça o download da versão do Packer compatível com o seu sistema operacional.&lt;/li&gt;
&lt;li&gt; Extraia o arquivo ZIP baixado em uma pasta de sua escolha.&lt;/li&gt;
&lt;li&gt; Adicione a pasta contendo o executável do Packer ao PATH do sistema para que possa ser acessado de qualquer lugar no terminal.&lt;/li&gt;
&lt;li&gt; Para verificar se o Packer foi instalado corretamente, abra o terminal e digite o comando "packer version". Se a instalação foi bem-sucedida, a versão do Packer instalada será exibida.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Obs_1: As etapas exatas podem variar dependendo do sistema operacional em que o Packer está sendo instalado.&lt;/p&gt;

&lt;p&gt;Obs_2: Essa etapa é apenas informativa, vou utilizar o Azure Pipelines no tutorial abaixo.&lt;/p&gt;

&lt;p&gt;Assim como os outros produtos da HashiCorp ele utiliza o HCL2 como linguagem, mas nem sempre foi assim, antes ele utilizava json como linguagem e como ainda estão em fase de migração tem um how to de como fazer a migração para HCL2 [aqui](&lt;a href="https://developer.hashicorp.com/packer/tutorials/configuration-language/hcl2-upgrade" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/packer/tutorials/configuration-language/hcl2-upgrade&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Você pode estar organizando o seu diretório packer com os arquivos abaixo, vamos ver o conteúdo de cada um deles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── packer
│    └── provider.pkr.hcl
│    └── builders.pkr.hcl
│    └── sources.pkr.hcl
│    └── variable.pkr.hcl
│    └── locals.pkr.hcl
├── install
│    └── nginx.sh
├── pipelines
│    └── azure_pipelines.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;provider.pkr.hcl&lt;/strong&gt; Contém informações sobre o tipo de provedor, como o nome da conta, região e outras configurações específicas do provedor. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;#provider.pkr.hcl&lt;/span&gt;
&lt;span class="nx"&gt;packer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_plugins&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;amazon&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.2.2"&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github.com/hashicorp/amazon"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;builders.pkr.hcl&lt;/strong&gt; Contém informações sobre o tipo de máquina virtual que será criada, como sistema operacional, tamanho da memória, armazenamento e outras configurações relacionadas à infraestrutura. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;#builders.pkr.hcl&lt;/span&gt;
&lt;span class="nx"&gt;build&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-packer"&lt;/span&gt;
  &lt;span class="nx"&gt;sources&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"source.amazon-ebs.al-2023"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="k"&gt;provisioner&lt;/span&gt; &lt;span class="s2"&gt;"shell"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;environment_vars&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"FOO=hello world"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;script&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../install/nginx.sh"&lt;/span&gt;
    &lt;span class="nx"&gt;pause_before&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10s"&lt;/span&gt;
    &lt;span class="nx"&gt;timeout&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10s"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;sources.pkr.hcl&lt;/strong&gt; Contém informações sobre o tipo de origem, como um arquivo ISO, uma imagem pré-existente ou uma receita do Chef. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;#sources.pkr.hcl&lt;/span&gt;
&lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"amazon-ebs"&lt;/span&gt; &lt;span class="s2"&gt;"al-2023"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ami_prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;
  &lt;span class="nx"&gt;source_ami_filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;filters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"al2023-ami-2023.*-kernel-6.1-x86_64"&lt;/span&gt;
      &lt;span class="nx"&gt;root-device-type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ebs"&lt;/span&gt;
      &lt;span class="nx"&gt;virtualization-type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hvm"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"amazon"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;ssh_username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ec2-user"&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AMI 2023"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;variable.pkr.hcl&lt;/strong&gt; Contém informações sobre o tipo de variável, como seu nome, tipo e valor padrão, que podem ser substituídos por um valor personalizado durante a execução do processo. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;#variable.pkr.hcl&lt;/span&gt;
&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ami_prefix"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AMI"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;locals.pkr.hcl&lt;/strong&gt; E Um valor local atribui um nome a uma expressão , portanto, você pode usar o nome várias vezes em um módulo em vez de repetir a expressão. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;#locals.pkr.hcl&lt;/span&gt;
&lt;span class="nx"&gt;locals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;regex_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;"[- TZ:]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criei o diretório &lt;strong&gt;install&lt;/strong&gt; apenas para organizar os scripts de instalação do que for interessante, no caso vou estar instalando o Nginx com um arquivo shell &lt;strong&gt;nginx.sh&lt;/strong&gt;. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#nginx.sh&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Atualiza os pacotes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Instala o Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Inicia o serviço do Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx

&lt;span class="c"&gt;# Habilita o serviço do Nginx para iniciar automaticamente na inicialização do sistema&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx

&lt;span class="c"&gt;# Verifica o status do Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tudo certo, vamos agora ao Azure Pipelines. &lt;/p&gt;

&lt;p&gt;Para organizar também criei um diretório chamado pipelines e inclui o arquivo azure_pipelines.yml. Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;#azure_pipelines.yml&lt;/span&gt;
&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;vmImage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ubuntu-20.04&lt;/span&gt;
&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BuildAMI&lt;/span&gt;
  &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build AMI&lt;/span&gt;
  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BuildAMI&lt;/span&gt;
    &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;AMI&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Packer'&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bash@3&lt;/span&gt;
        &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Install&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Packer'&lt;/span&gt;
        &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;targetType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inline'&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
              &lt;span class="s"&gt;echo "# Downloading Packer v1.8.6"&lt;/span&gt;
              &lt;span class="s"&gt;wget https://releases.hashicorp.com/packer/1.7.6/packer_1.7.6_linux_amd64.zip&lt;/span&gt;
              &lt;span class="s"&gt;echo "# Unzipping files"&lt;/span&gt;
              &lt;span class="s"&gt;unzip packer_1.7.6_linux_amd64.zip&lt;/span&gt;

              &lt;span class="s"&gt;echo "# Configuring packer and checking version"&lt;/span&gt;
              &lt;span class="s"&gt;export PACKER_PATH=$(which packer)&lt;/span&gt;
              &lt;span class="s"&gt;ls -lha&lt;/span&gt;
              &lt;span class="s"&gt;sudo mv packer $PACKER_PATH&lt;/span&gt;

              &lt;span class="s"&gt;packer -v&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWSShellScript@1&lt;/span&gt;
        &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Build&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;AMI'&lt;/span&gt;
        &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;awsCredentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-teste-dev&lt;/span&gt;
          &lt;span class="na"&gt;regionName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(AWS_REGION)&lt;/span&gt;
          &lt;span class="na"&gt;scriptType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;inline'&lt;/span&gt;
          &lt;span class="na"&gt;inlineScript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;cd projects/PocPacker/packer&lt;/span&gt;
            &lt;span class="s"&gt;packer init .&lt;/span&gt;
            &lt;span class="s"&gt;packer build .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em outro post eu explico com mais detalhes como executar uma pipeline no Azure Pipelines. Bora executar a pipeline.&lt;/p&gt;

&lt;p&gt;Crie um repositório no Azure Repos&lt;/p&gt;

&lt;p&gt;Para criar um novo repositório no Azure Repos, siga os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Abra o seu projeto no Azure DevOps;&lt;/li&gt;
&lt;li&gt; Selecione a opção Repositórios no menu lateral esquerdo;&lt;/li&gt;
&lt;li&gt; Clique em Novo Repositório no canto superior direito;&lt;/li&gt;
&lt;li&gt; Selecione o tipo de repositório que deseja criar (Git ou Team Foundation Version Control);&lt;/li&gt;
&lt;li&gt; Defina as opções de configuração do repositório, como nome, descrição e visibilidade;&lt;/li&gt;
&lt;li&gt; Clique em Criar para criar o novo repositório.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Após criar o repositório, você poderá cloná-lo localmente para trabalhar em sua máquina, além de adicionar, editar e remover arquivos, criar ramificações e realizar outras operações de gerenciamento de código.&lt;/p&gt;

&lt;p&gt;Tudo certo, é só enviar o código para o Azure Repos&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Faça o download e instale um cliente de controle de versão de sua preferência, como o Git ou o Azure Repos Extension para o Visual Studio;&lt;/li&gt;
&lt;li&gt; Inicialize um repositório Git em seu projeto local, se ainda não tiver feito isso, usando o comando "git init";&lt;/li&gt;
&lt;li&gt; Adicione os arquivos e pastas ao seu repositório local usando o comando "git add";&lt;/li&gt;
&lt;li&gt; Grave suas alterações locais no repositório usando o comando "git commit";&lt;/li&gt;
&lt;li&gt; Conecte seu repositório local ao repositório remoto no Azure Repos usando o comando "git remote add origin ";&lt;/li&gt;
&lt;li&gt; Empurre suas alterações locais para o repositório remoto usando o comando "git push origin "&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por último, vamos criar o pipeline no Azure Pipelines.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Selecione o projeto que deseja configurar o pipeline;&lt;/li&gt;
&lt;li&gt; Clique em "Pipelines" no menu à esquerda e depois em "New Pipeline";&lt;/li&gt;
&lt;li&gt; Escolha o repositório que contém o código do seu projeto (GitHub, Bitbucket, Azure Repos, etc);&lt;/li&gt;
&lt;li&gt; Selecione o template do pipeline que deseja utilizar (como .NET Core, Node.js, Python, etc) ou comece do zero;&lt;/li&gt;
&lt;li&gt; Configure o pipeline, adicionando tarefas, definindo variáveis, configurando gatilhos e definindo opções de agendamento;&lt;/li&gt;
&lt;li&gt; Salve e execute o pipeline.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora é só acompanhar o andamento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8btdk4z63r4sbyestvy7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8btdk4z63r4sbyestvy7.jpg" alt="Jobs in Run"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei uma instância EC2 para ver se está tudo ok a partir da imagem que criamos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgh2s1vhnaakki9asa9b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgh2s1vhnaakki9asa9b.jpeg" alt="ec2 instance"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenha gostado, criei um repositório no github com todo código utilizado &lt;a href="https://github.com/brbernardo/packer" rel="noopener noreferrer"&gt;https://github.com/brbernardo/packer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vlw flw.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>aws</category>
      <category>packer</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Abordagem Innersource nas organizações</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Wed, 29 Mar 2023 14:17:29 +0000</pubDate>
      <link>https://dev.to/bernardo/abordagem-innersource-nas-organizacoes-107b</link>
      <guid>https://dev.to/bernardo/abordagem-innersource-nas-organizacoes-107b</guid>
      <description>&lt;p&gt;Innersource é uma abordagem para o desenvolvimento de software que aplica conceitos de código aberto para projetos internos de uma empresa. Isso significa que as equipes de desenvolvimento compartilham seu código e colaboram uns com os outros, assim como acontece em projetos de código aberto. O objetivo é aproveitar a colaboração e a inovação que ocorrem em projetos de código aberto e aplicá-los a projetos internos.&lt;/p&gt;

&lt;p&gt;Algumas das vantagens do innersource incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melhoria da colaboração entre equipes&lt;/li&gt;
&lt;li&gt;Aumento da reutilização de código&lt;/li&gt;
&lt;li&gt;Melhoria da qualidade do código&lt;/li&gt;
&lt;li&gt;Redução de duplicação de esforços&lt;/li&gt;
&lt;li&gt;Aumento da transparência e da responsabilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O innersource é uma abordagem que pode ser útil para empresas que desejam aproveitar as vantagens da colaboração e do código aberto, mas que precisam manter algum grau de controle sobre seus projetos internos. No entanto, implementar o innersource pode ser desafiante, pois requer mudanças nas culturas e processos da empresa, bem como em sua abordagem para o desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;O GitHub mantem um material bem legal sobre o assunto =D&lt;/p&gt;

&lt;p&gt;&lt;a href="https://resources.github.com/innersource/fundamentals/"&gt;https://resources.github.com/innersource/fundamentals/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alem disso existe a comunidade InnerSource Commons que foca em discuções e volução do tema. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://innersourcecommons.org/"&gt;https://innersourcecommons.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para participar ativamente você pode utilizar o slack da comunidade: &lt;a href="https://innersourcecommons.slack.com/join/shared_invite/zt-1msf8vcqu-fYEHcyI1l4eSPq6rGprMXA#/shared-invite/email"&gt;innersourcecommons.slack.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por ultimo, e mantida uma pesquisa para entender a evolução do tema chamada State of InnerSource, a ultima edição ocorreu em 2021 e pode ser acessada por esse &lt;a href="https://innersourcecommons.org/documents/surveys/State.of.InnerSource.Report.2021.pdf"&gt;link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>opensource</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando repositorio Git</title>
      <dc:creator>Luiz Bernardo</dc:creator>
      <pubDate>Wed, 22 Mar 2023 11:26:21 +0000</pubDate>
      <link>https://dev.to/bernardo/migrando-repositorio-git-2c9o</link>
      <guid>https://dev.to/bernardo/migrando-repositorio-git-2c9o</guid>
      <description>&lt;p&gt;Com as constantes aquisições de empresas no mercado de TI é bem comum ter que migrar o repositório de código que estava em um repositório remoto para outro, às vezes em produtos diferentes. &lt;/p&gt;

&lt;p&gt;Pensando no cenário de migração de repositório remoto de soluções diferentes, do GitHub para o Azure Devops, por exemplo, a migração pode se tornar um pouco mais complexa. Veja, você precisa migrar o histórico do projeto por completo com branchs, tags e notes. &lt;/p&gt;

&lt;p&gt;Primeiro, crie o repositório de destino para nossa migração, vamos utilizar ele no script. &lt;/p&gt;

&lt;p&gt;Para isso criei um pequeno script bash na qual vou explicar aqui linha a linha antes de mostrar por completo, vejamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-eufo&lt;/span&gt; pipefail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando "set -eufo pipefail" é um conjunto de opções que pode ser usado em scripts de shell, como o Bash, para modificar o comportamento padrão do ambiente do shell.&lt;/p&gt;

&lt;p&gt;Uma explicação mais detalhada de cada uma das opções incluídas no comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"set -e": Encerra o script imediatamente caso um comando falhe ou retorne um status diferente de zero. Isso ajuda a evitar que erros passem despercebidos e ajuda a garantir que o script pare em caso de falha.&lt;/li&gt;
&lt;li&gt;"set -u": Faz com que o shell gere um erro caso uma variável não definida seja referenciada. Isso pode ajudar a evitar erros que possam ocorrer quando uma variável é usada sem ter sido previamente inicializada.&lt;/li&gt;
&lt;li&gt;"set -f": Desativa a expansão de nomes de arquivos com caracteres curinga (como * e ?), o que pode ser útil em scripts que lidam com arquivos com nomes não convencionais ou que podem conter espaços ou outros caracteres especiais.&lt;/li&gt;
&lt;li&gt;"set -o pipefail": Faz com que um pipeline (comando composto por vários comandos conectados com o operador |) retorne o status de saída do último comando que falhou, em vez de retornar o status de saída do último comando executado com sucesso. Isso pode ser útil em pipelines complexos, onde é importante detectar falhas em qualquer ponto do pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O comando "set -eufo pipefail" ajuda a garantir que o script seja executado de forma confiável e consistente, evitando erros comuns que podem levar a falhas ou a comportamentos inesperados. Ele é especialmente útil em scripts que executam tarefas críticas ou lidam com dados sensíveis, onde a confiabilidade é essencial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repositorio_git_origem.git
&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repositorio_git_alvo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SOURCE_URL será a URL Git do repositório que queremos copiar&lt;br&gt;
TARGET_URL será a URL Git do repositório alvo que queremos que fique igual ao repositório da SOURCE_URL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./repos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apenas para organização criei um diretório de trabalho local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cloning from &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; into &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
git init &lt;span class="nt"&gt;--bare&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O –bare cria um repositório vazio. Se GIT_DIRo ambiente não estiver definido, ele será definido no diretório de trabalho atual. Ao incializar um repositório como bare não será permitido editar arquivos (git add) e commitar mudanças (git commit), já que o mesmo não possui uma working tree.&lt;/p&gt;

&lt;p&gt;Utilizo o –bare para garantir que não tenha nenhuma mudança no meio do processo de migração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config remote.origin.url &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando é utilizado para definir a URL de um repositório Git remoto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/heads/*:refs/heads/*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando git config --add remote.origin.fetch adicionam uma nova configuração no git para o repositório atual.&lt;/p&gt;

&lt;p&gt;O parâmetro --add diz ao git para adicionar essa configuração em vez de substituir configurações existentes.&lt;/p&gt;

&lt;p&gt;remote.origin.fetch define o nome da configuração que está sendo adicionada. Essa configuração especifica como o Git deve buscar as alterações dos ramos do repositório remoto (chamado de "origin").&lt;/p&gt;

&lt;p&gt;O valor '+refs/heads/:refs/heads/' é uma expressão que especifica que o git deve buscar todas as branches (ramificações) do repositório remoto. O primeiro * representa todas as branches no repositório remoto, e o segundo * representa todas as branches locais no repositório local. O sinal de + antes de refs/heads/* indica que, além de buscar os branches existentes, também deve-se adicionar novos branches que possam ser criados no repositório remoto.&lt;/p&gt;

&lt;p&gt;Essa configuração diz ao git para buscar todas as branches do repositório remoto chamado "origin" e adicioná-las ao repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/tags/*:refs/tags/*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sinal de + antes de refs/tags/* indica que, além de buscar as tags existentes, também deve-se adicionar novas tags que possam ser criadas no repositório remoto.&lt;/p&gt;

&lt;p&gt;Essa configuração diz ao git para buscar todas as tags do repositório remoto chamado "origin" e adicioná-las ao repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/notes/*:refs/notes/*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sinal de + antes de refs/notes/* indica que, além de buscar as notas existentes, também deve-se adicionar novas notas que possam ser criadas no repositório remoto.&lt;/p&gt;

&lt;p&gt;Essa configuração diz ao git para buscar todas as notas do repositório remoto chamado "origin" e adicioná-las ao repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config remote.origin.mirror &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A opção mirror é usada para especificar se o repositório local deve espelhar todos os dados do repositório remoto. Quando essa opção é definida como true, isso indica que todas as alterações feitas no repositório remoto devem ser automaticamente sincronizadas com o repositório local.&lt;/p&gt;

&lt;p&gt;Quando essa opção está ativada, todas as operações de push, fetch e pull serão direcionadas ao repositório remoto origin, e o repositório local será atualizado automaticamente para refletir todas as alterações no repositório remoto, ou seja, define que o repositório remoto origin deve ser espelhado no repositório local e que todas as alterações no repositório remoto devem ser automaticamente sincronizadas com o repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fetch &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando é usado para atualizar todas as referências de um repositório local com as alterações mais recentes do repositório remoto.&lt;/p&gt;

&lt;p&gt;O parâmetro --all indica que o comando deve buscar atualizações para todas as branches (ramificações), tags e notas no repositório remoto.&lt;/p&gt;

&lt;p&gt;Quando executado, o comando git fetch --all irá buscar todas as alterações no repositório remoto, mas não as mesclar automaticamente com a branch atual. Em vez disso, ele atualizará as referências locais para refletir as alterações mais recentes no repositório remoto.&lt;/p&gt;

&lt;p&gt;Isso é útil quando você deseja verificar o estado atual do repositório remoto sem mesclar as alterações com seu repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cloned to &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;; pushing to &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apenas um print para deixar tudo mais visual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--mirror&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar o comando git push --mirror "${TARGET_URL}", o Git irá enviar todas as alterações do repositório local para o repositório remoto especificado, sobrescrevendo quaisquer alterações existentes e excluindo referências que não existem mais no repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cleaning up temporary directory &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais anotações para deixar visível a conclusão da execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remoção do diretorio de trabalho. &lt;/p&gt;

&lt;p&gt;Com isso passamos por todos os comandos do script e seu repositório foi migrado na íntegra =D&lt;/p&gt;

&lt;p&gt;Abaixo o script completo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Done."&lt;/span&gt;

bla bla bla
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-eufo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repositorio_git_origem.git
&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repositorio_git_alvo.git
&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./repos

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cloning from &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; into &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

git init &lt;span class="nt"&gt;--bare&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

git config remote.origin.url &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/heads/*:refs/heads/*'&lt;/span&gt;
git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/tags/*:refs/tags/*'&lt;/span&gt;
git config &lt;span class="nt"&gt;--add&lt;/span&gt; remote.origin.fetch &lt;span class="s1"&gt;'+refs/notes/*:refs/notes/*'&lt;/span&gt;
git config remote.origin.mirror &lt;span class="nb"&gt;true
&lt;/span&gt;git fetch &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cloned to &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;; pushing to &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

git push &lt;span class="nt"&gt;--mirror&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cleaning up temporary directory &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Done."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
