<?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: Emmanuel Barturen</title>
    <description>The latest articles on DEV Community by Emmanuel Barturen (@emmanuelbarturen).</description>
    <link>https://dev.to/emmanuelbarturen</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%2F511777%2Ff36613d0-bb7a-4f54-862f-c0e156b3e7bb.jpeg</url>
      <title>DEV Community: Emmanuel Barturen</title>
      <link>https://dev.to/emmanuelbarturen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emmanuelbarturen"/>
    <language>en</language>
    <item>
      <title>Nunca te pierdas una notificación de Pull request en github</title>
      <dc:creator>Emmanuel Barturen</dc:creator>
      <pubDate>Thu, 07 Jul 2022 02:10:47 +0000</pubDate>
      <link>https://dev.to/emmanuelbarturen/nunca-te-pierdas-una-notificacion-de-pull-request-en-github-40dg</link>
      <guid>https://dev.to/emmanuelbarturen/nunca-te-pierdas-una-notificacion-de-pull-request-en-github-40dg</guid>
      <description>&lt;p&gt;Muchas veces la cantidad de notificaciones de github suele ser un dolor de cabeza para enterarse de los pull request que otro miembro del equipo está esperando. Esta guía busca tener un camino para lograr la revisión de código en menor tiempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configura tu correo del trabajo en github
&lt;/h3&gt;

&lt;p&gt;Lo primero es separar las notificaciones de proyectos personales con las notificaciones de proyectos del trabajo antes que sea un caos.&lt;/p&gt;

&lt;p&gt;Vaya a &lt;a href="https://github.com/settings/emails"&gt;Configuración de correo electrónico en GitHub&lt;/a&gt; y agregue su correo electrónico de trabajo. Después de verificarlo, lo tendrá listo para usarlo.&lt;/p&gt;

&lt;p&gt;Ahora iremos a la &lt;a href="https://github.com/settings/notifications"&gt;configuración de notificaciones en GitHub&lt;/a&gt;, e iremos a la parte final en la sección &lt;em&gt;Custom routing&lt;/em&gt; donde podremos cambiar el correo donde llegarán las notificaciones de cada organización.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurar gmail
&lt;/h3&gt;

&lt;p&gt;Crear un filtro para los correos que vengan de &lt;em&gt;&lt;a href="mailto:notifications@github.com"&gt;notifications@github.com&lt;/a&gt;&lt;/em&gt; que contengan las palabras &lt;em&gt;requested your review&lt;/em&gt; como aparece a continuación. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X41shxD---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y5ppjy22e139h3q2bc5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X41shxD---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y5ppjy22e139h3q2bc5k.png" alt="Image description" width="880" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creado el filtro, seleccionamos aplicar etiqueta, creamos la etiqueta &lt;em&gt;github-pull-request&lt;/em&gt; y marcamos la categoría como notificaciones.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eoNqxes---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vdg92k9sycvqqfcjaw2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eoNqxes---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vdg92k9sycvqqfcjaw2g.png" alt="Image description" width="880" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurar extensión de Gmail para chrome
&lt;/h3&gt;

&lt;p&gt;Añadimos &lt;a href="https://chrome.google.com/webstore/detail/notifier-for-gmail/dcjichoefijpinlfnjghokpkojhlhkgl"&gt;Gmail notifier&lt;/a&gt;, en la sección &lt;strong&gt;Timings&lt;/strong&gt; es recomendable poner 15 minutos de recordatorio.&lt;/p&gt;

&lt;p&gt;La sección importante es &lt;strong&gt;Gmail&lt;/strong&gt; donde pondremos la etiqueta que creamos. En mi caso la cuenta principal es donde llegarán las notificaciones.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--djiQmB15--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9dkaijpvt7zye9ph62hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--djiQmB15--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9dkaijpvt7zye9ph62hs.png" alt="Image description" width="880" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurar notificaciones de cada proyecto en Github (opcional)
&lt;/h3&gt;

&lt;p&gt;Adicionalmente puedes configurar que repositorios están observados a &lt;a href="https://github.com/watching"&gt;notificaciones en github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>español</category>
      <category>pullrequest</category>
      <category>github</category>
    </item>
    <item>
      <title>Entrega continua con Bitbucket pipelines, Digital Ocean y Laravel</title>
      <dc:creator>Emmanuel Barturen</dc:creator>
      <pubDate>Tue, 03 May 2022 12:54:58 +0000</pubDate>
      <link>https://dev.to/emmanuelbarturen/entrega-continua-con-bitbucket-pipelines-digital-ocean-y-laravel-55a2</link>
      <guid>https://dev.to/emmanuelbarturen/entrega-continua-con-bitbucket-pipelines-digital-ocean-y-laravel-55a2</guid>
      <description>&lt;p&gt;En esta guía vamos a crear un autodeploy basado en los commits y pull request hace una rama.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Esta es una versión básica donde se sincroniza los nuevos archivos y modificados del repositorio bitbucket hacia digitalocean. Sin el uso de docker&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para este ejemplo vamos a tener 2 Droplets, uno para testing y otro para producción. Tengo bitbucket en lenguaje inglés&lt;/p&gt;

