<?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: Felipe Maciel Ramos Vieira</title>
    <description>The latest articles on DEV Community by Felipe Maciel Ramos Vieira (@felipemrvieira).</description>
    <link>https://dev.to/felipemrvieira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F774045%2F5e2a215a-dd65-473e-a47f-9b1bfe7364c4.jpeg</url>
      <title>DEV Community: Felipe Maciel Ramos Vieira</title>
      <link>https://dev.to/felipemrvieira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipemrvieira"/>
    <language>en</language>
    <item>
      <title>Criando seu processo de CI/CD com GitHub Actions</title>
      <dc:creator>Felipe Maciel Ramos Vieira</dc:creator>
      <pubDate>Tue, 02 May 2023 13:08:04 +0000</pubDate>
      <link>https://dev.to/felipemrvieira/criando-seu-processo-de-cicd-com-github-actions-25h8</link>
      <guid>https://dev.to/felipemrvieira/criando-seu-processo-de-cicd-com-github-actions-25h8</guid>
      <description>&lt;p&gt;E aí, já conhece o &lt;a href="https://github.com/features/actions"&gt;Github Actions&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;O GitHub Actions é uma ferramenta massa para automatizar seus workflows de CI/CD direto no GitHub. Com ele, dá para rodar os testes e fazer builds e deploys de forma bem simples. Vamos ver como fazer!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/NytMLKyiaIh6VH9SPm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/NytMLKyiaIh6VH9SPm/giphy.gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa publicação eu vou mostrar como criar um workflow para um projeto com &lt;strong&gt;Ruby on Rails, Docker  e Docker Compose&lt;/strong&gt;, mas o exemplo serve perfeitamente para outros tipos de projeto com algumas pequenas alterações!&lt;/p&gt;

&lt;p&gt;Você precisará ter um projeto rails com docker, docker compose e os testes e para isso você pode encontrar um &lt;a href="https://dev.to/felipemrvieira/receita-de-api-rails-com-docker-23a1"&gt;guia aqui&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Com o seu projeto pronto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Crie uma pasta chamada &lt;strong&gt;.github/workflows&lt;/strong&gt; na raiz. Dentro dessa pasta crie um arquivo yaml. O nome é com você. Eu vou chamar de &lt;strong&gt;ci.yaml&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie o seu fluxo. Aqui, basicamente você define o passo a passo que vai ser executado a cada &lt;a href="https://docs.github.com/pt/actions/using-workflows/events-that-trigger-workflows"&gt;ação(push, pull request, issues, fork...)&lt;/a&gt;. Para esse exemplo, eu quero que o criar triggers para quando o houver push ou quando for criado pull request apontando para a branch main. Em seguida explico um pouco mais, mas o arquivo fica assim:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Rails CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Build and Test
        run: |
          docker compose build
          docker compose run --rm web bundle install
          docker compose run --rm web bundle exec rails db:create
          docker compose run --rm web bundle exec rails db:migrate
          docker compose run --rm web bundle exec rspec

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos aos detalhes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name: É o nome do workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;on: É onde se define os eventos que disparam o workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;jobs: São as atividades que serão executadas em paralelo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;build: É o &lt;strong&gt;ID do job&lt;/strong&gt;. Poderia ser qualquer identificador único dentro da cadeia de jobs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;runs-on: Define o tipo de máquina a ser executado o job id que criamos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;steps: Define a sequência de tarefas que vai ser executada no naquele job/job_id. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;checkout: O Primeiro step consiste em fazer &lt;a href="https://github.com/actions/checkout"&gt;checkout&lt;/a&gt; do repositório&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run: executa comandos no shell do SO. Nesse caso, estou executando uma série de comandos do docker.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se tudo der certo, ao fazer push ou pull request na master, sua action vai ser disparada.&lt;/p&gt;

&lt;p&gt;Agora é so fazer commit e push para ver o que acontece.&lt;/p&gt;

&lt;p&gt;Como verificar?&lt;/p&gt;

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

&lt;p&gt;E o exemplo de uma action que passou:&lt;/p&gt;

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

