<?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: xJuggl3r</title>
    <description>The latest articles on DEV Community by xJuggl3r (@xjuggl3r).</description>
    <link>https://dev.to/xjuggl3r</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%2F184498%2F2c7290a9-a6a5-4b5b-9b19-50a51d16651b.jpeg</url>
      <title>DEV Community: xJuggl3r</title>
      <link>https://dev.to/xjuggl3r</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xjuggl3r"/>
    <language>en</language>
    <item>
      <title>Integração e Entrega Contínuas (CI/CD) de site estático em servidor Linux usando GitLab</title>
      <dc:creator>xJuggl3r</dc:creator>
      <pubDate>Thu, 03 Jun 2021 20:13:41 +0000</pubDate>
      <link>https://dev.to/xjuggl3r/integracao-e-entrega-continuas-ci-cd-de-site-estatico-em-servidor-linux-usando-gitlab-3kbb</link>
      <guid>https://dev.to/xjuggl3r/integracao-e-entrega-continuas-ci-cd-de-site-estatico-em-servidor-linux-usando-gitlab-3kbb</guid>
      <description>&lt;p&gt;Quando estamos trabalhando em alguma empresa ou projeto, é uma prática comum entrarmos rapidamente no espírito de equipe, que normalmente acontece devido à aplicação de metodologias ágeis, ou, em um estágio mais avançado, com uma cultura devops mais encorpada.&lt;/p&gt;

&lt;p&gt;Mas, naqueles projetos pessoais, muitas vezes a máxima "em casa de ferreiro, espeto de pau", também é uma realidade. As razões podem ser várias, mas geralmente há aquela noção de que os demais projetos e atividades têm prioridade no uso do tempo.&lt;/p&gt;

&lt;p&gt;O resultado, muitas vezes, é desorganização que pode custar perda de tempo, dados e, com isso, dinheiro.&lt;/p&gt;

&lt;p&gt;Então, nessa ideia de "arrumar a casa", vou mostrar como implementei o CI/CD de um de meus projetos, o &lt;a href="https://gunbot.com.br"&gt;Gunbot Brasil&lt;/a&gt;. A pipeline é simples, e o conceito é aplicável para qualquer site estático, hospedado em um servidor Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Porque implementar o CI/CD?
&lt;/h2&gt;

&lt;p&gt;São inúmeras as vantagens em relação ao deploy manual, mas, na minha opinião, as principais São:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usando versionamento de arquivo, mesmo que ocorra algum problema com a última versão, basta voltar ao commit anterior;&lt;/li&gt;
&lt;li&gt;Ganho de tempo através da automação;&lt;/li&gt;
&lt;li&gt;Menos mudanças no código.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como implementar o CI/CD?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Usei o GitLab tanto para hospedagem dos arquivos no repositório, quanto para a implementação da Integração e Entrega Contínuas;&lt;/li&gt;
&lt;li&gt;O website está hospedado no Hostgator, mas poderia ser em qualquer outro host provider;&lt;/li&gt;
&lt;li&gt;Consideramos que o acesso ao servidor é feito via SSH Key, &lt;strong&gt;sem password&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Git está instalado no servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1 - Criar repositório no GitLab e subir os arquivos do site
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Já logado no GitLab, clique em 'New Project' &amp;gt; 'Create Blank Project';&lt;/li&gt;
&lt;li&gt;Informe o nome do projeto, que também criará a slug do repositório;&lt;/li&gt;
&lt;li&gt;Defina a visualização. Como é um projeto privado, o repositório deve ser marcado como 'Private';&lt;/li&gt;
&lt;li&gt;Clique em 'Create Project'.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como o repositório está vazio, a próxima tela mostra as alternativas de comandos disponíveis.&lt;/p&gt;

&lt;p&gt;Utilizaremos os seguintes comandos abaixo, substituindo os campos em '&amp;lt; &amp;gt;' com seus próprios valores:&lt;br&gt;
ex:&lt;br&gt;
&lt;code&gt;git remote add origin git@gitlab.com:&amp;lt;seu-user&amp;gt;/&amp;lt;seu-repositorio&amp;gt;.git&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git remote add origin git@gitlab.com:xJuggl3r/meu-website.git&lt;/code&gt;&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;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"&amp;lt;seu-username&amp;gt;"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"&amp;lt;seu-email&amp;gt;"&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;diretorio-do-seu-site&amp;gt;
git init
git remote add origin git@gitlab.com:&amp;lt;seu-user&amp;gt;/&amp;lt;seu-repositorio&amp;gt;.git
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2 - Gerar Chaves SSH
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Siga os passos desse site: &lt;a href="https://www.hostinger.com.br/tutoriais/como-configurar-chaves-ssh"&gt;https://www.hostinger.com.br/tutoriais/como-configurar-chaves-ssh&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3 - Cadastrar Chave SSH no GitLab
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No GitLab, em seu projeto, vá em 'Settings' &amp;gt; 'CI/CD' &amp;gt; 'Variables'&lt;/li&gt;
&lt;li&gt;Adicione uma nova variável &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;. O valor é sua chave privada ssh (por exemplo, conteúdo de ~/.ssh/id_rsa).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sBZB1hGl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wc8i9zpb3iv0ta8jl1vw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sBZB1hGl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wc8i9zpb3iv0ta8jl1vw.jpg" alt="Inserindo SSH na CI/CD do GitLab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementando o CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Crie um arquivo &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; na raíz do seu projeto, com o seguinte conteúdo (modificando as linhas com comentários ao lado):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;before_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;apt-get update -qq&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;apt-get install -qq git&lt;/span&gt;
  &lt;span class="c1"&gt;# Setup SSH deploy keys&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;which&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ssh-agent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;||&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;apt-get&lt;/span&gt;&lt;span class="nv"&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;-qq&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;openssh-client&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;)'&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;eval $(ssh-agent -s)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ssh-add &amp;lt;(echo "$SSH_PRIVATE_KEY")&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mkdir -p ~/.ssh&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/.dockerenv&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;]]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;echo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-e&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Host&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*\n\tStrictHostKeyChecking&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;no\n\n"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;~/.ssh/config'&lt;/span&gt;

