<?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: Vitor Leal</title>
    <description>The latest articles on DEV Community by Vitor Leal (@vitorleal).</description>
    <link>https://dev.to/vitorleal</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%2F126474%2Fabd08965-2fde-440c-9892-3d6298465b4f.jpg</url>
      <title>DEV Community: Vitor Leal</title>
      <link>https://dev.to/vitorleal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitorleal"/>
    <language>en</language>
    <item>
      <title>Múltiplas versões do Elixir com ASDF</title>
      <dc:creator>Vitor Leal</dc:creator>
      <pubDate>Thu, 10 Jun 2021 21:04:02 +0000</pubDate>
      <link>https://dev.to/vitorleal/multiplas-versoes-do-elixir-com-asdf-1ndi</link>
      <guid>https://dev.to/vitorleal/multiplas-versoes-do-elixir-com-asdf-1ndi</guid>
      <description>&lt;h2&gt;
  
  
  ASDF
&lt;/h2&gt;

&lt;p&gt;O gerenciador de versões &lt;a href="https://github.com/asdf-vm/asdf"&gt;ASDF&lt;/a&gt; é uma linha de comando open-source disponível no GitHub que permite instalar múltiplas versões de diversas  linguagens na mesma máquina, incluindo &lt;code&gt;Elixir&lt;/code&gt; e &lt;code&gt;Erlang&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instalando manualment
&lt;/h2&gt;

&lt;p&gt;Primeiro clone o projeto do GitHub com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/asdf-vm/asdf.git ~/.asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se por algum acaso você quiser desinstalar o &lt;code&gt;asdf&lt;/code&gt; da sua maquina basta deleter a pasta &lt;code&gt;~/.asdf&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Instalando via Homebrew (apenas no Mac)
&lt;/h2&gt;

&lt;p&gt;Para instalar utilizando o &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; basta executar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install asdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configurando a Shell
&lt;/h2&gt;

&lt;p&gt;Agora que você tem a linha de comando instalada na sua maquina você deve configurar a sua &lt;code&gt;shell&lt;/code&gt;, no caso do &lt;code&gt;zsh&lt;/code&gt; adicione esse linha no arquivo &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. $HOME/.asdf/asdf.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você utilizar &lt;a href="https://ohmyz.sh/"&gt;Oh My ZSH&lt;/a&gt;, apenas adicione o plugin &lt;code&gt;asdf&lt;/code&gt; nas configurações de plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plugins=(asdf)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se por acaso utilizar alguma outra &lt;code&gt;shell&lt;/code&gt; pode olhar a &lt;a href="https://asdf-vm.com/#/core-manage-asdf?id=install"&gt;documentação&lt;/a&gt; como realizar a configuração.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instalando os plugins
&lt;/h2&gt;

&lt;p&gt;Agora que temos o &lt;code&gt;asdf&lt;/code&gt; instalado e configurado na nossa maquina podemos instalar os plugins das linguagens que a gente quer que ele gerencie as versões, no caso deste post o &lt;code&gt;Elixir&lt;/code&gt; e o &lt;code&gt;Erlang&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf plugin add erlang
asdf plugin add elixir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Instalando Erlang/OTP
&lt;/h2&gt;

&lt;p&gt;Para saber as verões disponíveis para instalar execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf list-all erlang

23.3.4.3
24.0-rc1
24.0-rc2
24.0-rc3
24.0
24.0.1
24.0.2
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando listar todas as versões disponíveis escolha a que deseja instalar e execute o comando a seguir para instalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf install erlang 23.3.4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Perceba que diferente de outros gerenciadores de versão o &lt;code&gt;asdf&lt;/code&gt; precisa que você seja específico na versão que deseja instalar, ex: &lt;code&gt;23.3.4.3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para realizar a build do Erlang você vai precisar de algumas dependências instaladas. No Linux execute o comando:&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk-webview3.0-gtk3-dev libwxgtk3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdk&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Instalando Elixir
&lt;/h2&gt;