&lt;p&gt;Agora é com você! Dá uma explorada na aba actions e nesse check status que marquei!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ZfK4cXKJTTay1Ava29/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZfK4cXKJTTay1Ava29/giphy.gif" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubactions</category>
      <category>githubbrasil</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Receita de API Rails com Docker</title>
      <dc:creator>Felipe Maciel Ramos Vieira</dc:creator>
      <pubDate>Sat, 04 Mar 2023 16:05:10 +0000</pubDate>
      <link>https://dev.to/felipemrvieira/receita-de-api-rails-com-docker-23a1</link>
      <guid>https://dev.to/felipemrvieira/receita-de-api-rails-com-docker-23a1</guid>
      <description>&lt;p&gt;Criar uma API Ruby on Rails do zero nunca foi complexo, mas com &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;docker&lt;/a&gt; e &lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;docker compose&lt;/a&gt; fica ainda mais simples pois não se depende de instação de dependências locais, como rvm ou rbenv, ruby, bundler, banco, redis ou qualquer outra coisa que sua aplicação precise.&lt;/p&gt;

&lt;p&gt;As únicas dependências serão realmente o &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;docker&lt;/a&gt; e o &lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;docker compose&lt;/a&gt;, portanto, se não tiver instalado em sua máquina, precisará fazê-lo.&lt;/p&gt;

&lt;p&gt;Vamos à receita:&lt;/p&gt;

&lt;h2&gt;
  
  
  Crie o dockerfile
&lt;/h2&gt;

&lt;p&gt;Esse é o cara que vai criar a sua imagem docker(tipo a máquina virtual) para rodar a sua aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM ruby:3.1.2-slim

RUN apt-get update -qq &amp;amp;&amp;amp; apt-get install -yq --no-install-recommends \
    build-essential \
    gnupg2 \
    less \
    git \
    libpq-dev \
    postgresql-client \
    libvips42 \
  &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV LANG=C.UTF-8 \
  BUNDLE_JOBS=4 \
  BUNDLE_RETRY=3

RUN gem update --system &amp;amp;&amp;amp; gem install bundler

WORKDIR /usr/src/app

ENTRYPOINT ["./entrypoint.sh"]

EXPOSE 3001

CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Crie o entrypoint.sh
&lt;/h2&gt;

&lt;p&gt;Esse cara vai dizer o que o seu container precisa fazer depois que ele for inicializado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /usr/src/app/tmp/pids/server.pid

echo "bundle install..."
bundle check || bundle install --jobs 4

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vai, nem é tão difícil assim de entender...&lt;/p&gt;

&lt;p&gt;Agora adicione permissão de execução desse arquivo:&lt;br&gt;
&lt;code&gt;chmod +x entrypoint.sh&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Crie o Gemfile
&lt;/h2&gt;

&lt;p&gt;Inicialmente só precisa disso mesmo. Depois que gerar o app, o rails injeta o restante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source "https://rubygems.org"
gem "rails", "~&amp;gt; 7.0.4", "&amp;gt;= 7.0.4.2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Crie um arquivo vazio Gemfile.lock
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;touch Gemfile.lock&lt;/code&gt;&lt;br&gt;
Dont worry, você não vai precisar alterar isso&lt;/p&gt;
&lt;h2&gt;
  
  
  Crie o docker-compose.yml
&lt;/h2&gt;

&lt;p&gt;Esse arquivo conecta todos os serviços que a sua aplicação vai precisar: banco, redis, rede, armazenamento, e por aí vai...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid &amp;amp;&amp;amp; bin/rails s -p 3001 -b '0.0.0.0'"
    volumes:
      - .:/usr/src/app
      - bundle:/usr/local/bundle
    ports:
      - "3001:3001"
    env_file:
      - .env
    environment:
      - HISTFILE=/usr/src/app/log/.bash_history
      - ENVIRONMENT=local
    depends_on:
      - db
  db:
    image: postgres:13
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=123123
    volumes:
      - pg_data:/var/lib/postgresql/data
volumes:
  pg_data:
  redis_data:
  bundle:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Crie o seu .env
&lt;/h2&gt;

&lt;p&gt;para armazenar qualquer informação para sua aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PGHOST=db
PGUSER=postgres
PGPASSWORD=123123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gere uma nova aplicação a partir desta receita de container:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker compose run web rails new . --force --database=postgresql --api&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Receita pronta
&lt;/h2&gt;

&lt;p&gt;Agora que a receita está pronta, resta servir: &lt;code&gt;docker compose up&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para executar qualquer comando da aplicação:&lt;br&gt;
&lt;code&gt;docker compose exec web rails db:create&lt;/code&gt;&lt;br&gt;
outro, como exemplo: &lt;code&gt;docker compose exec web rails g scaffold user name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, ao acessar &lt;a href="http://localhost:3001/users" rel="noopener noreferrer"&gt;http://localhost:3001/users&lt;/a&gt; você já tem a sua rota de usuários prontinha... &lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webperf</category>
      <category>seo</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
