<?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: Vinícius Carregosa</title>
    <description>The latest articles on DEV Community by Vinícius Carregosa (@vinicarregosa).</description>
    <link>https://dev.to/vinicarregosa</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4122580%2F34a39595-3989-483e-9b24-5ce2687c8c58.jpg</url>
      <title>DEV Community: Vinícius Carregosa</title>
      <link>https://dev.to/vinicarregosa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinicarregosa"/>
    <language>en</language>
    <item>
      <title>Mock Server na prática: entendendo JSON Server e o db.json</title>
      <dc:creator>Vinícius Carregosa</dc:creator>
      <pubDate>Mon, 21 Sep 2026 19:31:09 +0000</pubDate>
      <link>https://dev.to/vinicarregosa/mock-server-na-pratica-3ln6</link>
      <guid>https://dev.to/vinicarregosa/mock-server-na-pratica-3ln6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Um guia para iniciantes entenderem o que é um Mock Server, como o JSON Server funciona e como utilizar um &lt;code&gt;db.json&lt;/code&gt; para desenvolver e testar aplicações frontend.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Quando estamos desenvolvendo uma aplicação frontend, existe um problema muito comum: &lt;strong&gt;a interface precisa consumir uma API, mas o backend ainda não está pronto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine que você está construindo uma tela de gerenciamento de membros. O frontend já possui componentes, formulários e regras de interface, mas a API responsável por fornecer e salvar os dados ainda está em desenvolvimento.&lt;/p&gt;

&lt;p&gt;Precisamos de uma forma de continuar trabalhando sem esperar o backend ficar pronto.&lt;/p&gt;

&lt;p&gt;É aí que entra o &lt;strong&gt;Mock Server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos entender o conceito desde o início e, principalmente, mostrar como utilizar o &lt;strong&gt;JSON Server&lt;/strong&gt; com um arquivo &lt;code&gt;db.json&lt;/code&gt; para simular uma API REST.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. O problema entre frontend e backend
&lt;/h2&gt;

&lt;p&gt;Em uma aplicação real, o frontend normalmente conversa com uma API para obter e modificar dados.&lt;/p&gt;

&lt;p&gt;Por exemplo, quando uma tela precisa listar membros, ela pode realizar uma requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O backend processaria essa requisição e devolveria algo semelhante a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O problema aparece quando o frontend está pronto para consumir essa API, mas o backend ainda está sendo desenvolvido.&lt;/p&gt;

&lt;p&gt;Nesse cenário, esperar pelo backend pode atrasar o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Uma alternativa é criar uma &lt;strong&gt;API simulada&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. O que é um Mock Server?
&lt;/h2&gt;

&lt;p&gt;Um &lt;strong&gt;Mock Server&lt;/strong&gt; é um servidor utilizado para simular o comportamento de uma API.&lt;/p&gt;

&lt;p&gt;Ele recebe requisições HTTP e devolve respostas utilizando dados ou comportamentos definidos para o ambiente de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Em vez de:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend → API real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;podemos trabalhar temporariamente com:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend → Mock Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para o frontend, a comunicação continua acontecendo por HTTP.&lt;/p&gt;

&lt;p&gt;A diferença é que o servidor utilizado durante o desenvolvimento não representa necessariamente a implementação definitiva do sistema.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mock Server não é o backend real. É uma simulação da API utilizada para permitir desenvolvimento, testes e prototipação.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Uma analogia simples
&lt;/h2&gt;

&lt;p&gt;Imagine que uma equipe esteja construindo um aeroporto.&lt;/p&gt;

&lt;p&gt;A equipe responsável pelos sistemas do terminal precisa testar os painéis de voo, balcões e sistemas de atendimento, mas o aeroporto ainda não está operacional.&lt;/p&gt;

&lt;p&gt;Em vez de esperar toda a infraestrutura ficar pronta, pode-se criar um ambiente simulado com informações semelhantes às reais.&lt;/p&gt;

&lt;p&gt;Os sistemas conseguem testar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chegada de informações;&lt;/li&gt;
&lt;li&gt;consulta de dados;&lt;/li&gt;
&lt;li&gt;atualização;&lt;/li&gt;
&lt;li&gt;comunicação;&lt;/li&gt;
&lt;li&gt;tratamento de respostas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse ambiente não é o aeroporto definitivo, mas permite que uma parte significativa do trabalho continue.&lt;/p&gt;

&lt;p&gt;Um Mock Server funciona de maneira semelhante.&lt;/p&gt;

&lt;p&gt;Ele cria um ambiente controlado para que o frontend consiga trabalhar antes da existência da API definitiva.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Mock Data não é Mock Server
&lt;/h2&gt;

&lt;p&gt;Os conceitos estão relacionados, mas não são iguais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mock Data
&lt;/h3&gt;

&lt;p&gt;São dados fictícios utilizados durante o desenvolvimento.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso é apenas um dado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mock Server
&lt;/h3&gt;

&lt;p&gt;É um servidor capaz de disponibilizar esses dados através de uma API.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET http://localhost:3002/members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora existe uma aplicação capaz de receber uma requisição HTTP e devolver uma resposta.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mock Data&lt;/td&gt;
&lt;td&gt;Representa dados fictícios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock Server&lt;/td&gt;
&lt;td&gt;Disponibiliza esses dados através de uma API simulada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  5. O que é o JSON Server?
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;JSON Server&lt;/strong&gt; é uma ferramenta que permite transformar um arquivo JSON em uma API REST simples.&lt;/p&gt;

&lt;p&gt;A ideia é bastante interessante para quem está começando:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você cria uma estrutura JSON e o JSON Server disponibiliza seus recursos através de endpoints HTTP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ele permite simular operações comuns de uma API, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso possibilita desenvolver e testar um frontend sem precisar construir imediatamente uma API completa.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. O &lt;code&gt;db.json&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;No contexto do &lt;strong&gt;Member Manager&lt;/strong&gt;, utilizamos um arquivo chamado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sua estrutura é semelhante a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bia@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Operator"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;À primeira vista, parece apenas um arquivo JSON comum.&lt;/p&gt;

&lt;p&gt;E realmente é.&lt;/p&gt;

&lt;p&gt;A diferença é que o JSON Server utiliza essa estrutura para disponibilizar uma API.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Entendendo a estrutura do &lt;code&gt;db.json&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;O primeiro nível do arquivo possui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A propriedade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;representa uma coleção de recursos.&lt;/p&gt;

&lt;p&gt;Podemos pensar nela como uma pequena coleção de membros.&lt;/p&gt;

&lt;p&gt;Cada elemento possui suas próprias propriedades:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos entender cada uma delas.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;id&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;id&lt;/code&gt; identifica aquele membro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite acessar um recurso específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O identificador também é utilizado nas operações de atualização e remoção.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;projectId&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;projectId&lt;/code&gt; representa o projeto ao qual o membro está associado.&lt;/p&gt;

&lt;p&gt;No nosso exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ana e Carlos pertencem ao projeto &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Bia pertence ao projeto &lt;code&gt;2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite simular uma relação entre projetos e membros.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members?projectId=1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pode ser utilizado para consultar os membros relacionados ao projeto &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Essa estrutura foi utilizada no Mock Server do Member Manager para permitir que o frontend consultasse membros por projeto.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;email&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Representa o email do membro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É uma informação pertencente à entidade &lt;code&gt;Member&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;role&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Representa a função do membro dentro do projeto.&lt;/p&gt;

