<?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: Jardel</title>
    <description>The latest articles on DEV Community by Jardel (@jardelima).</description>
    <link>https://dev.to/jardelima</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%2F1699088%2F30c21cc6-e064-4dcb-8d07-ede6767cd118.jpeg</url>
      <title>DEV Community: Jardel</title>
      <link>https://dev.to/jardelima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jardelima"/>
    <language>en</language>
    <item>
      <title>Configurando TypeORM com PostgreSQL usando Docker.</title>
      <dc:creator>Jardel</dc:creator>
      <pubDate>Tue, 25 Feb 2025 21:56:29 +0000</pubDate>
      <link>https://dev.to/jardelima/configurando-typeorm-com-postgresql-usando-docker-2m48</link>
      <guid>https://dev.to/jardelima/configurando-typeorm-com-postgresql-usando-docker-2m48</guid>
      <description>&lt;p&gt;Recentemente, perdi algumas horas tentando resolver um erro durante a configuração inicial de um side project que estava desenvolvendo.&lt;/p&gt;

&lt;p&gt;Estou utilizando o Docker para rodar minha aplicação em Node.js e o banco de dados PostgreSQL, e estou utilizando o TypeORM para fazer operações no banco de dados. No entanto, o banco de dados não estava se conectando de nenhuma forma à minha aplicação, apesar de já ter testado várias soluções.&lt;/p&gt;

&lt;p&gt;Na minha primeira tentativa de conexão com o banco de dados, meu código estava assim:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ormconfig.json&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6hrwb8ryryu5jklqczuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6hrwb8ryryu5jklqczuu.png" alt="Código" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataSource&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcusfpzx49gk4qyfiakhu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcusfpzx49gk4qyfiakhu.png" alt="Código" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com essas configurações, todas as minhas tentativas de conexão falharam. Fiz o debug de todas as formas possíveis, mas não conseguia entender o que estava errado. Foi então que pesquisei e encontrei uma solução no repositório do TypeORM que resolveu meu problema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F737qxs97qb3x0dg46lrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F737qxs97qb3x0dg46lrm.png" alt="Comentário no github do TypeORM" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O problema estava no meu código, mais especificamente no host, que estava configurado como "localhost". Nesse caso, o Docker trata "localhost" como o IP da minha máquina local, e não como o IP do container. Por isso, a conexão não estava sendo estabelecida corretamente.&lt;/p&gt;

&lt;p&gt;A solução foi obter o IP do container do Docker com o seguinte comando:&lt;br&gt;
&lt;code&gt;sudo docker inspect nome_do_seu_container | grep "IPAddress"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esse comando irá retornar o IP correto que você deve usar na configuração do seu banco de dados.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ormconfig.json&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;192.168.0.1&lt;/strong&gt; é um IP ficticio, você troca pelo IP do seu container&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F2x7inl4yhuq725u6qgas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F2x7inl4yhuq725u6qgas.png" alt="Código" width="528" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataSource&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;192.168.0.1&lt;/strong&gt; é um IP ficticio, você troca pelo IP do seu container&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fntliebwg6ycyeph4rdcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fntliebwg6ycyeph4rdcj.png" alt="Código" width="570" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, com essa correção, sua aplicação conseguirá se conectar ao banco de dados e você poderá realizar as operações desejadas.&lt;/p&gt;

</description>
      <category>typeorm</category>
      <category>docker</category>
      <category>postgres</category>
      <category>node</category>
    </item>
    <item>
      <title>CI/CD no Bitbucket para SFTP</title>
      <dc:creator>Jardel</dc:creator>
      <pubDate>Mon, 10 Feb 2025 19:41:49 +0000</pubDate>
      <link>https://dev.to/jardelima/cicd-no-bitbucket-para-sftp-h5l</link>
      <guid>https://dev.to/jardelima/cicd-no-bitbucket-para-sftp-h5l</guid>
      <description>&lt;p&gt;A integração contínua (CI) e a entrega contínua (CD) são práticas fundamentais no desenvolvimento de software moderno, visando automação e agilidade nos processos de construção, teste e deploy. No contexto do Bitbucket, a implementação de CI/CD pode ser feita de maneira eficiente para diversos cenários. Neste artigo, vamos explorar como configurar um pipeline de CI/CD no Bitbucket, focando na automação de deploys para servidores via SFTP. Essa abordagem proporciona um fluxo contínuo de integração e entrega, garantindo atualizações rápidas e seguras diretamente no ambiente de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Início das configurações
&lt;/h2&gt;

&lt;p&gt;Primeiramente, você deve ter alguns dados do SFTP para iniciar o pipeline. Precisamos do &lt;strong&gt;host&lt;/strong&gt;, &lt;strong&gt;user&lt;/strong&gt; e &lt;strong&gt;password&lt;/strong&gt;. Esses dados seram utilizados para fazer a conexão do pipeline com o seu servidor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquivos para o pipeline no Bitbucket
&lt;/h3&gt;