&lt;p&gt;Pasos que van a suceder&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Al actualizar la rama master vamos a copiar los archivos nuevos al droplet&lt;/li&gt;
&lt;li&gt;vamos a ejecutar un script que instale las dependencias, ejecutar el test, agregar los permisos correctos y otras tareas que necesitemos hacer &lt;/li&gt;
&lt;li&gt;Vamos a notificar por un canal de Slack cuando el despliegue se haya realizado&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Determinar ramas y entornos
&lt;/h2&gt;

&lt;p&gt;El primer paso es decidir que ramas se desplegarán en qué entorno. Para este ejemplo usaremos la siguiente configuración&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;Entorno&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;develop&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Rama para integrar los features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;master&lt;/td&gt;
&lt;td&gt;Stagging&lt;/td&gt;
&lt;td&gt;Entorno de testing / Pre-produción&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prod-v1&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Entorno de producción&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Habilitar Pipelines
&lt;/h2&gt;

&lt;p&gt;Ingresar a&lt;br&gt;
&lt;code&gt;Menu Repositorio -&amp;gt; Pipelines -&amp;gt; Starter Pipeline&lt;/code&gt;&lt;br&gt;
Visualizaremos la pantalla siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jm7hjqlhfztk9l7o7ar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jm7hjqlhfztk9l7o7ar.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuamos con el botón &lt;em&gt;Commit File&lt;/em&gt;. Esto creará un archivo llamado &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; en la raíz del proyecto para configurar el despligue.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;ES MUY IMPORTANTE NO PONER CUENTAS NI APIKEYS EN EL ARCHIVO bitbucket-pipelines.yml &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los datos sensibles los manejaremos por variables que explicaremos más adelante.&lt;/p&gt;
&lt;h2&gt;
  
  
  Autenticar Bitbucket con DigitalOcean
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Creamos un SSH ingresando a &lt;br&gt;
&lt;code&gt;Menu Repositorio -&amp;gt; Repository Settings-&amp;gt; Pipelines -&amp;gt; SSH Keys&lt;/code&gt;&lt;br&gt;
Veremos la siguiente pantalla&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6m0uj9b7ouhewnumm3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6m0uj9b7ouhewnumm3r.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Le damos click a &lt;strong&gt;Generate Keys&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ingresamos al droplet y abrimos el archivo de llaves autorizadas con el siguiente comando&lt;br&gt;
&lt;code&gt;nano ~/.ssh/authorized_keys&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copiamos la &lt;strong&gt;public key&lt;/strong&gt; que generamos en bitbucket y la pegamos en el archivo que abrimos en el droplet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pegamos el IP del droplet en el input &lt;strong&gt;Host address&lt;/strong&gt; y hacemos click en el botón &lt;strong&gt;Fetch&lt;/strong&gt;, esto generará un &lt;em&gt;fingerprint&lt;/em&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se habilitará el botón &lt;strong&gt;Add Host&lt;/strong&gt;, clickeamos y esto agregará el registro a bitbucket.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con estos pasos tenemos conectado vía SSH bitbucket con nuestro droplet Digital Ocean.&lt;/p&gt;
&lt;h2&gt;
  
  
  Configurar entornos
&lt;/h2&gt;

&lt;p&gt;En la siguiente dirección &lt;br&gt;
&lt;code&gt;Menu Repositorio -&amp;gt; Repository Settings-&amp;gt; Pipelines -&amp;gt; Deployments&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;encontraremos los entornos por default que son: Test, Staging y Production&lt;/p&gt;
&lt;h3&gt;
  
  
  variables de entorno
&lt;/h3&gt;