&lt;p&gt;No nosso exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin
Operator
Viewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;podem representar diferentes papéis dentro da aplicação.&lt;/p&gt;

&lt;p&gt;É importante perceber que o Mock Server está apenas fornecendo esses dados.&lt;/p&gt;

&lt;p&gt;Ele não está necessariamente implementando toda a lógica de autorização de uma aplicação real.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Como o JSON Server transforma o arquivo em uma API?
&lt;/h1&gt;

&lt;p&gt;Essa é uma das partes mais importantes para entender.&lt;/p&gt;

&lt;p&gt;Temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contendo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"members"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o JSON Server é iniciado, ele utiliza essa coleção para disponibilizar recursos HTTP.&lt;/p&gt;

&lt;p&gt;No exemplo utilizado no projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; json-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;json-server &lt;span class="nt"&gt;--watch&lt;/span&gt; db.json &lt;span class="nt"&gt;--port&lt;/span&gt; 3002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O recurso &lt;code&gt;members&lt;/code&gt; passa a estar disponível em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3002/members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o frontend pode tratar essa URL como uma API.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. O endpoint &lt;code&gt;/members&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Depois de iniciar o servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET http://localhost:3002/members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;podemos receber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bia@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Operator"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que não criamos manualmente uma rota chamada &lt;code&gt;/members&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O JSON Server identificou a coleção:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e disponibilizou o recurso.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Filtrando por &lt;code&gt;projectId&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Agora podemos utilizar o &lt;code&gt;projectId&lt;/code&gt; para consultar somente os membros de determinado projeto.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members?projectId=1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A resposta será semelhante a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ana@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para o projeto &lt;code&gt;2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members?projectId=2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;podemos obter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bia@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Operator"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso torna o Mock Server mais interessante para desenvolvimento porque conseguimos testar situações próximas das que existirão na aplicação real.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. GET: lendo dados
&lt;/h1&gt;

&lt;p&gt;O método &lt;code&gt;GET&lt;/code&gt; é utilizado para consultar informações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Listar todos os membros
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Buscar um membro específico
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Buscar membros de um projeto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members?projectId=1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Angular pode utilizar essas respostas para construir a interface.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. POST: criando um membro
&lt;/h1&gt;

&lt;p&gt;O &lt;code&gt;POST&lt;/code&gt; normalmente é utilizado para criar um novo recurso.&lt;/p&gt;

&lt;p&gt;Podemos enviar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"joao@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O JSON Server adicionará o novo membro à coleção.&lt;/p&gt;

&lt;p&gt;Isso permite testar o fluxo de cadastro antes de existir um backend definitivo.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. PUT: atualizando um membro
&lt;/h1&gt;

&lt;p&gt;Imagine que Carlos atualmente seja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Queremos alterar sua função para &lt;code&gt;Admin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Podemos fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;PUT /members/2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;enviando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"carlos@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Admin"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O recurso correspondente será atualizado.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. DELETE: removendo um membro
&lt;/h1&gt;

&lt;p&gt;Para remover Carlos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /members/2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O registro com &lt;code&gt;id = 2&lt;/code&gt; será removido da coleção.&lt;/p&gt;

&lt;p&gt;Com isso, conseguimos simular um CRUD completo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operação&lt;/th&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Criar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/members&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Listar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/members&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buscar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/members/:id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atualizar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/members/:id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remover&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/members/:id&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  15. Onde entra o Angular?
&lt;/h1&gt;

&lt;p&gt;Agora podemos conectar o Mock Server ao frontend.&lt;/p&gt;

&lt;p&gt;Uma boa prática é evitar que cada componente faça suas próprias requisições HTTP.&lt;/p&gt;

&lt;p&gt;Em vez disso, podemos utilizar um service.&lt;/p&gt;

&lt;p&gt;A comunicação pode ser entendida assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Component
    |
    | chama
    v
MemberService
    |
    | HTTP
    v
JSON Server
    |
    | lê/escreve
    v
db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O componente cuida principalmente da interface.&lt;/p&gt;

&lt;p&gt;O service concentra o acesso aos dados.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. O &lt;code&gt;MemberService&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Um exemplo simplificado seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MemberService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3002/members&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nf"&gt;getByProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;projectId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Member&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?projectId=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectId&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;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Member&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Member&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;member&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Member&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Member&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&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="nx"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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="nx"&gt;member&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&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="nx"&gt;id&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mais importante não é decorar esse código.&lt;/p&gt;

&lt;p&gt;É entender a responsabilidade do service.&lt;/p&gt;

&lt;p&gt;O componente não precisa saber como a URL foi construída.&lt;/p&gt;

&lt;p&gt;Ele pode simplesmente solicitar ao service:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Busque os membros deste projeto."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O service transforma essa solicitação em uma requisição HTTP.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Por que separar o componente do service?
&lt;/h1&gt;

&lt;p&gt;Imagine que hoje nossa API seja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3002/members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais tarde, o backend real pode disponibilizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.exemplo.com/members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se os componentes construírem as URLs diretamente, teremos que procurar e alterar diversos pontos da aplicação.&lt;/p&gt;

&lt;p&gt;Quando o acesso fica concentrado no service, a mudança fica muito mais controlada.&lt;/p&gt;

&lt;p&gt;Essa separação também ajuda a manter responsabilidades claras:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Responsabilidade&lt;/th&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interface&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interação do usuário&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requisições HTTP&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL da API&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversão de dados&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regras de apresentação&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  18. Mock Server não é backend
&lt;/h1&gt;

&lt;p&gt;Esse é um dos pontos mais importantes.&lt;/p&gt;

&lt;p&gt;JSON Server é muito útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;desenvolvimento frontend;&lt;/li&gt;
&lt;li&gt;prototipação;&lt;/li&gt;
&lt;li&gt;testes;&lt;/li&gt;
&lt;li&gt;demonstrações;&lt;/li&gt;
&lt;li&gt;desenvolvimento paralelo;&lt;/li&gt;
&lt;li&gt;criação de interfaces antes do backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas ele não deve ser confundido com uma API de produção.&lt;/p&gt;

&lt;p&gt;Um backend real pode possuir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autenticação;&lt;/li&gt;
&lt;li&gt;autorização;&lt;/li&gt;
&lt;li&gt;regras de negócio;&lt;/li&gt;
&lt;li&gt;validações;&lt;/li&gt;
&lt;li&gt;banco de dados;&lt;/li&gt;
&lt;li&gt;tratamento de erros;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;segurança;&lt;/li&gt;
&lt;li&gt;transações;&lt;/li&gt;
&lt;li&gt;controle de concorrência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Mock Server normalmente fornece apenas uma representação simplificada da API necessária para o desenvolvimento.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mock Server permite que o desenvolvimento avance. Ele não substitui automaticamente a arquitetura definitiva do backend.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  19. Testando o Mock Server diretamente
&lt;/h1&gt;

&lt;p&gt;Uma das melhores formas de entender uma API é testá-la sem passar pelo frontend.&lt;/p&gt;

&lt;p&gt;Depois de iniciar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;json-server &lt;span class="nt"&gt;--watch&lt;/span&gt; db.json &lt;span class="nt"&gt;--port&lt;/span&gt; 3002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;podemos utilizar ferramentas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman;&lt;/li&gt;
&lt;li&gt;Bruno;&lt;/li&gt;
&lt;li&gt;Insomnia;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;navegador, para requisições &lt;code&gt;GET&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3002/members
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para testar o filtro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"http://localhost:3002/members?projectId=1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para consultar um membro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3002/members/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso também ajuda no diagnóstico.&lt;/p&gt;