&lt;span class="na"&gt;deploy_staging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;staging&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt; &lt;span class="c1"&gt;#sua-url&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;ssh root@example.com "cd var/www/ &amp;amp;&amp;amp; git checkout master &amp;amp;&amp;amp; git pull origin master &amp;amp;&amp;amp; exit"&lt;/span&gt; &lt;span class="c1"&gt;# modifique o usuário, url e diretório do site&lt;/span&gt;
  &lt;span class="na"&gt;only&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;Caso o deploy seja à partir de outro branch, modificar de acordo. Nesse exemplo, usamos o branch 'master'.&lt;/p&gt;

&lt;p&gt;Se tudo estiver correto, agora basta fazer o &lt;code&gt;push&lt;/code&gt; e a pipeline será ativada, gerando um job e atualizando o site no servidor de origem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nXYa5KSP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvxgwlka52fpgyi3yh8u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nXYa5KSP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvxgwlka52fpgyi3yh8u.jpg" alt="Job Executed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nota: O projeto em seu servidor deve ter sido inicialmente clonado de seu repositório via &lt;code&gt;git remote add …&lt;/code&gt; e sincronizado.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>gitlab</category>
      <category>beginners</category>
    </item>
    <item>
      <title>When or where do you listen to your fav podcasts? 🎧</title>
      <dc:creator>xJuggl3r</dc:creator>
      <pubDate>Mon, 08 Jul 2019 19:07:19 +0000</pubDate>
      <link>https://dev.to/xjuggl3r/when-or-where-do-you-listen-to-your-fav-podcasts-376a</link>
      <guid>https://dev.to/xjuggl3r/when-or-where-do-you-listen-to-your-fav-podcasts-376a</guid>
      <description>&lt;p&gt;I listen to WebDev podcasts when I'm at the gym! 💪&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>#WhereDidYouGetMyData?!</title>
      <dc:creator>xJuggl3r</dc:creator>
      <pubDate>Sat, 06 Jul 2019 19:40:04 +0000</pubDate>
      <link>https://dev.to/xjuggl3r/wheredidyougetmydata-176b</link>
      <guid>https://dev.to/xjuggl3r/wheredidyougetmydata-176b</guid>
      <description>&lt;h2&gt;
  
  
  What do you think of a company that makes a bot and creates an account for people without their consent?
&lt;/h2&gt;

&lt;p&gt;It happened to me!&lt;/p&gt;

&lt;p&gt;When I tweeted them about it, the answer was: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Replying to &lt;a class="mentioned-user" href="https://dev.to/xjuggl3r"&gt;@xjuggl3r&lt;/a&gt;
&lt;br&gt;
A number of accounts was created by a bot earlier today. If you have any trouble resetting the password to log in and delete that account, please reply to the email you received so we can help with that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reading their reply to other users, the company says it was not them, but someone else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Replying to @xysyxy (username changed here by me)&lt;br&gt;
The account was created by someone who likely obtained your email from a list. Please use our password reset form to gain access to the account, then you can delete it as explained here...&lt;/p&gt;

&lt;p&gt;Replying to @bob_joe_page (username changed here by me)&lt;br&gt;
We did not create these accounts. We suspect they might be getting created by a bot and our team is investigating.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;What bugs me is: &lt;/p&gt;

&lt;h3&gt;
  
  
  If not the company, why would someone else subscribe a ton of users to a non related service?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Could be a hacker testing a database against a random service just to validate both emails and service vulnerability?
&lt;/h3&gt;

</description>
      <category>startup</category>
      <category>ethics</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How everything started...</title>
      <dc:creator>xJuggl3r</dc:creator>
      <pubDate>Wed, 03 Jul 2019 22:59:02 +0000</pubDate>
      <link>https://dev.to/xjuggl3r/how-everything-started-35ga</link>
      <guid>https://dev.to/xjuggl3r/how-everything-started-35ga</guid>
      <description>&lt;h1&gt;
  
  
  The year was 1998...
&lt;/h1&gt;

&lt;p&gt;In Brazil, internet had just advanced... we could now use it with 56kbps modems, lol.&lt;/p&gt;

&lt;p&gt;At that time, I was still playing RPG and made an awful page about my 🧛character and his clan... The solution I found was Angelfire's free hosting service. Can't remember where it was 'designed'(!?)... perhaps with Dreamweaver when it was still Macromedia Dreamweaver 2.0 🙃&lt;/p&gt;

&lt;p&gt;Oh, I found it in one of the files!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;
&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"text/html; charset=iso-8859-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"GENERATOR"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft FrontPage Express 2.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Postulado&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LOL!!!&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
  </channel>
</rss>