&lt;p&gt;Depois de instalar a versão do Erlang no passo anterior você pode listar as verões do Elixir disponíveis executando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf list-all elixir

1.12.1
1.12.1-otp-22
1.12.1-otp-23
1.12.1-otp-24
master
master-otp-21
master-otp-22
master-otp-23
master-otp-24
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como você pode perceber o Elixir tem múltiplas versões compiladas para cada &lt;code&gt;major&lt;/code&gt; release do Erlang/OTP.&lt;/p&gt;

&lt;p&gt;Agora você escolher a verão desejada compatível com a versão do Erlang instalada anteriormente e executar o comando para instalar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf install elixir 1.12.1-otp-23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Selecionando uma verão para usar
&lt;/h2&gt;

&lt;p&gt;Agora que a gente já sabe instalar as diversas verões disponíveis na mesma máquina vamos ver como selecionar a verão desejada. O &lt;code&gt;asdf&lt;/code&gt; permite a gente fazer isso de duas formas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Em uma pasta específica
&lt;/h4&gt;

&lt;p&gt;Para definir uma versão para uma pasta específica a gente utiliza o comando &lt;code&gt;local&lt;/code&gt; do &lt;code&gt;asdf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf local erlang 23.3.4.3
asdf local elixir 1.12.1-otp-23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando local vai criar na pasta que você executou o comando um arquivo &lt;code&gt;.tool-versions&lt;/code&gt; que é utilizado pela linha de comando para definir a versão das linguagens que vai ser utilizado naquele projeto.&lt;/p&gt;

&lt;h4&gt;
  
  
  De forma global
&lt;/h4&gt;

&lt;p&gt;Para definir uma versão para todos os projetos que não tenham uma versão definida ainda você pode utilizar o comando &lt;code&gt;global&lt;/code&gt; do &lt;code&gt;asdf&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;asdf global erlang 23.3.4.3
asdf global elixir 1.12.1-otp-23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando vai criar no seu diretório &lt;em&gt;home&lt;/em&gt; o arquivo &lt;code&gt;.tool-versions&lt;/code&gt; que vai definir as versões das linguagens que tem que ser utilizadas. &lt;/p&gt;




&lt;p&gt;Espero que o conteúdo tenha sido útil para vocês. &lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>GitHub Actions - Elixir</title>
      <dc:creator>Vitor Leal</dc:creator>
      <pubDate>Tue, 07 Apr 2020 01:55:45 +0000</pubDate>
      <link>https://dev.to/ingresse/github-actions-elixir-2351</link>
      <guid>https://dev.to/ingresse/github-actions-elixir-2351</guid>
      <description>&lt;p&gt;O &lt;a href="https://github.com/features/actions"&gt;Actions&lt;/a&gt; é uma ferramenta integrada aos seus repositórios do GitHub para automatizar os seus &lt;code&gt;workflows&lt;/code&gt; de CI/CD (&lt;em&gt;continuous delivery&lt;/em&gt; / &lt;em&gt;continuous deploy&lt;/em&gt;). Você consegue rodar esses &lt;code&gt;workflows&lt;/code&gt; baseado em diversos eventos do GitHub, como um novo &lt;em&gt;push&lt;/em&gt; em uma &lt;em&gt;branch&lt;/em&gt; a criação de uma nova &lt;em&gt;issue&lt;/em&gt; ou uma nova &lt;em&gt;release&lt;/em&gt; publicada.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contexto
&lt;/h1&gt;

&lt;p&gt;Desde que o GitHub lançou a versão beta do &lt;a href="https://github.com/features/actions"&gt;Actions&lt;/a&gt;, a &lt;a href="https://www.ingresse.com/"&gt;Ingresse&lt;/a&gt; vem a testando. No final do ano passado o Actions saiu da versão beta e a gente decidiu finalmente migrar nossos &lt;em&gt;workflows&lt;/em&gt; para lá.&lt;/p&gt;