&lt;p&gt;Se o endpoint não responde diretamente pelo Postman ou &lt;code&gt;curl&lt;/code&gt;, provavelmente o problema está no Mock Server ou na configuração da API simulada, e não no Angular.&lt;/p&gt;




&lt;h1&gt;
  
  
  20. Um ponto importante sobre versões
&lt;/h1&gt;

&lt;p&gt;É importante prestar atenção à versão do JSON Server utilizada.&lt;/p&gt;

&lt;p&gt;A versão atual disponível no npm possui diferenças em relação a versões antigas, inclusive em alguns comportamentos relacionados a &lt;code&gt;id&lt;/code&gt; e consultas.&lt;/p&gt;

&lt;p&gt;Por isso, em projetos de equipe, é uma boa prática &lt;strong&gt;registrar a versão da ferramenta utilizada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em vez de cada desenvolvedor instalar uma versão diferente globalmente, podemos declarar a dependência no projeto.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; json-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, a dependência passa a fazer parte do projeto e pode ser instalada junto com as demais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso reduz o risco de:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Na minha máquina funciona."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  21. Como pensar sobre Mock Server
&lt;/h1&gt;

&lt;p&gt;Evite pensar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tenho um JSON falso."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É melhor pensar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tenho uma API simulada que permite desenvolver e testar o consumidor antes de possuir o backend definitivo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa diferença de perspectiva é importante.&lt;/p&gt;

&lt;p&gt;O arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;é a fonte dos dados.&lt;/p&gt;

&lt;p&gt;O JSON Server fornece o comportamento de servidor HTTP.&lt;/p&gt;

&lt;p&gt;O Angular consome essa API.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;MemberService&lt;/code&gt; encapsula essa comunicação.&lt;/p&gt;




&lt;h1&gt;
  
  
  22. O fluxo completo
&lt;/h1&gt;

&lt;p&gt;Podemos representar o funcionamento completo de forma simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuário
   |
   v
Angular Component
   |
   v
MemberService
   |
   v
HTTP Request
   |
   v
JSON Server
   |
   v
db.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando uma alteração acontece, o caminho inverso ocorre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.json
   |
   v
JSON Server
   |
   v
HTTP Response
   |
   v
MemberService
   |
   v
Angular Component
   |
   v
Interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ponto importante é que cada camada possui uma responsabilidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  23. Exercício prático
&lt;/h1&gt;

&lt;p&gt;Uma boa forma de fixar o conteúdo é modificar o próprio &lt;code&gt;db.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lucas@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Viewer"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois consulte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members?projectId=2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe quais membros aparecem.&lt;/p&gt;

&lt;p&gt;Depois tente realizar as quatro operações:&lt;/p&gt;

&lt;h3&gt;
  
  
  Criar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Consultar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /members
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Atualizar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;PUT /members/4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remover
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /members/4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois tente explicar o que acontece em cada etapa.&lt;/p&gt;

&lt;p&gt;Se você consegue explicar o caminho entre &lt;strong&gt;Angular → Service → HTTP → Mock Server → dados&lt;/strong&gt;, o conceito já está sendo compreendido, e não apenas decorado.&lt;/p&gt;




&lt;h1&gt;
  
  
  24. Erros comuns de iniciantes
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Pensar que o &lt;code&gt;db.json&lt;/code&gt; é a API
&lt;/h2&gt;

&lt;p&gt;Não é.&lt;/p&gt;

&lt;p&gt;O JSON é apenas a fonte de dados utilizada pelo Mock Server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Colocar toda a lógica HTTP no componente
&lt;/h2&gt;

&lt;p&gt;Isso mistura responsabilidades.&lt;/p&gt;

&lt;p&gt;É preferível centralizar o acesso aos dados em um service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tratar Mock Server como backend definitivo
&lt;/h2&gt;

&lt;p&gt;O Mock Server existe para simular.&lt;/p&gt;

&lt;p&gt;Ele não necessariamente representa todas as regras e comportamentos do backend de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não testar a API isoladamente
&lt;/h2&gt;

&lt;p&gt;Quando existe um problema no frontend, testar primeiro o endpoint diretamente pode economizar bastante tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não controlar a versão da ferramenta
&lt;/h2&gt;

&lt;p&gt;Projetos de equipe devem buscar um ambiente reproduzível.&lt;/p&gt;

&lt;p&gt;Se cada desenvolvedor utilizar uma versão diferente do JSON Server, o comportamento pode variar.&lt;/p&gt;




&lt;h1&gt;
  
  
  25. O que aprendemos?
&lt;/h1&gt;

&lt;p&gt;Ao final deste processo, temos vários conceitos importantes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mock Data&lt;/strong&gt; são dados simulados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mock Server&lt;/strong&gt; é um servidor utilizado para simular uma API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON Server&lt;/strong&gt; transforma uma estrutura JSON em uma API REST simples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;db.json&lt;/code&gt;&lt;/strong&gt; contém os dados utilizados pelo Mock Server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; é o mecanismo utilizado para comunicação entre cliente e servidor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;MemberService&lt;/code&gt;&lt;/strong&gt; encapsula o acesso à API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Angular&lt;/strong&gt; utiliza &lt;code&gt;HttpClient&lt;/code&gt; para consumir os endpoints.&lt;/p&gt;

&lt;p&gt;A ideia pode ser resumida assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dados simulados
      |
      v
JSON Server
      |
      v
API HTTP
      |
      v
MemberService
      |
      v
Angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa estrutura é simples o suficiente para começar, mas já apresenta conceitos fundamentais que serão encontrados em APIs reais.&lt;/p&gt;




&lt;h1&gt;
  
  
  26. O que acontece quando o backend real chegar?
&lt;/h1&gt;

&lt;p&gt;Essa é uma das perguntas mais importantes.&lt;/p&gt;

&lt;p&gt;No início do desenvolvimento podemos ter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3002/members&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, quando o backend real estiver disponível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.exemplo.com/members&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Idealmente, o componente não precisa saber que essa mudança aconteceu.&lt;/p&gt;

&lt;p&gt;Ele continua utilizando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;memberService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByProject&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O service continua responsável pela comunicação.&lt;/p&gt;

&lt;p&gt;O que muda é o sistema que responde à requisição.&lt;/p&gt;

&lt;p&gt;Essa é uma das vantagens de manter uma separação clara entre a interface e o acesso aos dados.&lt;/p&gt;




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

&lt;p&gt;Um Mock Server resolve um problema bastante comum:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Como continuar desenvolvendo o frontend enquanto o backend ainda não está pronto?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No nosso exemplo, o &lt;code&gt;db.json&lt;/code&gt; contém os dados simulados dos membros.&lt;/p&gt;

&lt;p&gt;O JSON Server transforma essa estrutura em uma API HTTP.&lt;/p&gt;

&lt;p&gt;O Angular consome essa API através do &lt;code&gt;MemberService&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Assim conseguimos implementar e testar operações de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;criação;&lt;/li&gt;
&lt;li&gt;consulta;&lt;/li&gt;
&lt;li&gt;atualização;&lt;/li&gt;
&lt;li&gt;remoção;&lt;/li&gt;
&lt;li&gt;filtragem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O mais importante é não pensar no Mock Server simplesmente como "um JSON falso".&lt;/p&gt;

