<?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: Marc Pires</title>
    <description>The latest articles on DEV Community by Marc Pires (@marcpires).</description>
    <link>https://dev.to/marcpires</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%2F285425%2Fdcf70f0e-6380-4181-a17c-a5d76864a8c2.jpg</url>
      <title>DEV Community: Marc Pires</title>
      <link>https://dev.to/marcpires</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcpires"/>
    <language>en</language>
    <item>
      <title>GitOps e certificações ArgoCD</title>
      <dc:creator>Marc Pires</dc:creator>
      <pubDate>Sun, 09 Oct 2022 11:23:47 +0000</pubDate>
      <link>https://dev.to/marcpires/gitops-e-certificacoes-argocd-2dgd</link>
      <guid>https://dev.to/marcpires/gitops-e-certificacoes-argocd-2dgd</guid>
      <description>&lt;p&gt;Olá, como vai? Voltando com carga total nos artigos e nada melhor que iniciar com uma série sobre GitOps, onde vou abordar vários tópicos interessantes. Apertem o cinto e venham comigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é GitOps ?
&lt;/h2&gt;

&lt;p&gt;O conceito de &lt;em&gt;GitOps&lt;/em&gt; é bastente simples e consiste em utilizar o &lt;em&gt;Git&lt;/em&gt; como a única fonte da verdade relativo estado da nossa infra ou deployments. Apesar de a grande parte dos artigos mostrarem a utilização de GitOps para controlar as cargas de trabalho em um cluster &lt;em&gt;Kunernetes&lt;/em&gt;, ele não é exclusivo do mesmo - apesar do Kubernetes possuir algumas características que tornam a implementação desta abordagem mais fácil.&lt;/p&gt;

&lt;p&gt;Alguns exemplos do que podemos fazer com &lt;em&gt;GitOps&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciar micro vms com Firecracker e Ignite&lt;/li&gt;
&lt;li&gt;Gerenciar nossa infra estrutura nos provedores de cloud, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste momento, creio que alguns já devem ter pensado:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hum, eu já faço GitOps, pois tenho os meus manifestos das minhas aplicações criadas utilizando Helm ou usando Kustomize - no caso do Kubernetes -, esses manifestos passam pelo processo de pull request e review e depois o meu sistema de CI/CD excuta o &lt;em&gt;&lt;code&gt;kubectl apply&lt;/code&gt;&lt;/em&gt; e pronto. GitOps !!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bem, você já está no caminho certo para adotar &lt;em&gt;GitOps&lt;/em&gt;, mas o problema aqui é justamente a última parte do processo. Vamos analisar&lt;/p&gt;

&lt;h2&gt;
  
  
  Push deployments
&lt;/h2&gt;

&lt;p&gt;Na descrição do processo acima, veja que estamos utilizando o que chamo de &lt;strong&gt;push deployment&lt;/strong&gt; ou seja, a sua ferramenta de CI/CD é que está aplicando os manifestos em um determinado cluster. Funciona, mas temos algumas questões aqui:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O sistema de CI precisa ter acesso ao(s) cluster(s) Kubernetes e devemos tratar de forma adequada a forma como essas credenciais são utilizados a fim de evitar problemas de segurança&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um desenvolvedor com acesso ao(s) cluster(s) poderia aplicar uma atualizar, executando o kubectl localmente e neste situação teríamos um &lt;em&gt;configuration drift&lt;/em&gt; - o seu repositório já não reflete o estado atual do cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O cluster é totalmente alheio da origem destes deployments, o que significa por exemplo que caso precise testar uma aplicação em um determinado &lt;em&gt;namespace&lt;/em&gt;, mas o seu sistema de CI/CD só aplicar os manifestos quando os commits estiverem na main por exemplo, o cluster não possui formas de saber que essa aplicação deveria estar presente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v1wy9Dza--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m68ee7lrpa04t7cig58l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v1wy9Dza--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m68ee7lrpa04t7cig58l.png" alt="Push deployments" width="880" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: O item 3 pode ser facilmente remediado tendo um job que executa o a aplicação dos manifestos sempre que uma branch seja criada. Mas isso ainda não é GitOps&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull Deployments
&lt;/h2&gt;