&lt;p&gt;Já que &lt;code&gt;Elixir&lt;/code&gt; é a nossa &lt;a href="https://dev.to/ingresse/adotando-o-elixir-na-ingresse-362m"&gt;linguagem principal&lt;/a&gt; na Ingresse, começamos a migrar primeiro os &lt;em&gt;workflows&lt;/em&gt; dos serviços em &lt;code&gt;Elixir&lt;/code&gt; para o Actions e aqui tem algumas dicas de como a gente faz.&lt;/p&gt;

&lt;h1&gt;
  
  
  Básico
&lt;/h1&gt;




&lt;p&gt;Antes de tudo vou apresentar um pouco do básico do &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;, se você já tem familiaridade pode seguir passar direto essa seção.&lt;/p&gt;




&lt;p&gt;O Actions vai ler os arquivos &lt;code&gt;.yml&lt;/code&gt; ou &lt;code&gt;.yaml&lt;/code&gt; dentro da pasta &lt;code&gt;.github/workflows&lt;/code&gt; na raiz do seu projeto.&lt;/p&gt;

&lt;p&gt;Primeiro vamos criar a pasta &lt;code&gt;.github&lt;/code&gt; com a pasta &lt;code&gt;workflows&lt;/code&gt; dentro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p .github/workflows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos criar um arquivo que a gente pode chamar de &lt;code&gt;ci.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora vamos adicionar o seguinte conteúdo nele:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Meu Workflow&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos aos detalhes do conteúdo desse arquivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;name&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O nome do seu &lt;em&gt;workflow&lt;/em&gt;. É um campo opcional.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;on&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O nome do evento do GitHub que vai iniciar esse workflow.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pode ser um evento apenas:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Vai rodar sempre que alguém realizar um push no repositório&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pode ser uma lista de eventos:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Vai rodar sempre que alguém realizar um push no repositório&lt;/span&gt;
&lt;span class="c1"&gt;# e quando for criado um novo pull request&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Pode ser customizado por evento:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Vai rodar sempre que um pull request for criado&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Mas quando estiver apontando para a master&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

  &lt;span class="c1"&gt;# Vai rodar sempre que uma release for criada&lt;/span&gt;
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Mas se ela estiver com o status de publicada&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;published&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;code&gt;jobs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Um &lt;em&gt;workflow&lt;/em&gt; pode ter um ou mais &lt;em&gt;jobs&lt;/em&gt;. Por padrão, múltiplos jobs rodam em paralelo.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;jobs.&amp;lt;id-do-job&amp;gt;.run-on&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Em que tipo de máquina o &lt;em&gt;job&lt;/em&gt; vai ser executado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pode ser em um tipo de máquina:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Podem ser em múltiplos tipos de máquinas, incluindo &lt;code&gt;ubuntu&lt;/code&gt;, &lt;code&gt;macos&lt;/code&gt; e &lt;code&gt;windows&lt;/code&gt;:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows-latest&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.platform }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;code&gt;jobs.&amp;lt;id-do-job&amp;gt;.steps&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Um &lt;em&gt;job&lt;/em&gt; pode ter uma ou mais tarefas que vão ser executadas. Uma tarefa pode executar comandos, rodar setups ou rodar outras actions. O próprio GitHub tem uma série de actions publicadas que facilitam muitos trabalhos. Nesse exemplo estamos usando a action &lt;code&gt;actions/checkout&lt;/code&gt; na versão &lt;code&gt;v1&lt;/code&gt; para clonar o repositório do projeto.&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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Primeira tarefa a ser executada vai ser clonar o repositório&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Próximos passos
&lt;/h1&gt;