&lt;p&gt;Pense nele como uma &lt;strong&gt;API simulada criada para fornecer um contrato previsível ao frontend durante o desenvolvimento&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando o backend real estiver disponível, a simulação pode ser substituída pela implementação definitiva.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mock Server não tenta substituir o backend. Ele permite que o restante da aplicação avance enquanto o backend ainda está sendo construído.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/json-server" rel="noopener noreferrer"&gt;JSON Server — npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/typicode/json-server" rel="noopener noreferrer"&gt;JSON Server — GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angular.dev/guide/http" rel="noopener noreferrer"&gt;Angular — HTTP Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods" rel="noopener noreferrer"&gt;MDN — HTTP Request Methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP" rel="noopener noreferrer"&gt;MDN — HTTP Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CI/CD para iniciantes: entendendo pipelines com GitLab, testes e Docker</title>
      <dc:creator>Vinícius Carregosa</dc:creator>
      <pubDate>Mon, 21 Sep 2026 19:24:03 +0000</pubDate>
      <link>https://dev.to/vinicarregosa/cicd-para-iniciantes-entendendo-pipelines-com-gitlab-testes-e-docker-3h56</link>
      <guid>https://dev.to/vinicarregosa/cicd-para-iniciantes-entendendo-pipelines-com-gitlab-testes-e-docker-3h56</guid>
      <description>&lt;p&gt;Se você está começando a estudar desenvolvimento de software, provavelmente já encontrou termos como &lt;strong&gt;CI/CD, pipeline, GitLab Runner, build, artifacts, Docker e deploy&lt;/strong&gt;. O problema é que, quando esses conceitos aparecem todos juntos, é fácil decorar comandos sem realmente entender o que está acontecendo.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos construir esse entendimento do zero.&lt;/p&gt;

&lt;p&gt;A ideia é usar uma situação simples como analogia e, a partir dela, transformar o conceito em uma implementação real usando GitLab. O objetivo não é criar a pipeline mais sofisticada possível, mas entender os fundamentos necessários para conseguir ler, escrever, modificar e solucionar problemas em uma pipeline de CI/CD.&lt;/p&gt;

&lt;p&gt;No final, você terá uma visão de como uma alteração de código pode ser automaticamente construída, testada e transformada em uma imagem Docker.&lt;/p&gt;




&lt;h2&gt;
  
  
  Antes de falar de CI/CD, imagine uma fábrica
&lt;/h2&gt;

&lt;p&gt;Imagine uma fábrica que produz computadores.&lt;/p&gt;

&lt;p&gt;Um funcionário monta as peças. Outro verifica se o computador liga. Outro realiza testes mais específicos. Depois, o produto é embalado e armazenado para distribuição.&lt;/p&gt;

&lt;p&gt;Seria estranho colocar um computador recém-montado diretamente na caixa sem verificar se ele funciona.&lt;/p&gt;

&lt;p&gt;Seria ainda mais estranho descobrir um defeito depois que centenas de unidades já foram distribuídas.&lt;/p&gt;

&lt;p&gt;No desenvolvimento de software, o problema é parecido.&lt;/p&gt;

&lt;p&gt;Uma pessoa escreve código, outra altera uma funcionalidade existente, outra modifica uma configuração. Em algum momento, essas alterações precisam ser integradas. A grande pergunta é: &lt;strong&gt;como saber rapidamente se aquilo que foi produzido continua funcionando?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É exatamente aí que entra a Integração Contínua.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. O que significa Continuous Integration?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt;, ou Integração Contínua, é uma prática de desenvolvimento em que as alterações de código são integradas frequentemente e submetidas a verificações automatizadas.&lt;/p&gt;

&lt;p&gt;Na prática, isso pode significar que, quando um desenvolvedor envia uma alteração para o GitLab, o sistema automaticamente executa tarefas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Instalar dependências
Executar build
Executar testes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo funcionar, a alteração passa pelas verificações.&lt;/p&gt;

&lt;p&gt;Se alguma etapa falhar, a equipe descobre o problema rapidamente.&lt;/p&gt;

&lt;p&gt;Martin Fowler descreve Continuous Integration como a integração frequente das alterações em uma base compartilhada, acompanhada de um build automatizado que inclui testes para detectar problemas de integração rapidamente.&lt;/p&gt;

&lt;p&gt;A Red Hat também descreve CI como a integração automática e frequente de mudanças em um repositório compartilhado.&lt;/p&gt;

&lt;p&gt;A ideia mais importante aqui é simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CI não existe para "deixar o projeto moderno". Ela existe para detectar problemas cedo.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  2. E o que significa CD?
&lt;/h1&gt;

&lt;p&gt;O termo &lt;strong&gt;CD&lt;/strong&gt; pode representar duas ideias diferentes: &lt;strong&gt;Continuous Delivery&lt;/strong&gt; e &lt;strong&gt;Continuous Deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No Continuous Delivery, o software passa por um processo automatizado de construção e validação e fica preparado para ser entregue. A implantação final ainda pode depender de uma decisão ou ação manual.&lt;/p&gt;

&lt;p&gt;No Continuous Deployment, a implantação também é automatizada.&lt;/p&gt;

&lt;p&gt;Uma maneira simples de diferenciar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous Integration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Código
Build
Testes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Continuous Delivery&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Código
Build
Testes
Artefato pronto para entrega
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Continuous Deployment&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Código
Build
Testes
Deploy automático
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses conceitos fazem parte de uma mesma ideia de automação, mas não precisam ser implementados todos de uma vez. Para quem está começando, entender CI primeiro costuma ser muito mais importante do que tentar automatizar todo o processo de implantação logo no início.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. A pipeline é a linha de produção
&lt;/h1&gt;

&lt;p&gt;Agora podemos voltar à nossa fábrica.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;pipeline&lt;/strong&gt; é a linha de produção completa.&lt;/p&gt;

&lt;p&gt;Ela representa o conjunto de etapas que o software precisa atravessar para chegar ao resultado desejado.&lt;/p&gt;

&lt;p&gt;No GitLab, pipelines são configuradas normalmente em um arquivo chamado &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;. Elas podem ser disparadas por diferentes eventos, como commits, Merge Requests ou execução manual.&lt;/p&gt;

&lt;p&gt;Um exemplo simples de pipeline seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build → Testes → Empacotamento
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não precisamos interpretar isso como uma lista de comandos. Pense na pipeline como uma sequência de responsabilidades.&lt;/p&gt;

&lt;p&gt;Primeiro perguntamos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"O sistema consegue ser construído?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depois:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"O sistema está se comportando como esperado?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E, por fim:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Conseguimos preparar esse resultado para ser distribuído?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa forma de pensar ajuda muito mais do que simplesmente decorar sintaxe YAML.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Pipeline, Stage e Job
&lt;/h1&gt;

&lt;p&gt;Agora aparecem três palavras que todo iniciante precisa entender.&lt;/p&gt;

&lt;p&gt;Uma &lt;strong&gt;pipeline&lt;/strong&gt; é o processo completo.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;stage&lt;/strong&gt; é uma etapa lógica desse processo.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;job&lt;/strong&gt; é uma tarefa executada dentro de um stage.&lt;/p&gt;

&lt;p&gt;Podemos imaginar uma estrutura como esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pipeline
├── Build
│   └── build-app
├── Test
│   ├── unit-tests
│   └── lint
└── Docker
    └── build-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O GitLab executa os stages na ordem definida. Dentro de um mesmo stage, jobs podem ser executados em paralelo quando houver runners disponíveis.&lt;/p&gt;

&lt;p&gt;Essa diferença é importante porque uma pipeline pode possuir dezenas de jobs sem necessariamente possuir dezenas de stages.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Quem executa os jobs?
&lt;/h1&gt;