&lt;p&gt;Nessa abordagem eu utilizei dois tipos de arquivos, um &lt;strong&gt;.yml&lt;/strong&gt;, que é o arquivo base para o pipeline, e um &lt;strong&gt;Dockerfile&lt;/strong&gt;, que fica todos os comandos que utilizaremos para se comunicar com o SFTP. Então na raiz do seu projeto, você pode criar um &lt;em&gt;bitbucket-pipelines.yml&lt;/em&gt; e um &lt;em&gt;Dockerfile&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dockerfile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primeira etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primeiro, vamos criar nosso arquivo Dockerfile na raiz do projeto e vamos comentando cada linha para entendermos melhor o que cada uma faz.&lt;/p&gt;

&lt;p&gt;No exemplo que vou trazer aqui, inicio o arquivo indicando qual imagem eu quero utilizar para rodar os comandos que vou passar no decorrer do pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fozrthobg419o8bgtsqzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fozrthobg419o8bgtsqzy.png" alt="Imagem do código no arquivo dockerfile" width="543" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node:12-alpine&lt;/strong&gt;: É o nome da imagem base que será utilizada. Vamos detalhar os componentes dessa parte:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node&lt;/strong&gt;: Indica que a imagem base é do tipo Node.js, ou seja, ela contém o ambiente necessário para rodar aplicações feitas com Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12&lt;/strong&gt;: Refere-se à versão do Node.js que será utilizada, neste caso, a versão 12.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;alpine&lt;/strong&gt;: Representa uma versão da imagem que é baseada no Alpine Linux, que é uma distribuição Linux leve e otimizada para containers.  Vamos utilizar o Alpine, por conta que precisamos se conectar a servidores SFTP e ele oferece um ponto de partida eficiente e seguro, com a flexibilidade para instalar as ferramentas necessárias.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Segunda etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos declarar variáveis no ambiente do dockerfile para tornar nosso código mais seguro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr6zticnwdpu0trdddk7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr6zticnwdpu0trdddk7n.png" alt="Imagem do código no arquivo dockerfile" width="543" height="170"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Nesse arquivo eu declarei as variáveis com esses nomes genéricos, mas você pode dar qualquer nome.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terceira etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui vamos adicionar três dependências necessárias na nossa imagem para que seja possível realizarmos todas as configurações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxzepri4iafg8hyh962dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxzepri4iafg8hyh962dw.png" alt="Imagem do código no arquivo dockerfile" width="543" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;&lt;br&gt;
O bash oferece diversas vantagens para nossa imagem, com ele podemos escrever scripts simples e poderosos para automatizar diversas etapas do pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;sshpass&lt;/strong&gt;&lt;br&gt;
Nesse exemplo eu vou estar utilizando o sshpass para conectar com o nosso servidor usando &lt;strong&gt;user&lt;/strong&gt;, &lt;strong&gt;password&lt;/strong&gt; e &lt;strong&gt;host&lt;/strong&gt;. É uma abordagem mais simples do que configurarmos chaves SSH para fazermos isso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;openssh-client&lt;/strong&gt;&lt;br&gt;
E, por último, vamos adicionar o &lt;code&gt;openssh-client&lt;/code&gt; para utilizarmos comandos no nosso servidor SFTP. É a implementação mais amplamente usada de ferramentas de SSH e SFTP, sendo compatível com os padrões de comunicação do protocolo SFTP.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quarta etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora vamos definir o diretório de trabalho dentro do container Docker, ou seja, o diretório onde os comandos subsequentes serão executados e onde o ambiente do container estará "focado" durante a construção e execução do container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkva4fnnvqygmsmvdtdhu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkva4fnnvqygmsmvdtdhu.png" alt="Imagem do código no arquivo dockerfile" width="563" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quinta etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usar o comando para  copiar o package.json e o package-lock.json para o container&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F48dy2kzcxlrnvaftxtp9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F48dy2kzcxlrnvaftxtp9.png" alt="Imagem do código no arquivo dockerfile" width="563" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sexta etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usar o comando para instalar as dependências do projeto usando o seu gerenciador de pacotes de preferência, aqui estou usando o npm.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frcs13mfiuc5ow30jdttx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frcs13mfiuc5ow30jdttx.png" alt="Imagem do código no arquivo dockerfile" width="563" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sétima etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usar o comando para copiar o código-fonte do projeto para dentro do container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flobe3y1wu9pradmhksge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flobe3y1wu9pradmhksge.png" alt="Imagem do código no arquivo dockerfile" width="563" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oitava etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usar o comando para gerar a build do projeto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fb5mb26anvne7a8txsfpr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fb5mb26anvne7a8txsfpr.png" alt="Imagem do código no arquivo dockerfile" width="563" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Última etapa&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por último, vamos adicionar um comando onde nosso pipeline vai procurar o caminho do SFTP que vamos informar (Aqui você deve criar uma pasta com o mesmo nome da variável criada no início do Dockerfile) e, achando esse caminho, vai fazer o deploy dos arquivos no destinatário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fn7jl54k6p1pdburuy6cj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn7jl54k6p1pdburuy6cj.png" alt="Imagem do código no arquivo dockerfile" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalizando assim nosso arquivo Dockerfile.&lt;/p&gt;