&lt;p&gt;Bom agora que a gente já sabe um pouco mais sobe a estrutura básica de um &lt;em&gt;workflow&lt;/em&gt; do GitHub Actions vamos começar a moldar ele para executar por exemplo uma tarefa de &lt;code&gt;mix format&lt;/code&gt; e uma tarefa de &lt;code&gt;mix test&lt;/code&gt; em um projeto &lt;code&gt;Elixir&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para evitar ter que instalar o &lt;code&gt;Elixir&lt;/code&gt; no processo de build, vamos utilizar o atributo &lt;code&gt;container&lt;/code&gt; para baixar uma imagem Docker já existente.&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Meu Workflow&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;container&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;elixir:1.10&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;jobs.&amp;lt;id-do-job&amp;gt;.container&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Em qual imagem Docker vai rodar as tarefas desse &lt;em&gt;job&lt;/em&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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;container&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;elixir:1.10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Agora que nosso ambiente já tem &lt;code&gt;Elixir&lt;/code&gt;, podemos criar as tarefas para executar o &lt;code&gt;mix format&lt;/code&gt; e &lt;code&gt;mix test&lt;/code&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Meu Workflow&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;container&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;elixir:1.10&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Formatar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix format --check-formatted&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Instalar as dependências&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix deps.get&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Testar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto já temos um &lt;em&gt;workflow&lt;/em&gt; que clona nosso repositório, verifica se nosso código está formatado de acordo com as configurações do projeto, instala as dependências e roda nossos testes.&lt;/p&gt;




&lt;h1&gt;
  
  
  Utilizando serviços
&lt;/h1&gt;

&lt;p&gt;O cenário anterior funciona perfeitamente para quando a gente tem um &lt;code&gt;lib&lt;/code&gt; escrita em &lt;code&gt;Elixir&lt;/code&gt;, mas para casos que a gente esteja trabalhando em um projeto com &lt;a href="https://www.phoenixframework.org/"&gt;Phoenix&lt;/a&gt; por exemplo, a gente vai precisar provavelmente conectar em um banco de dados para poder executar alguns testes.&lt;/p&gt;

&lt;p&gt;Nesse momento a gente consegue utilizar os &lt;em&gt;services&lt;/em&gt; para criar containers de um banco de dados &lt;a href="https://www.postgresql.org/"&gt;Postgres&lt;/a&gt;, por exemplo, para que os nossos &lt;em&gt;jobs&lt;/em&gt; possam ter onde se conectar.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;jobs.&amp;lt;id-do-job&amp;gt;.services&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres&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;postgres&lt;/span&gt;

    &lt;span class="c1"&gt;# Mapeia a porta 5432 no container Docker para a porta 5432 no container do Postgres&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;

    &lt;span class="c1"&gt;# Configura os dados de acesso ao banco de teste&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;usuario&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;senha&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;banco&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que o nosso &lt;em&gt;workflow&lt;/em&gt; vai criar o banco de dados pra gente poder conectar, tem um detalhe que temos que alterar nas nossas tarefas que vão rodar para conectar nesse banco. No caso, a nossa tarefa &lt;code&gt;mix test&lt;/code&gt; tem que receber uma variável de ambiente para poder conectar corretamente no banco criado pelo Actions.&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="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Testar&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix test&lt;/span&gt;
   &lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;POSTGRES_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
     &lt;span class="na"&gt;POSTGRES_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$❴❴ job.services.postgres.ports[5672] ❵❵&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O exemplo completo fica assim:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Meu Workflow&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;container&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;elixir:1.10&lt;/span&gt;

    &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;postgres&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;postgres&lt;/span&gt;

        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5432:5432&lt;/span&gt;

        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;usuario&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;senha&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;banco&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Formatar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix format --check-formatted&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Instalar as dependências&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix deps.get&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Testar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix test&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
          &lt;span class="na"&gt;POSTGRES_PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$❴❴ job.services.postgres.ports[5432] ❵❵&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora basta alterar as configurações da nosso ambiente de teste para receber utilizar as variáveis de ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="no"&gt;Config&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:meu_app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Meu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;adapter:&lt;/span&gt; &lt;span class="no"&gt;Ecto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Adapters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Postgres&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;username:&lt;/span&gt; &lt;span class="s2"&gt;"usuario"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;password:&lt;/span&gt; &lt;span class="s2"&gt;"senha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;database:&lt;/span&gt; &lt;span class="s2"&gt;"banco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;port:&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"POSTGRES_PORT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"5432"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="ss"&gt;hostname:&lt;/span&gt; &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"POSTGRES_HOST"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;pool:&lt;/span&gt; &lt;span class="no"&gt;Ecto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Adapters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Sandbox&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Docker Compose