&lt;p&gt;A essa altura surge outra pergunta.&lt;/p&gt;

&lt;p&gt;Quem realmente executa os comandos?&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;GitLab Runner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O GitLab gerencia a pipeline, mas os jobs precisam ser executados por um agente capaz de fornecer um ambiente de execução.&lt;/p&gt;

&lt;p&gt;O Runner recebe o job, executa os comandos definidos e devolve o resultado ao GitLab.&lt;/p&gt;

&lt;p&gt;Se tivermos:&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;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;npm ci&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o Runner será responsável por executar esses comandos.&lt;/p&gt;

&lt;p&gt;Essa distinção resolve uma dúvida comum: &lt;strong&gt;GitLab e GitLab Runner não são exatamente a mesma coisa&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O GitLab organiza e gerencia o processo. O Runner executa o trabalho.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Criando a primeira pipeline
&lt;/h1&gt;

&lt;p&gt;A melhor maneira de aprender é começar pequeno.&lt;/p&gt;

&lt;p&gt;Crie um arquivo chamado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.gitlab-ci.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e coloque:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

&lt;span class="na"&gt;build&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;build&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 "Executando build"&lt;/span&gt;

&lt;span class="na"&gt;test&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;test&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 "Executando testes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento, não estamos construindo uma aplicação real.&lt;/p&gt;

&lt;p&gt;Estamos apenas testando nossa infraestrutura.&lt;/p&gt;

&lt;p&gt;Se o GitLab conseguir executar esses dois jobs com sucesso, já confirmamos várias coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o arquivo está sendo interpretado;&lt;/li&gt;
&lt;li&gt;existe um Runner disponível;&lt;/li&gt;
&lt;li&gt;os stages estão sendo reconhecidos;&lt;/li&gt;
&lt;li&gt;os jobs estão sendo executados;&lt;/li&gt;
&lt;li&gt;a pipeline consegue chegar ao final.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A documentação oficial do GitLab possui um tutorial específico para esse primeiro contato.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Agora precisamos de um ambiente para nossa aplicação
&lt;/h1&gt;

&lt;p&gt;Até aqui usamos apenas &lt;code&gt;echo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora imagine que nosso projeto seja uma aplicação web construída com Node.js.&lt;/p&gt;

&lt;p&gt;O Runner precisa de um ambiente capaz de executar Node e npm.&lt;/p&gt;

&lt;p&gt;Uma forma prática de fornecer esse ambiente é utilizar uma imagem Docker como ambiente do job:&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;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, podemos alterar nossa pipeline:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:24&lt;/span&gt;

&lt;span class="na"&gt;build&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;build&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;

&lt;span class="na"&gt;test&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;test&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui começamos a sair da teoria.&lt;/p&gt;

&lt;p&gt;Agora a pipeline está realmente trabalhando com o projeto.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Por que &lt;code&gt;npm ci&lt;/code&gt; aparece tanto em CI/CD?
&lt;/h1&gt;

&lt;p&gt;Quem está começando em Node.js geralmente conhece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas é muito comum encontrar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em pipelines.&lt;/p&gt;

&lt;p&gt;O motivo é que &lt;code&gt;npm ci&lt;/code&gt; foi projetado para instalações automatizadas, como ambientes de integração contínua. Ele exige um lockfile existente e utiliza esse arquivo para realizar uma instalação limpa e previsível. Se &lt;code&gt;package.json&lt;/code&gt; e &lt;code&gt;package-lock.json&lt;/code&gt; estiverem inconsistentes, o comando falha em vez de alterar o lockfile automaticamente.&lt;/p&gt;

&lt;p&gt;Podemos pensar no &lt;code&gt;package-lock.json&lt;/code&gt; como uma especificação das versões das dependências que devem ser utilizadas.&lt;/p&gt;

&lt;p&gt;Isso reduz a chance de um cenário como:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Na minha máquina funciona, mas no ambiente da pipeline veio outra versão de uma dependência."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não significa que &lt;code&gt;npm install&lt;/code&gt; esteja errado. Significa que os dois comandos possuem objetivos diferentes.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Build: a primeira inspeção
&lt;/h1&gt;

&lt;p&gt;Agora temos nosso primeiro estágio real:&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;build&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;build&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O papel desse job é bastante claro:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;verificar se a aplicação consegue ser construída.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se o &lt;code&gt;npm run build&lt;/code&gt; funcionar, o job termina com sucesso.&lt;/p&gt;

&lt;p&gt;Se o comando retornar erro, o job falha.&lt;/p&gt;

&lt;p&gt;Isso é importante porque uma alteração que impede a aplicação de ser construída não precisa esperar a revisão manual de alguém para ser descoberta.&lt;/p&gt;

&lt;p&gt;A própria documentação do GitLab utiliza build como exemplo de uma tarefa típica de um job de CI/CD.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Mas uma aplicação que compila pode estar errada
&lt;/h1&gt;

&lt;p&gt;Imagine que nosso computador seja montado perfeitamente.&lt;/p&gt;

&lt;p&gt;Isso prova que as peças foram encaixadas, mas ainda não prova que o computador está funcionando corretamente.&lt;/p&gt;

&lt;p&gt;Software é igual.&lt;/p&gt;

&lt;p&gt;Uma aplicação pode compilar sem erros e ainda possuir bugs.&lt;/p&gt;

&lt;p&gt;Por isso precisamos de testes.&lt;/p&gt;

&lt;p&gt;Essa é a segunda grande responsabilidade da nossa pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build
Testes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O build responde:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Consigo produzir a aplicação?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Os testes respondem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ela está se comportando como esperado?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  11. Testes automatizados
&lt;/h1&gt;

&lt;p&gt;Um teste unitário, por exemplo, pode verificar uma função ou uma pequena unidade do sistema isoladamente.&lt;/p&gt;

&lt;p&gt;Suponha que exista um serviço responsável por calcular o valor final de um pedido.&lt;/p&gt;

&lt;p&gt;Podemos escrever testes que verifiquem diferentes situações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pedido com um produto
Pedido com vários produtos
Pedido sem produtos
Desconto aplicado
Valor inválido
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não precisamos confiar apenas em alguém abrir a aplicação manualmente e testar esses cenários toda vez que uma alteração for feita.&lt;/p&gt;

&lt;p&gt;Podemos transformar essas verificações em código e executá-las automaticamente.&lt;/p&gt;

&lt;p&gt;No Angular atual, novos projetos criados pelo Angular CLI utilizam Vitest como configuração padrão de testes, e o próprio Angular possui documentação específica sobre a execução de testes em CI.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Um detalhe importante sobre testes no CI
&lt;/h1&gt;

&lt;p&gt;Existe uma diferença entre executar testes localmente e executá-los em uma pipeline.&lt;/p&gt;

&lt;p&gt;Durante o desenvolvimento, &lt;code&gt;ng test&lt;/code&gt; pode utilizar &lt;strong&gt;watch mode&lt;/strong&gt;, observando alterações nos arquivos e executando os testes novamente.&lt;/p&gt;

&lt;p&gt;Em ambientes de CI, queremos que os testes executem e terminem.&lt;/p&gt;

&lt;p&gt;A documentação atual do Angular explica que &lt;code&gt;ng test&lt;/code&gt; detecta o ambiente de CI e pode executar em modo de execução única; caso seja necessário forçar esse comportamento, &lt;code&gt;--no-watch&lt;/code&gt; e &lt;code&gt;--no-progress&lt;/code&gt; podem ser utilizados.&lt;/p&gt;