&lt;h3&gt;
  
  
  bitbucket-pipelines.yml
&lt;/h3&gt;

&lt;p&gt;Agora vamos configurar nosso pipeline.&lt;/p&gt;

&lt;p&gt;Devemos criar um arquivo &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; na raiz do nosso projeto e adicionarmos o seguinte código:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffqbkwxpxda2214mzrhy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffqbkwxpxda2214mzrhy1.png" alt="Image description" width="726" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Da linha 2 até a linha 12, estou informando que quero fazer um teste em todo &lt;strong&gt;pull request&lt;/strong&gt; que for aberto para garantir o funcionamento correto de todo código. Nesse caso, estou testando apenas com o &lt;code&gt;npm run build:prod&lt;/code&gt; para verificarmos se o projeto roda normalmente sem nenhum erro. Se passar, podemos fazer o merge sem problemas.&lt;/p&gt;

&lt;p&gt;Da linha 13 até a linha 27, estou informando que tudo que for feito na branch &lt;code&gt;master&lt;/code&gt;, quero que rode nosso arquivo Dockerfile que criamos. Sendo assim, todo novo código que for feito na master ou pr merjado na master, vai ser feito o deploy do projeto atualizado no nosso servidor SFTP.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>cicd</category>
      <category>sftp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Validando input file e select com Yup</title>
      <dc:creator>Jardel</dc:creator>
      <pubDate>Fri, 28 Jun 2024 12:19:49 +0000</pubDate>
      <link>https://dev.to/jardelima/validando-input-file-e-select-com-yup-1k03</link>
      <guid>https://dev.to/jardelima/validando-input-file-e-select-com-yup-1k03</guid>
      <description>&lt;p&gt;Fala, galera! Estava implementando aqui um formulário com validação Yup e me deparei com dois campos que nunca tinha trabalhado: &lt;code&gt;select&lt;/code&gt; e &lt;code&gt;input file&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Procurei algumas formas de fazer a melhor validação desses campos e confesso que achei bem escasso essas informações. Então vou deixar registrado aqui caso alguém queira uma fonte de ajuda na hora de implementar esses campos.&lt;/p&gt;

&lt;p&gt;Bom, o formulário que implementei é esse:&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%2Fgithub.com%2Fjardelima%2Ftab-news-images%2Fblob%2Fmain%2Fimages%2Fui-yup.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fjardelima%2Ftab-news-images%2Fblob%2Fmain%2Fimages%2Fui-yup.png%3Fraw%3Dtrue" alt="UI Formulário"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E a solução que implementei foi essa:&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%2Fgithub.com%2Fjardelima%2Ftab-news-images%2Fblob%2Fmain%2Fimages%2Fmodel-yup.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fjardelima%2Ftab-news-images%2Fblob%2Fmain%2Fimages%2Fmodel-yup.png%3Fraw%3Dtrue" alt="Código Yup"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  O que eu usei
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O &lt;a href="https://github.com/jquense/yup?tab=readme-ov-file#mixed" rel="noopener noreferrer"&gt;Yup.mixed()&lt;/a&gt; trata todos os tipos, mas você também consegue tipar para receber algo específico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O &lt;a href="https://github.com/jquense/yup?tab=readme-ov-file#schemaoneofarrayofvalues-arrayany-message-string--function-schema-alias-equals" rel="noopener noreferrer"&gt;Yup.oneOf()&lt;/a&gt; me ajudou a setar corretamente as &lt;code&gt;options&lt;/code&gt; do meu &lt;code&gt;select&lt;/code&gt; e a validar se o campo estava preenchido, se não tivesse preenchido ele retornava uma mensagem de erro personalizada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O &lt;a href="https://github.com/jquense/yup?tab=readme-ov-file#schematestname-string-message-string--function--any-test-function-schema" rel="noopener noreferrer"&gt;Yup.test()&lt;/a&gt; eu adicionei para validar o &lt;code&gt;input file&lt;/code&gt;. Nele eu precisava verificar se o campo estava preenchido e se era um &lt;code&gt;.pdf&lt;/code&gt;, e também tem o retorno de mensagens de erro personalizadas. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa foi uma solução que eu desenvolvi para o que era necessário. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sugestão&lt;/strong&gt;: Se você tem alguma sugestão de melhoria ou qualquer que seja, comenta aí.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ressalva&lt;/strong&gt;: Também deve haver validação no backend para prevenir alteração no tipo do arquivo via proxy.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Palavras-chave&lt;/strong&gt;: yup, input file, select, validate, how to validate input file with yup, how to validate select with yup.&lt;/p&gt;

</description>
      <category>yup</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