&lt;/h1&gt;

&lt;p&gt;Se você já utiliza &lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt; nos seus projetos você não precisa criar os &lt;code&gt;services&lt;/code&gt; no arquivo do Actions e pode criar esses serviços direto no seu arquivo do Docker Compose de teste.&lt;/p&gt;

&lt;p&gt;Exemplo do arquivo &lt;code&gt;docker-compose-test.yml&lt;/code&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.3"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;meu_servico&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;meu_postgres&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4000:4000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MIX_ENV=test&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mix phx.server&lt;/span&gt;

  &lt;span class="na"&gt;postgres&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;postgres&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;meu_postgres&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=banco&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=usuario&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=senha&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5433:5432"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para rodar os testes com o Docker Compose, o ideal é mudar a imagem que roda no Actions para uma imagem que tenha já tenha o &lt;code&gt;compose&lt;/code&gt; instalado.&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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container&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;docker/compose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O exemplo completo fica assim:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Meu Workflow&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&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;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;container&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;docker/compose&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v1&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Formatar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-compose -f docker-compose-test.yml run meu_servico mix format --check-formatted&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Testar&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-compose -f docker-compose-test.yml run meu_servico mix test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Espero que tenha ajudado vocês a entender um pouco melhor como rodar projetos &lt;code&gt;Elixir&lt;/code&gt; no GitHub Actions. &lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>ci</category>
      <category>cd</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Adotando o Elixir na Ingresse</title>
      <dc:creator>Vitor Leal</dc:creator>
      <pubDate>Fri, 06 Mar 2020 20:26:57 +0000</pubDate>
      <link>https://dev.to/ingresse/adotando-o-elixir-na-ingresse-362m</link>
      <guid>https://dev.to/ingresse/adotando-o-elixir-na-ingresse-362m</guid>
      <description>&lt;p&gt;Com o crescimento acelerado da &lt;a href="https://www.ingresse.com/"&gt;Ingresse&lt;/a&gt; nos últimos anos, tivemos que reformular nossa arquitetura e infraestrutura inicial para poder escalar com essa demanda.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.ingresse.com/"&gt;Ingresse&lt;/a&gt; nasceu com uma base em &lt;code&gt;PHP&lt;/code&gt;, um &lt;a href="https://pt.wikipedia.org/wiki/Aplica%C3%A7%C3%A3o_monol%C3%ADtica"&gt;Monolito&lt;/a&gt; que atendeu bem o MVP e os primeiros anos do produto, mas com o passar do tempo acabou dificultando a evolução dele.&lt;/p&gt;

&lt;p&gt;No processo de reformulação da arquitetura em 2016 nasceram os primeiros serviços em &lt;code&gt;Python&lt;/code&gt; que resolveram bem os problemas para qual a linguagem foi escolhida. No início de 2017 quando estávamos com uma &lt;em&gt;stack&lt;/em&gt; com um misto de &lt;code&gt;PHP&lt;/code&gt; e &lt;code&gt;Python&lt;/code&gt; começamos a olhar para outras linguagens que nos ajudasse a escalar e aproveitar melhor todos os recursos disponíveis da nossa infra. Mas para essa linguagem a gente tinha um foco muito importante, ela tinha que ser &lt;em&gt;developer friendly&lt;/em&gt;, estávamos buscando uma linguagem que nos ajudasse na escalabilidade e performance mas principalmente na produtividade do nosso time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prova de conceito
&lt;/h1&gt;

&lt;p&gt;Para começar fizemos uma prova de conceito de um &lt;a href="https://www.redhat.com/pt-br/topics/microservices/what-are-microservices"&gt;microserviço&lt;/a&gt; novo implementando poucas &lt;em&gt;features&lt;/em&gt;, mas desenvolvendo as mesmas &lt;em&gt;features&lt;/em&gt; utilizando duas das linguagens que estávamos analisando. A idéia não era comparar só a performance do serviço entre essas duas linguagens, mas também, como é o dia a dia desenvolvendo com essas linguagens.&lt;/p&gt;