&lt;p&gt;Já quando adotamos &lt;em&gt;GitOps&lt;/em&gt;, essa inteligência está no próprio cluster. Por si só o _Kubernetes _não sabe como realizar esta operação, por isso precisamos ter um _Controller _no cluster que adicione essa capacidade. E é isso que as ferramentas como o ArgoCD - e o Flux - fazem. Agora temos o seguinte cenário:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;O sistema de CI/CD não precisa mais ter acesso aos clusters, ficando responsável agora por apenas criar nossas imagens Docker e enviar para os respectivos &lt;em&gt;registries&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Todos os tokens e demais credenciais para acessar o repositório estão no cluster como &lt;em&gt;Secrets&lt;/em&gt;, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Após a instalação do &lt;em&gt;ArgoCD&lt;/em&gt;, o cluster agora sabe exatamente qual deve ser o estado corrente baseado em seu repositório, conseguinda assim manter a consistência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não há necessidade de realizar &lt;code&gt;kubectl apply&lt;/code&gt; localmente, mas mesmo que realizemos, o cluster agora poderá realizar rollbacks automaticamente, pois o repositório é a &lt;strong&gt;única&lt;/strong&gt; fonte da verdade sobre o estado do cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mcWZmgNL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f89c1r47bh5hmateierh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mcWZmgNL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f89c1r47bh5hmateierh.png" alt="GitOps com ArgoCD" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como vimos acima, GitOps é uma forma bastante poderosa de gerenciarmos as aplicações e o próprio cluster. Nos próximos artigos abordarei com mais ênfase outros tópicos interessantes sobre tema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certifições ArgoCD
&lt;/h2&gt;

&lt;p&gt;A Coderesh lançou dois cursos e certificação de forma gratuita sobre GitOps com Argo, um terceiro curso &lt;em&gt;GitOps at Edge&lt;/em&gt; estará disponível no futuro. Vejamos qual o conteúdo abordado em cada módulo, como são as provas e como se preparar&lt;/p&gt;

&lt;h3&gt;
  
  
  GitOps Fundamentals
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9IIH95EF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api-lw14.learnworlds.com/imagefile/https://lwfiles.mycourse.app/codefresh-public/496953759882a1c17316bb7114216fc5.png%3Fclient_id%3D6109891a814a812d5712402b%26width%3D300%26height%3D0" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9IIH95EF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api-lw14.learnworlds.com/imagefile/https://lwfiles.mycourse.app/codefresh-public/496953759882a1c17316bb7114216fc5.png%3Fclient_id%3D6109891a814a812d5712402b%26width%3D300%26height%3D0" alt="ArgoCD Fundamentals" width="300" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apresenta os fundamentos do GitOps e aborda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é GitOps&lt;/li&gt;
&lt;li&gt;ArgoCD basics: &lt;em&gt;Instalação&lt;/em&gt;, &lt;em&gt;criação de aplicações&lt;/em&gt;, &lt;em&gt;estratégias de sincronização&lt;/em&gt;, &lt;em&gt;gerenciamento de segredos&lt;/em&gt;, &lt;em&gt;deploy com Helm e Kustomize&lt;/em&gt;, &lt;em&gt;progressive delivery&lt;/em&gt;, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitOps at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1NV9vJn---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api-lw14.learnworlds.com/imagefile/https://lwfiles.mycourse.app/codefresh-public/90f89804dd47ebe26c52f7cc99163a38.png%3Fclient_id%3D6109891a814a812d5712402b%26width%3D300%26height%3D0%27" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1NV9vJn---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api-lw14.learnworlds.com/imagefile/https://lwfiles.mycourse.app/codefresh-public/90f89804dd47ebe26c52f7cc99163a38.png%3Fclient_id%3D6109891a814a812d5712402b%26width%3D300%26height%3D0%27" alt="ArgoCD at Scale" width="300" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os temas abordados neste módulo são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de múltiplas aplicações&lt;/li&gt;
&lt;li&gt;Gerenciamento multi cluster&lt;/li&gt;
&lt;li&gt;Generators&lt;/li&gt;
&lt;li&gt;Sync/Phase hooks e Sync Waves&lt;/li&gt;
&lt;li&gt;Sync/Diff strategies &lt;/li&gt;
&lt;li&gt;Sync Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Labs
&lt;/h3&gt;

&lt;p&gt;Os dois cursos apresentam diversos laboratório para a aplicação dos tópicos apresentados. Nesta etapa, sugiro que faça todos os exercícios usando um fork do repositório que a Codefresh disponibiliza, assim quando quiser reproduzir os experimentos em outro cluster, todo o código estará atualizado.&lt;/p&gt;

&lt;p&gt;No curso de fundamentos, são apresentadas dicas de como resolver os exercícios,já no módulo &lt;em&gt;GitOps at Scale&lt;/em&gt;, não são apresentadas dicas para auxiliar o aluno na resolução.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discord
&lt;/h3&gt;

