<?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: Danilo Sampaio</title>
    <description>The latest articles on DEV Community by Danilo Sampaio (@arpesam).</description>
    <link>https://dev.to/arpesam</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%2F409470%2Fdb6aa7b2-c5d3-4319-8e41-482343c26685.png</url>
      <title>DEV Community: Danilo Sampaio</title>
      <link>https://dev.to/arpesam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arpesam"/>
    <language>en</language>
    <item>
      <title>Como integrar Rocket.chat e Codeship</title>
      <dc:creator>Danilo Sampaio</dc:creator>
      <pubDate>Tue, 06 Oct 2020 15:37:43 +0000</pubDate>
      <link>https://dev.to/arpesam/como-integrar-rocket-chat-e-codeship-55nm</link>
      <guid>https://dev.to/arpesam/como-integrar-rocket-chat-e-codeship-55nm</guid>
      <description>&lt;p&gt;Recentemente eu precisei configurar um CI para as nossas lambdas. Sempre fui acostumado a utilizar o Seed.run para essa função. Mas a empresa em que estou já possui uma conta no Codeship, e isso me veio como um desafio. Como utilizar o codeship para fazer o deploy de nossas lambdas? Isso foi até relativamente simples e esse post não é sobre isso.&lt;/p&gt;

&lt;p&gt;Esse post está relacionado a outro problema. Minha empresa não utiliza o Slack e sim o Rocket.chat para a comunicação entre os desenvolvedores. O Rocket.chat é um projeto open source, que conta com mais de 1000 desenvolvedores que contribuem para o projeto. Se você chegou até aqui, é bem provável que você já conheça a plataforma. O problema então é, &lt;strong&gt;como receber as notificações do Codeship no Rocket.chat de uma forma tão otimizada como acontece no Slack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eu vou ser bem suscinto na explicação. Na verdade se você ler as documentações vai ver que não é algo complexo, mesmo assim eu perdi um bom tempo tentando fazer essas configurações e meu objetivo é economizar esse seu tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rocket.chat
&lt;/h2&gt;

&lt;p&gt;Você precisa ser administrador do Rocket para fazer a configuração a seguir.&lt;/p&gt;

&lt;p&gt;Vá no painel de Administração (clique nos 3 pontinhos na coluna de comandos). Depois vá em &lt;strong&gt;Webhooks ou Intregrações&lt;/strong&gt;. Se nada aparecer, clique novamente, depois clique em &lt;strong&gt;Nova integração &amp;gt; Webhook Entrante&lt;/strong&gt;. Você verá a seguinte tela: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fXrfLtdR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x3js9j5baoptm34t5zbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fXrfLtdR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x3js9j5baoptm34t5zbu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui algumas opções vão aparecer. A primeira opção é para ativar o webhook, já ative clicando em &lt;strong&gt;Sim&lt;/strong&gt;. Preencha todos os campos que vão aparecer. Na opção Script ativado, deixe em &lt;strong&gt;false&lt;/strong&gt; por enquanto e depois clique em &lt;strong&gt;Salvar alterações&lt;/strong&gt;. O rocket chat tem um bug, ele só mostra a url do webhook depois que você clica em &lt;strong&gt;Salvar alterações&lt;/strong&gt;, por isso, clique e logo em seguida, saia da aba integrações e depois volte novamente para aba integrações e encontre o webhook que você acabou de criar, ao clicar nele, você verá que dois novos campos foram adicionados, &lt;strong&gt;Webhook URL e Token&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Copie a sugestão de Curl no campo abaixo de &lt;strong&gt;Example&lt;/strong&gt; e faça essa requisição para verificar se seu webhook está funcionando. Se não funcionar, sugiro que revise os passos anteriores.&lt;/p&gt;

&lt;p&gt;Copie a URL no campo &lt;strong&gt;Webhook URL&lt;/strong&gt;. Vamos precisar dele para adicionar ao webhook do Codeship. &lt;/p&gt;