&lt;h1&gt;
  
  
  Escolhendo o Elixir
&lt;/h1&gt;

&lt;p&gt;Uma das linguagens escolhidas para o teste foi o &lt;a href="https://elixir-lang.org/"&gt;Elixir&lt;/a&gt;. Uma linguagem &lt;em&gt;open source&lt;/em&gt; criada pelo José Valim na Plataformatec, empresa recentemente adquirida pelo Nubank.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;Elixir&lt;/code&gt; é uma linguagem moderna que executa na Máquina Virtual &lt;a href="https://www.erlang.org/"&gt;Erlang&lt;/a&gt; (BEAM), conhecida por executar sistemas de baixa latência, distribuídos e tolerantes a falhas.&lt;/p&gt;

&lt;p&gt;Além disso tem uma comunidade muito ativa e frameworks para desenvolvimento web como o &lt;a href="https://www.phoenixframework.org/"&gt;Phoenix&lt;/a&gt; que tem foco em criar uma estrutura produtiva que não compromete a velocidade de desenvolvimento nem a manutenção.&lt;/p&gt;

&lt;p&gt;Alguns pontos altos do &lt;code&gt;Elixir&lt;/code&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  Instalação simples
&lt;/h4&gt;

&lt;p&gt;A instalação do &lt;code&gt;Elixir&lt;/code&gt; é muito simples, tem instalador para &lt;a href="https://elixir-lang.org/install.html#unix-and-unix-like"&gt;Linux&lt;/a&gt;, &lt;a href="https://elixir-lang.org/install.html#macos"&gt;Mac&lt;/a&gt;, &lt;a href="https://elixir-lang.org/install.html#windows"&gt;Windows&lt;/a&gt; e para quem prefere container como eu, imagens &lt;a href="https://elixir-lang.org/install.html#docker"&gt;Docker&lt;/a&gt; para não sujar seu ambiente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentação e conteúdo
&lt;/h4&gt;

&lt;p&gt;A &lt;a href="https://hexdocs.pm/elixir/Kernel.html"&gt;documentação&lt;/a&gt; é bem completa e fácil de navegar. O &lt;a href="https://elixir-lang.org/learning.html"&gt;site&lt;/a&gt; da linguagem aponta diversos materiais de leitura, cursos e &lt;em&gt;screencasts&lt;/em&gt; para quem quer começar. Tem muito material gerado pela comunidade, tanto aqui no &lt;a href="https://dev.to/search?q=elixir"&gt;Dev.to&lt;/a&gt; quanto no &lt;a href="https://medium.com/search?q=elixir"&gt;Medium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Um ótimo lugar para iniciar com conteúdo em português é o &lt;a href="https://elixirschool.com/pt/"&gt;ElixirSchool&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Gerenciador de pacotes
&lt;/h4&gt;

&lt;p&gt;Uma coisa que a gente espera em todas as linguagens modernas é um gerenciador de pacotes decente. E esse é o caso do &lt;a href="https://hex.pm/"&gt;Hex&lt;/a&gt;, um gerenciador de pacotes para as linguagens que compilam para rodar na Maquina Virtual do Erlang (BEAM).&lt;/p&gt;

&lt;h4&gt;
  
  
  Ferramenta de &lt;em&gt;build&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;O &lt;a href="https://hexdocs.pm/mix/Mix.html"&gt;Mix&lt;/a&gt; é uma ferramenta de &lt;em&gt;build&lt;/em&gt; que fornece &lt;em&gt;tasks&lt;/em&gt; para criar, compilar e testar projetos &lt;code&gt;Elixir&lt;/code&gt;, gerenciar suas dependências e muito mais. É uma ferramenta que facilita o dia a dia no desenvolvimento e nos processos de automatização.&lt;/p&gt;

&lt;h4&gt;
  
  
  Testes
&lt;/h4&gt;