&lt;p&gt;Las variables de entorno son valores que sólo se pueden utilizar en el entorno que determinemos mediante la el atributo &lt;code&gt;Deployment&lt;/code&gt; del archivo bitbucket-pipelines.yml&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si necesitamos guardar variables globales para todos los entornos estos deben ir en la siguiente ruta&lt;br&gt;
&lt;code&gt;Menu Repositorio -&amp;gt; Repository Settings-&amp;gt; Pipelines -&amp;gt; Repository Variables&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para aprender más sobre variables puedes entrar &lt;a href="https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/" rel="noopener noreferrer"&gt;a este enlace&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para este ejemplo vamos a crear las siguientes variables&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH_USER&lt;/td&gt;
&lt;td&gt;nombre del usuario para la autenticación por SSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SERVER_IP&lt;/td&gt;
&lt;td&gt;IP del droplet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCRIPT_PATH&lt;/td&gt;
&lt;td&gt;Ruta en el droplet donde se encuentra el script que ejecutaremos luego de copiar los archivos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WEBHOOK_URL&lt;/td&gt;
&lt;td&gt;URL del webhook de Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fliu2665l7y22ezn2ommn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fliu2665l7y22ezn2ommn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Archivo bitbucket-pipelines.yml
&lt;/h2&gt;

&lt;p&gt;En internet y en bitbucket hay muchos ejemplos del uso de este archivo pero para lo que necesitamos explicaremos lo básico para su funcionamiento. La configuración que vamos a usar es la siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipelines:
  branches:
    master:
      - step:
          name: Deploy to droplet
          deployment: Staging
          script:
            - pipe: atlassian/rsync-deploy:0.7.0
              variables:
                USER: $SSH_USER
                REMOTE_PATH: '/var/www/app'
                LOCAL_PATH: '${BITBUCKET_CLONE_DIR}'
                SERVER: $SERVER_IP
                DEBUG: 'true'
            - pipe: atlassian/ssh-run:0.4.0
              variables:
                SSH_USER: $SSH_USER
                SERVER: $SERVER_IP
                COMMAND: $SCRIPT_PATH
            - pipe: atlassian/slack-notify:2.0.0
              variables:
                WEBHOOK_URL: $WEBHOOK_URL
                MESSAGE: '"Se ha desplegado correctemente la rama master en el entorno de stagging"'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Notarán que no hay image, ya que no uso docker no lo vi necesario ponerlo y evitar demorar por la descarga de la imagen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;branches&lt;/td&gt;
&lt;td&gt;nombre que agrupa las ramas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;step&lt;/td&gt;
&lt;td&gt;Paso que ejecuta una acción&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;
&lt;td&gt;Título del paso a ejecutar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deployment&lt;/td&gt;
&lt;td&gt;entorno del que se usarán las variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;script&lt;/td&gt;
&lt;td&gt;Grupo de acciones que se ejecutarán&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pipe&lt;/td&gt;
&lt;td&gt;Integración que facilita el uso de un servicio externo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Puedes encontrar muchas integraciones pipe en &lt;a href="https://bitbucket.org/product/features/pipelines/integrations" rel="noopener noreferrer"&gt;este enlace&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Configuración en el servidor (Droplet)
&lt;/h1&gt;

&lt;p&gt;Para este ejemplo crearemos la carpeta &lt;code&gt;app&lt;/code&gt; en la siguiente dirección &lt;code&gt;/var/www/app/&lt;/code&gt;. Dentro de esa carpeta crearemos dos archivos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; Archivo de variables de entorno que será copiado en cada despliegue&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deploy.sh&lt;/code&gt; script que se ejecutará después de tener copiados los archivos &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La estructura deberá quedar así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/
└───app
│   │   .env
│   │   deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Rsync
&lt;/h1&gt;

&lt;p&gt;Con las variables puestas correctamente rsync copiará los cambios en el servidor dentro de una carpeta llamada &lt;code&gt;build&lt;/code&gt; que si no existe la creará.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ejecutar bash en droplet
&lt;/h1&gt;

&lt;p&gt;Como segundo paso ejecutaré un comando en el servidor que me dejará la aplicación lista para ser usada.&lt;br&gt;
mi archivo se llamará &lt;code&gt;deploy.sh&lt;/code&gt; y este será el contenido&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

## Copiar archivo de variables de entorno dentro del proyecto
cp /var/www/app/.env /var/www/app/build/.env

## Ingresar a la carpeta del proyecto para ejecutar los
## siguientes comandos.
cd /var/www/app/build

## instalar composer 
composer install --no-interaction --no-progress --optimize-autoloader --no-dev

## Actualizar archivo de dependencias.
composer dump-autoload -n

php artisan migrate --seed --force

##  Asignar los permisos adecuados para un proyecto laravel
sudo chown -R $USER:www-data .
sudo find . -type f -exec chmod 664 {} \;
sudo find . -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  notificación a slack
&lt;/h1&gt;

&lt;p&gt;Finalmente con el webhook de un canal de slack se enviará la notificación cuando el proceso haya terminado&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