&lt;p&gt;A Codefresh disponibiliza um servidor onde pode-se trocar experiência sobre GitOps e possui canais focados como argoworkflows, etc. Sugiro fortemente que entre no servidor, pois é uma boa oportunidade de trocar experiência com outros praticantes do &lt;em&gt;GitOps&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  As avaliações e dicas
&lt;/h3&gt;

&lt;p&gt;Ao final dos módulos há uma avaliação de múltipla escolha englobando os temas apresentados. Você precisa obter 85% nos testes para passar na avaliação, caso precise refazer o módulo, verifique o &lt;em&gt;Feedback report&lt;/em&gt;, pois através dele, poderá verificar quais questões errou.&lt;/p&gt;

&lt;p&gt;Para encerrar deixo algumas dicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Faça os laboratórios dos módulos em seu cluster local - minikube, k3s, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preste bastante atenção na parte de Sync Phase/hooks e Sync Waves, pois esses temas apresentam possibilidades interesantes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso tenha problemas em alguma parte. consulte a documentação do ArgoCD &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interaja através dos Discord, a troca de experiência com outras pessoas irá enriquecer ainda mais os seus conhecimentos e a comunidade do ArgoCD é bem ativa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como vimos brevemente neste primeiro artigo da série, GitOps é uma forma poderosa de gerenciarmos clusters Kubernetes utilizando o Git como a fonte da verdade.&lt;/p&gt;

&lt;p&gt;Bom, é isso aí pessoal. Depois comentem aqui o que acharam do curso. Até o próximo artigo &lt;/p&gt;

</description>
      <category>gitops</category>
      <category>argocd</category>
      <category>certification</category>
    </item>
    <item>
      <title>Automatic CHANGELOG with git</title>
      <dc:creator>Marc Pires</dc:creator>
      <pubDate>Tue, 06 Mar 2018 12:16:24 +0000</pubDate>
      <link>https://dev.to/marcpires/automatic-changelog-with-git-325c</link>
      <guid>https://dev.to/marcpires/automatic-changelog-with-git-325c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Automatic CHANGELOG with git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a simple tip of how you can generate automatic changelogs for your projects using git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know your hooks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For Git novices that never dared to tap into the .git folder, there resides the &lt;em&gt;hooks&lt;/em&gt; folder. Inside this folder, you'll find a series of scripts can be activated and will run on git actions, let's take a look.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EtNw65Zf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AZjDNxMxwK6K515ack60QYg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EtNw65Zf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AZjDNxMxwK6K515ack60QYg.png" alt=""&gt;&lt;/a&gt;Content of .git/hooks subfolder&lt;/p&gt;

&lt;p&gt;As you see for the image above, there are bunch of &lt;em&gt;hooks&lt;/em&gt; we can activate. Here some:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pre-push&lt;/strong&gt; : This will always run, as its name implies, before a push. You can use this hook for example, to run all your tests before you send code to a remote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pre-commit&lt;/strong&gt; : Runs before a commit&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CHANGELOG hook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Know, let's go straight to the point.&lt;/p&gt;

&lt;p&gt;First create a &lt;em&gt;post&lt;/em&gt;-commit file in the .git/hooks folder. The contents of my post-commit file is as follows.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The script is very simple, I do a git log with 3 parameters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- -no-pager&lt;/strong&gt; : Do not pipe Git output into a pager (less)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;- -no-merges:&lt;/strong&gt; Does not print commits with more than one parent (same as max-parents=1)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;- -format&lt;/strong&gt; : Pretty print the commit content in a specific format, possible values are ‘oneline’, ‘short’, ‘medium’, ‘full’, ‘fuller’, ‘email’, ‘raw’, ‘format:’ and ‘tformat:’&lt;/p&gt;

&lt;p&gt;The log output is then redirected do the &lt;strong&gt;CHANGELOG.md&lt;/strong&gt; file on the project root folder.&lt;/p&gt;

&lt;p&gt;After saving the file, just do a &lt;em&gt;chmod +x .git/hooks/post-commit&lt;/em&gt; and that's it. Now, always after the commit, your CHANGELOG.md will be updated.&lt;/p&gt;

&lt;p&gt;I hope you find it useful and does not forget to comment. 'till next tip.&lt;/p&gt;

</description>
      <category>tips</category>
      <category>changelog</category>
      <category>git</category>
    </item>
  </channel>
</rss>