&lt;p&gt;O &lt;a href="https://hexdocs.pm/ex_unit/ExUnit.html"&gt;ExUnit&lt;/a&gt; é um framework completo para testes no &lt;code&gt;Elixir&lt;/code&gt;. Totalmente integrado para ser executado com um simples &lt;code&gt;mix test&lt;/code&gt; e com capacidade de rodar os testes de forma assíncrona.&lt;/p&gt;

&lt;h4&gt;
  
  
  Produtividade
&lt;/h4&gt;

&lt;p&gt;A velocidade de desenvolvimento no &lt;code&gt;Elixir&lt;/code&gt; é muito boa. Tem um &lt;em&gt;syntax&lt;/em&gt; que é fácil escrever um código limpo e compreensível sem sacrificar a produtividade de um desenvolvedor.&lt;/p&gt;

&lt;h1&gt;
  
  
  Processo de mudança
&lt;/h1&gt;

&lt;p&gt;Hoje ainda temos microserviços em outras linguagens rodando em produção, simplesmente porque estão dando conta do recado. Já até pensamos em migrar alguns mas se ainda estão funcionando bem não tem porque mexer.&lt;/p&gt;

&lt;p&gt;Com o tempo o nosso time foi pegando pequenas tarefas para executar em &lt;code&gt;Elixir&lt;/code&gt; até sentirem que tinham o domínio na linguagem para poder dar manutenção e criar novos microserviços do zero. A troca de conhecimento entre as equipes é essencial para que esse tipo de mudança tenha sucesso.&lt;/p&gt;

&lt;p&gt;Com certeza não é um processo rápido adotar uma nova linguagem em produção, quando se tem uma quantidade enorme de acessos, mas acredito que os benefícios de ter uma linguagem moderna com um grande foco no desenvolvedor e na sua produtividade é um grande diferencial para a equipe e para o futuro da empresa.&lt;/p&gt;

&lt;p&gt;Um dos nossos desenvolvedores Backend escreveu um &lt;a href="https://dev.to/leonimella/entendendo-elixir-com-ajuda-de-php-20n2"&gt;post&lt;/a&gt; sobre &lt;code&gt;Elixir&lt;/code&gt;, com uma visão de quem veio do &lt;code&gt;PHP&lt;/code&gt;. Muito útil pra quem está tendo seu primeiro contato com a linguagem e com o paradigma funcional.&lt;/p&gt;

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

&lt;p&gt;Essa prova de conceito hoje se tornou um dos nossos principais serviços e está em produção desde o final de 2017.&lt;/p&gt;

&lt;p&gt;Ele é responsável por transacionar &lt;strong&gt;centenas de milhões de Reais&lt;/strong&gt; em ingressos todo ano, não só na &lt;a href="https://www.ingresse.com/"&gt;Ingresse&lt;/a&gt; mas em outras "tiqueteiras" do mercado que utilizam nossas API's. É um &lt;em&gt;Gateway&lt;/em&gt; de pagamentos, com múltiplos adquirentes e plataformas de pagamento integradas como &lt;code&gt;Cielo&lt;/code&gt;, &lt;code&gt;Stone&lt;/code&gt;, &lt;code&gt;Getnet&lt;/code&gt;, &lt;code&gt;PicPay&lt;/code&gt;, &lt;code&gt;StarkBank&lt;/code&gt;, &lt;code&gt;Iugu&lt;/code&gt; e &lt;code&gt;PayPal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hoje todos os nossos serviços novos são desenvolvidos em &lt;code&gt;Elixir&lt;/code&gt;. Até agora temos &lt;strong&gt;5&lt;/strong&gt; deles em produção e no momento mais &lt;strong&gt;3&lt;/strong&gt; sendo desenvolvidos em 2020.&lt;/p&gt;

&lt;p&gt;Se já trabalha com &lt;code&gt;Elixir&lt;/code&gt; ou estiver querendo aprender estamos sempre com &lt;a href="https://sobre.ingresse.com/vagas"&gt;vagas abertas&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>ingresse</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