&lt;h2&gt;
  
  
  Codeship
&lt;/h2&gt;

&lt;p&gt;No codeship, depois de logado, adicione o seu repositório git a lista de projetos no codeship. Eu não vou me ater a essa adição pois e bem simples. Depois de adicionado, clique no seu projeto e vá até &lt;strong&gt;Project Settings &amp;gt; Notifications&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É bem provável que nesse ponto, as notificações por email estejam ativadas, o que é bem chato, pois isso quer dizer que a cada deploy você receberá um email com o status do deploy, podendo receber até dois emails por deploy e por projeto. Mas esse é um side problem que nós vamos resolver de tabela, então já desative aí a opção de notificação por email.&lt;/p&gt;

&lt;p&gt;Agora, clique em &lt;strong&gt;+ Add&lt;/strong&gt;, algumas opções de integrações vão aparecer, se você usar o Slack, seus problemas terminam aqui, é extremamente simples integrar o Codeship com o Slack. Mas nesse ponto, escolha &lt;strong&gt;Webhook&lt;/strong&gt; pois nós queremos integrar com o Rocket.chat. Os campos abaixo deverão ser preenchidos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n_iYy5Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8q9hewd0wiejb6ecn8tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n_iYy5Vz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8q9hewd0wiejb6ecn8tu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No campo &lt;strong&gt;Webhook URL&lt;/strong&gt;, cole a URL que você copiou do Rocket.chat. Adicione no campo &lt;strong&gt;Branch&lt;/strong&gt; a branch na qual você deseja receber as notificações. A configuração de notificação é por branch, logo, para cada branch você precisa configurar o webhook. Você pode usar o mesmo webhook do Rocket.chat para todas as branchs. Após configurar, clique em &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se você ainda não tiver configurado o build do seu projeto no codeship, vá até a aba &lt;strong&gt;Deploy&lt;/strong&gt; e clique em &lt;strong&gt;Add Branch +&lt;/strong&gt;. Digite o mesmo nome da branch que você adicionou em notifications, daí escolha abaixo nos tipos de deploy o seu deploy preferido, ou &lt;strong&gt;Script&lt;/strong&gt;. Daí, digite o comando de deploy. No meu caso é &lt;code&gt;yarn deploy:staging&lt;/code&gt; pois estou configurando a branch de staging.&lt;/p&gt;

&lt;p&gt;Ok, até aqui é extremamente simples. O problema começa exatamente aqui. Se nesse ponto você fizer um deploy da branch staging, você não receberá nenhuma notificação no Rocket.chat. Isto porque o Rocket.chat obriga que enviemos uma requisição POST para o webhook com um payload especifico e o payload que o codeship envia não é compatível. Veja abaixo a diferença:&lt;/p&gt;