&lt;p&gt;Por isso, não devemos simplesmente copiar um comando de desenvolvimento para a pipeline sem entender como ele se comporta naquele ambiente.&lt;/p&gt;

&lt;p&gt;Esse é um bom exemplo de uma ideia importante em DevOps:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automação não é copiar comandos do terminal; é adaptar o processo ao ambiente em que ele será executado.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  13. Quando um teste falha, isso é uma coisa boa
&lt;/h1&gt;

&lt;p&gt;Essa frase pode parecer estranha no começo.&lt;/p&gt;

&lt;p&gt;Imagine que nosso código tenha um bug.&lt;/p&gt;

&lt;p&gt;Sem testes automatizados, podemos descobrir o problema apenas depois de integrar a alteração.&lt;/p&gt;

&lt;p&gt;Com testes, temos a possibilidade de descobrir o problema antes.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build: PASS
Testes: FAIL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pipeline interrompe o processo.&lt;/p&gt;

&lt;p&gt;Isso não significa que a pipeline "quebrou o projeto".&lt;/p&gt;

&lt;p&gt;Na verdade, ela &lt;strong&gt;descobriu que o projeto já estava com um problema&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esse é um dos maiores valores da CI.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Merge Requests: onde tudo começa a fazer sentido
&lt;/h1&gt;

&lt;p&gt;Agora podemos conectar a pipeline ao fluxo de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Imagine que você esteja trabalhando em uma branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de implementar sua alteração, você envia o código para o GitLab e abre um Merge Request.&lt;/p&gt;

&lt;p&gt;Podemos configurar a CI para executar uma pipeline nesse contexto.&lt;/p&gt;

&lt;p&gt;O GitLab oferece suporte específico a &lt;strong&gt;Merge Request Pipelines&lt;/strong&gt;, que podem ser configuradas por regras utilizando &lt;code&gt;CI_PIPELINE_SOURCE == "merge_request_event"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso cria uma situação muito útil:&lt;/p&gt;

&lt;p&gt;Seu código não precisa ser integrado imediatamente à branch principal.&lt;/p&gt;

&lt;p&gt;Primeiro, ele passa pelas verificações automatizadas.&lt;/p&gt;

&lt;p&gt;Assim, o Merge Request passa a ser mais do que um pedido de merge: ele também se torna um ponto de validação técnica.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Um exemplo de &lt;code&gt;rules&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Podemos definir:&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;test&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;test&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;npm test&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$CI_PIPELINE_SOURCE == "merge_request_event"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A palavra &lt;code&gt;rules&lt;/code&gt; é importante porque permite controlar &lt;strong&gt;quando um job deve executar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O GitLab oferece diversas possibilidades para essa lógica, incluindo condições baseadas na origem da pipeline, branch e alterações de arquivos.&lt;/p&gt;

&lt;p&gt;Esse recurso se torna especialmente útil quando a pipeline cresce.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. E o resultado do build?
&lt;/h1&gt;

&lt;p&gt;Imagine que o build da aplicação gere uma pasta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos um resultado concreto.&lt;/p&gt;

&lt;p&gt;O GitLab pode armazenar esse resultado como um &lt;strong&gt;artifact&lt;/strong&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;build&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;build&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dist/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia de um artifact é simples: é um arquivo ou conjunto de arquivos produzidos por um job e preservados para serem usados posteriormente ou baixados pela equipe.&lt;/p&gt;

&lt;p&gt;O GitLab permite armazenar outputs de build e outros resultados de jobs como artifacts.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. Artifact e cache não são a mesma coisa
&lt;/h1&gt;

&lt;p&gt;Esse é um daqueles conceitos que parecem pequenos, mas fazem diferença.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;artifact&lt;/strong&gt; é uma saída importante da execução.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já o &lt;strong&gt;cache&lt;/strong&gt; serve principalmente para melhorar o desempenho de execuções futuras.&lt;/p&gt;

&lt;p&gt;Imagine nossa fábrica novamente.&lt;/p&gt;

&lt;p&gt;O artifact é o produto que saiu da produção.&lt;/p&gt;

&lt;p&gt;O cache é uma caixa de ferramentas que deixamos preparada para não precisar buscar as mesmas ferramentas novamente.&lt;/p&gt;

&lt;p&gt;A documentação do GitLab trata artifacts e cache como mecanismos diferentes: artifacts preservam outputs dos jobs, enquanto cache é utilizado principalmente para acelerar execuções futuras.&lt;/p&gt;




&lt;h1&gt;
  
  
  18. Agora podemos falar de Docker
&lt;/h1&gt;

&lt;p&gt;Até aqui, a pipeline consegue construir e testar nossa aplicação.&lt;/p&gt;

&lt;p&gt;Mas ainda precisamos pensar em como executar esse software de maneira consistente.&lt;/p&gt;

&lt;p&gt;É aqui que entra Docker.&lt;/p&gt;

&lt;p&gt;Uma imagem Docker funciona como um pacote contendo aquilo que precisamos para executar determinado software.&lt;/p&gt;

&lt;p&gt;Podemos pensar na nossa fábrica novamente.&lt;/p&gt;

&lt;p&gt;Até agora produzimos e inspecionamos o produto.&lt;/p&gt;

&lt;p&gt;Agora precisamos colocá-lo em uma embalagem padronizada.&lt;/p&gt;

&lt;p&gt;No caso de uma aplicação web, podemos ter algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Aplicação construída
Dockerfile
Imagem Docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A documentação oficial do Docker explica os conceitos fundamentais de imagens, containers e construção de aplicações containerizadas.&lt;/p&gt;




&lt;h1&gt;
  
  
  19. Um Dockerfile simples
&lt;/h1&gt;

&lt;p&gt;Para uma aplicação Angular que será servida como conteúdo estático por Nginx, um exemplo simplificado é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; nginx:alpine&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; dist/ /usr/share/nginx/html/&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não é importante decorar esse arquivo agora.&lt;/p&gt;

&lt;p&gt;O importante é compreender o que ele representa.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt; define a imagem de base.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;COPY&lt;/code&gt; coloca os arquivos da aplicação dentro da imagem.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;EXPOSE&lt;/code&gt; documenta a porta utilizada pelo serviço.&lt;/p&gt;

&lt;p&gt;A imagem resultante pode ser executada como container.&lt;/p&gt;




&lt;h1&gt;
  
  
  20. Primeiro faça o Docker funcionar localmente
&lt;/h1&gt;

&lt;p&gt;Antes de adicionar Docker ao GitLab CI, precisamos verificar se ele funciona localmente.&lt;/p&gt;

&lt;p&gt;Construímos a imagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; minha-aplicacao &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois executamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 minha-aplicacao
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos acessar a aplicação localmente.&lt;/p&gt;

&lt;p&gt;Essa etapa é muito importante.&lt;/p&gt;

&lt;p&gt;Se o Dockerfile não funciona na sua máquina, adicionar um Runner no meio da história só vai tornar o problema mais difícil de investigar.&lt;/p&gt;

&lt;p&gt;Uma boa prática de engenharia é reduzir o número de variáveis desconhecidas.&lt;/p&gt;

&lt;p&gt;Primeiro:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker funciona localmente?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker funciona dentro da pipeline?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa ordem economiza muito tempo.&lt;/p&gt;




&lt;h1&gt;
  
  
  21. Docker dentro da pipeline
&lt;/h1&gt;

&lt;p&gt;Depois que a imagem estiver funcionando localmente, podemos adicionar um novo stage:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então criar um job responsável pela construção da imagem:&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;docker-build&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;docker&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;docker build -t minha-aplicacao .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui existe um detalhe importante: &lt;strong&gt;esse exemplo é conceitual&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A forma como Docker será executado dentro de um GitLab Runner depende da configuração do Runner e do executor utilizado. O GitLab possui documentação específica para diferentes estratégias de uso do Docker em CI/CD.&lt;/p&gt;

&lt;p&gt;Esse é um ponto em que vale parar de copiar tutoriais e começar a entender a infraestrutura.&lt;/p&gt;




&lt;h1&gt;
  
  
  22. Onde guardar a imagem?
&lt;/h1&gt;

&lt;p&gt;Depois de construir a imagem, precisamos de um lugar para armazená-la.&lt;/p&gt;

&lt;p&gt;É aqui que entra um &lt;strong&gt;Container Registry&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Podemos utilizar o próprio GitLab Container Registry.&lt;/p&gt;

&lt;p&gt;A ideia é que a pipeline construa uma imagem e publique essa imagem no registry para que ela possa ser utilizada posteriormente.&lt;/p&gt;

&lt;p&gt;Uma imagem poderia ser identificada por uma versão, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minha-aplicacao:1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou por um identificador associado ao commit.&lt;/p&gt;

&lt;p&gt;Isso ajuda a responder uma pergunta importante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Qual código gerou esta imagem?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quanto mais um sistema cresce, mais importante se torna essa rastreabilidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  23. Não coloque credenciais no YAML
&lt;/h1&gt;

&lt;p&gt;Suponha que seja necessário autenticar no registry.&lt;/p&gt;

&lt;p&gt;Nunca faça algo como:&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;PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minha-senha"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e envie isso para o Git.&lt;/p&gt;

&lt;p&gt;Credenciais e outros valores sensíveis devem ser armazenados nas variáveis de CI/CD do GitLab.&lt;/p&gt;

&lt;p&gt;A pipeline pode então acessar a variável sem que o valor seja incorporado diretamente ao código-fonte.&lt;/p&gt;

&lt;p&gt;O GitLab possui uma seção específica de documentação sobre CI/CD Variables e segurança de variáveis.&lt;/p&gt;

&lt;p&gt;Essa ideia vale para tokens, senhas, chaves e outras credenciais.&lt;/p&gt;




&lt;h1&gt;
  
  
  24. Nossa pipeline está começando a tomar forma
&lt;/h1&gt;

&lt;p&gt;Depois de entender cada parte, podemos juntar os conceitos.&lt;/p&gt;

&lt;p&gt;Uma pipeline inicial poderia ser:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:24&lt;/span&gt;

&lt;span class="na"&gt;build&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;build&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;
  &lt;span class="na"&gt;artifacts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dist/&lt;/span&gt;

&lt;span class="na"&gt;test&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;test&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;npm ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa pipeline já faz algo importante.&lt;/p&gt;

&lt;p&gt;Ela garante que o projeto seja construído e testado automaticamente.&lt;/p&gt;

&lt;p&gt;Não precisamos começar adicionando Docker, registry, segurança, deploy e dezenas de outras etapas.&lt;/p&gt;

&lt;p&gt;Primeiro fazemos o básico funcionar.&lt;/p&gt;




&lt;h1&gt;
  
  
  25. Depois adicionamos Docker
&lt;/h1&gt;

&lt;p&gt;Com o básico estável, podemos evoluir:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build
test
docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A ideia é que o processo de containerização aconteça apenas depois das validações anteriores.&lt;/p&gt;

&lt;p&gt;Em outras palavras, não faz muito sentido produzir uma imagem de um software que nem passou pelo build ou pelos testes definidos pela equipe.&lt;/p&gt;




&lt;h1&gt;
  
  
  26. Por que não criar uma pipeline gigantesca logo no começo?
&lt;/h1&gt;

&lt;p&gt;Esse é um erro bastante comum.&lt;/p&gt;

&lt;p&gt;A pessoa descobre CI/CD e tenta adicionar imediatamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build
Testes
Lint
Coverage
SonarQube
Security
Docker
Registry
Deploy
E2E
Performance
Rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado costuma ser uma pipeline difícil de entender e ainda mais difícil de corrigir.&lt;/p&gt;

&lt;p&gt;Uma pipeline deve crescer conforme as necessidades do projeto.&lt;/p&gt;

&lt;p&gt;Uma progressão mais saudável é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build
Build + Testes
Build + Testes + Artifacts
Build + Testes + Docker
Build + Testes + Docker + Registry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não existe prêmio por ter o arquivo &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; mais comprido.&lt;/p&gt;




&lt;h1&gt;
  
  
  27. A pipeline como uma barreira de qualidade
&lt;/h1&gt;

&lt;p&gt;Quando o processo está funcionando, podemos pensar na pipeline como uma série de verificações.&lt;/p&gt;

&lt;p&gt;Uma alteração de código precisa passar por critérios objetivos antes de avançar.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build passou?
Testes passaram?
Imagem foi construída?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso não significa que a pipeline substitui a revisão humana.&lt;/p&gt;

&lt;p&gt;Ela não sabe, sozinha, se uma arquitetura é boa.&lt;/p&gt;

&lt;p&gt;Ela não sabe se um nome de classe está adequado.&lt;/p&gt;

&lt;p&gt;Ela não entende completamente uma decisão de negócio.&lt;/p&gt;

&lt;p&gt;Essas responsabilidades continuam pertencendo aos desenvolvedores.&lt;/p&gt;

&lt;p&gt;A pipeline automatiza aquilo que é objetivo, repetitivo e verificável.&lt;/p&gt;




&lt;h1&gt;
  
  
  28. CI não é sinônimo de deploy
&lt;/h1&gt;

&lt;p&gt;Outro erro comum é pensar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Se não existe deploy automático, então não existe CI/CD."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso não é verdade.&lt;/p&gt;

&lt;p&gt;Uma pipeline que automaticamente executa build e testes já está implementando práticas de Continuous Integration.&lt;/p&gt;

&lt;p&gt;O GitLab descreve CI/CD como um processo contínuo que automatiza construção, testes e, quando aplicável, implantação e outras etapas do ciclo de entrega.&lt;/p&gt;

&lt;p&gt;O deploy automático é apenas uma possibilidade posterior.&lt;/p&gt;




&lt;h1&gt;
  
  
  29. Como estudar CI/CD sem decorar YAML
&lt;/h1&gt;

&lt;p&gt;Uma boa forma de aprender é estudar cada conceito junto com uma pequena implementação.&lt;/p&gt;

&lt;p&gt;Aprenda o que é uma pipeline e crie uma pipeline mínima.&lt;/p&gt;

&lt;p&gt;Aprenda o que é um job e crie um job.&lt;/p&gt;

&lt;p&gt;Aprenda o que é um stage e crie dois stages.&lt;/p&gt;

&lt;p&gt;Aprenda sobre Runner e observe onde o comando realmente é executado.&lt;/p&gt;

&lt;p&gt;Aprenda sobre testes e coloque um teste real dentro da pipeline.&lt;/p&gt;

&lt;p&gt;Aprenda sobre artifacts e faça o build gerar um arquivo que possa ser recuperado depois.&lt;/p&gt;

&lt;p&gt;Aprenda Docker e construa a imagem localmente.&lt;/p&gt;

&lt;p&gt;Depois coloque esse processo na CI.&lt;/p&gt;