&lt;h3&gt;
  
  
  Payload esperado pelo Rocket.chat:
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "username": "Codeship",
  "icon_url": "https://i.imgur.com/ErQ2qCT.png",
  "text": "Example message",
  "attachments": [
    {
      "title": "Rocket.Chat",
      "title_link": "https://rocket.chat",
      "text": "Rocket.Chat, the best open source chat",
      "image_url": "/images/integration-attachment-example.png",
      "color": "#764FA5"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Payload enviado pelo Codeship:
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "build": {
    "build_url":"https://www.codeship.com/projects/10213/builds/973711",
    "commit_url":"https://github.com/codeship/docs/
                  commit/96943dc5269634c211b6fbb18896ecdcbd40a047",
    "project_id":10213,
    "build_id":973711,
    "status":"initiated",
    # PROJECT_FULL_NAME IS DEPRECATED AND WILL BE REMOVED IN THE FUTURE
    "project_full_name":"codeship/docs",
    "project_name":"codeship/docs",
    "commit_id":"96943dc5269634c211b6fbb18896ecdcbd40a047",
    "short_commit_id":"96943",
    "message":"Merge pull request #34 from codeship/feature/shallow-clone",
    "committer":"beanieboi",
    "branch":"master"
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;É aí que entra o pulo do gato. Nas configurações do Webhook do Rocket.chat, nós temos um campo chamado Script. É nele que nós vamos trabalhar para deixar fazer as notificações funcionarem. Volte ao Rocket.chat, na aba integrações novamente, encontre o webhook que você adicionou e vá até o campo scripts. Aqui você pode escrever código Jasvascript até a versão ES6. Esse campo script é usado exatamente para fazer essas conversões de payloads recebidos pelo webhook. Adicione a esse campo o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* exported Script */
/* globals console, _, s */

class Script {
  /**
   * @params {object} request
   */
  process_incoming_request({ request }) {
    const build = request.content.build || {}

    const colorEnum = {
      initiated: '#3492eb',
      error: '#e03a02',
      success: '#29d911',
      stopped: '#e03a02',
      waiting: '#3492eb',
      ignored: '#5e615e',
      blocked: '#f7ec4d',
      infrastructure_failure: '#e03a02',
    }

    const content = {
      username: 'Codeship',
      attachments: [{
        color: colorEnum[build.status],
        fields: [
          {
            short: false,
            title: `Build ${build.status}`,
            value: build.message,
          },
          {
            short: true,
            title: 'Branch',
            value: build.branch,
          },
          {
            short: true,
            title: 'Project',
            value: build.project_name,
          },
          {
            short: false,
            title: 'Committer',
            value: build.committer,
          },
          {
            short: false,
            title: 'Commit',
            value: build.commit_url,
          },
          {
            short: false,
            title: 'Build URL',
            value: build.build_url,
          },
        ],
      }]
    }

    return {
      content
    };
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Quando você envia um payload para o webhook do Rocket.chat, esse payload chega dentro do objeto &lt;code&gt;request.content&lt;/code&gt;. Perceba que o código acima simplesmente faz uma conversão do que foi enviado pelo Codeship para o payload esperado pelo Rocket.chat. E em &lt;code&gt;colorEnum&lt;/code&gt; você pode configurar as cores da notificação, baseado no status do build. Esse payload foi formatado levando em conta o formato da intergação que existe entre o Slack e o Codeship.&lt;/p&gt;

&lt;p&gt;Agora vá até o codeship, na lista de projetos, escolha o projeto que você configurou previamente e clique em &lt;strong&gt;Restart Build&lt;/strong&gt;. E Voialááá!!! você receberá no seu Rocket.chat, no canal que você adicionou na configuração do Webhook a notificação de deploy, enviada pelo Codeship.&lt;/p&gt;

&lt;p&gt;Caso tenha problemas, você pode testar fazendo uma requisição usando o seguinte Curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl \
  -X POST \
  -H 'Content-Type: application/json' \
  --url &amp;lt;URL DO SEU WEBHOOK&amp;gt; \
  -d '{
    "build": {
      "build_url":"https://www.codeship.com/projects/10213/builds/973711",
      "commit_url":"https://github.com/codeship/docs/commit/96943dc5269634c211b6fbb18896ecdcbd40a047",
      "project_id":10213,
      "build_id":973711,
      "status":"initiated",
      "project_full_name":"codeship/docs",
      "project_name":"codeship/docs",
      "commit_id":"96943dc5269634c211b6fbb18896ecdcbd40a047",
      "short_commit_id":"96943",
      "message":"Merge pull request #34 from codeship/feature/shallow-clone",
      "committer":"beanieboi",
      "branch":"master"
    }
  }'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Espero que a informação seja útil, qualquer adição, por favor informe nos comentários.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.rocket.chat/guides/administrator-guides/integrations"&gt;Documentação do Rocket.chat sobre o webhook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://documentation.codeship.com/general/projects/notifications/"&gt;Documentação do Codeship sobre notificações&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>codeship</category>
      <category>rocketchat</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