&lt;p&gt;Essa estratégia é muito mais eficiente do que consumir horas de conteúdo antes de escrever a primeira linha do &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  30. Um exercício simples para começar
&lt;/h1&gt;

&lt;p&gt;Crie um projeto vazio no GitLab e adicione:&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="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;

&lt;span class="na"&gt;build&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;build&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 "Meu build está funcionando"&lt;/span&gt;

&lt;span class="na"&gt;test&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;test&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 "Meus testes estão funcionando"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faça o commit e observe a pipeline.&lt;/p&gt;

&lt;p&gt;Depois altere o job de teste:&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;test&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;test&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 "Executando testes"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;exit &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o job deve falhar.&lt;/p&gt;

&lt;p&gt;Essa pequena experiência ensina um conceito fundamental: &lt;strong&gt;a pipeline utiliza o código de saída dos comandos para determinar o sucesso ou falha do job&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Depois disso, substitua os &lt;code&gt;echo&lt;/code&gt; por comandos reais do seu projeto.&lt;/p&gt;




&lt;h1&gt;
  
  
  31. O que você deve saber depois deste artigo?
&lt;/h1&gt;

&lt;p&gt;Não é necessário memorizar todas as palavras-chave do GitLab.&lt;/p&gt;

&lt;p&gt;O mais importante é entender o papel de cada componente.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Pergunta que ele responde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CI&lt;/td&gt;
&lt;td&gt;Como validar alterações automaticamente?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CD&lt;/td&gt;
&lt;td&gt;Como automatizar a entrega do software?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline&lt;/td&gt;
&lt;td&gt;Quais etapas compõem esse processo?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage&lt;/td&gt;
&lt;td&gt;Em que fase da pipeline estamos?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job&lt;/td&gt;
&lt;td&gt;Qual tarefa específica deve ser executada?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runner&lt;/td&gt;
&lt;td&gt;Onde essa tarefa será executada?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;A aplicação pode ser construída?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testes&lt;/td&gt;
&lt;td&gt;O comportamento esperado continua funcionando?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artifact&lt;/td&gt;
&lt;td&gt;Qual resultado produzido precisamos preservar?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Como empacotar a aplicação?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registry&lt;/td&gt;
&lt;td&gt;Onde armazenamos a imagem?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables&lt;/td&gt;
&lt;td&gt;Como disponibilizar configurações e secrets sem colocá-los no código?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quando essa relação estiver clara, aprender novas funcionalidades do GitLab se torna muito mais simples.&lt;/p&gt;




&lt;h1&gt;
  
  
  32. O próximo nível
&lt;/h1&gt;

&lt;p&gt;Depois de dominar essa primeira estrutura, existem muitos assuntos que podem ser adicionados:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qualidade de código:&lt;/strong&gt; linters, análise estática e ferramentas como SonarQube.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes:&lt;/strong&gt; cobertura, testes de integração e testes end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; secret detection, dependency scanning e outras verificações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; cache, execução paralela e &lt;code&gt;needs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrega:&lt;/strong&gt; environments, deploy automatizado e rollback.&lt;/p&gt;

&lt;p&gt;O próprio GitLab possui documentação sobre esses recursos e também disponibiliza tutoriais progressivos para quem está começando.&lt;/p&gt;

&lt;p&gt;Mas não há necessidade de aprender tudo de uma vez.&lt;/p&gt;

&lt;p&gt;O fundamento continua sendo o mesmo: &lt;strong&gt;automatizar o processo de construção, validação e entrega de software de maneira previsível.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  33. Materiais recomendados
&lt;/h1&gt;

&lt;p&gt;Se você está começando, vale combinar três tipos de material.&lt;/p&gt;

&lt;p&gt;O primeiro são conteúdos introdutórios em português. O próprio GitLab mantém um guia recente em português voltado para iniciantes e também possui um guia rápido para configurar a primeira pipeline.&lt;/p&gt;

&lt;p&gt;O segundo são as documentações oficiais. Elas são particularmente importantes quando você sai do exemplo didático e começa a configurar o projeto real.&lt;/p&gt;

&lt;p&gt;Por fim, vídeos são úteis para visualizar o GitLab funcionando na prática. Um conteúdo introdutório em inglês bastante completo é o tutorial da TechWorld with Nana, que aborda pipeline, jobs, stages, runners, testes, Docker e variáveis. Também existe um vídeo em português do Vinicius Barreto demonstrando GitLab CI/CD com build e push de imagem Docker.&lt;/p&gt;




&lt;h1&gt;
  
  
  34. Referências
&lt;/h1&gt;

&lt;h3&gt;
  
  
  CI/CD e DevOps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Martin Fowler — Continuous Integration&lt;/strong&gt;&lt;br&gt;
Artigo clássico sobre os princípios e práticas de Integração Contínua.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Red Hat — O que é CI/CD?&lt;/strong&gt;&lt;br&gt;
Material introdutório em português explicando CI, Continuous Delivery e Continuous Deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitLab
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitLab — Get started with GitLab CI/CD&lt;/strong&gt;&lt;br&gt;
Introdução oficial ao funcionamento do CI/CD no GitLab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitLab — CI/CD Pipelines&lt;/strong&gt;&lt;br&gt;
Documentação sobre pipelines, stages e jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitLab — Runners&lt;/strong&gt;&lt;br&gt;
Documentação sobre os agentes responsáveis pela execução dos jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitLab — Job Artifacts&lt;/strong&gt;&lt;br&gt;
Documentação sobre armazenamento dos resultados dos jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitLab — Merge Request Pipelines&lt;/strong&gt;&lt;br&gt;
Documentação sobre pipelines executadas em Merge Requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Angular
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Angular — Testing&lt;/strong&gt;&lt;br&gt;
Documentação oficial sobre testes unitários e execução de testes em CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker — Get Started&lt;/strong&gt;&lt;br&gt;
Introdução oficial a imagens, containers e aplicações containerizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  npm
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;npm — npm ci&lt;/strong&gt;&lt;br&gt;
Documentação oficial sobre instalações reproduzíveis para ambientes automatizados.&lt;/p&gt;




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

&lt;p&gt;Quando vemos um arquivo &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; pela primeira vez, é fácil enxergar apenas uma sequência estranha de YAML.&lt;/p&gt;

&lt;p&gt;Mas, depois que entendemos o problema que ele resolve, a estrutura começa a fazer sentido.&lt;/p&gt;

&lt;p&gt;Uma equipe produz alterações de software. Essas alterações precisam ser construídas, verificadas e testadas antes de avançarem no processo. O GitLab fornece a plataforma para organizar essa automação. O Runner executa as tarefas. Os jobs representam o trabalho. Os stages organizam as etapas. Os artifacts preservam resultados importantes. Docker empacota a aplicação. E o Registry pode armazenar as imagens produzidas.&lt;/p&gt;

&lt;p&gt;A tecnologia pode mudar. Os comandos podem mudar. A forma de configurar a pipeline pode evoluir.&lt;/p&gt;

&lt;p&gt;A ideia central, porém, continua a mesma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quanto mais do processo de desenvolvimento pudermos verificar de forma automática, consistente e reproduzível, menos dependeremos de tarefas manuais e de descobertas tardias.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CI/CD não é sobre criar uma pipeline enorme.&lt;/p&gt;

&lt;p&gt;É sobre criar um processo confiável para transformar código em software que foi &lt;strong&gt;construído, testado e preparado de maneira controlada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E esse é o conceito que vale levar para qualquer projeto, independentemente da linguagem, framework ou plataforma utilizada.&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cicd</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
