<?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: Álvaro A. Quirós López</title>
    <description>The latest articles on DEV Community by Álvaro A. Quirós López (@alo).</description>
    <link>https://dev.to/alo</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%2F175044%2Fc16ee248-6d71-4021-9956-10bb429bb008.png</url>
      <title>DEV Community: Álvaro A. Quirós López</title>
      <link>https://dev.to/alo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alo"/>
    <language>en</language>
    <item>
      <title>Runnerty y Cypress para comprobar que tu app está online</title>
      <dc:creator>Álvaro A. Quirós López</dc:creator>
      <pubDate>Wed, 21 Apr 2021 09:22:08 +0000</pubDate>
      <link>https://dev.to/runnerty/runnerty-y-cypress-para-comprobar-que-tu-app-esta-online-4pl8</link>
      <guid>https://dev.to/runnerty/runnerty-y-cypress-para-comprobar-que-tu-app-esta-online-4pl8</guid>
      <description>&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%2Fmu9rqsovoryrjinacmxv.JPG" 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%2Fmu9rqsovoryrjinacmxv.JPG" alt="YDXJ0351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/runnerty/runnerty-and-cypress-to-check-that-your-app-is-online-193c1f7712e7" rel="noopener noreferrer"&gt;Do you want to read this article in English?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cypress es una herramienta para hacer tests e2e que ha revolucionado el panorama de los tests que ha conseguido facilitar la configuración, escritura, ejecución y depuración de este tipo de tests.&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%2Fp14n1bkjnc6keig7nrca.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%2Fp14n1bkjnc6keig7nrca.png" alt="image3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Qué vamos a ver en este artículo?
&lt;/h2&gt;

&lt;p&gt;Vamos a ver cómo podemos desarrollar unos tests con Cypress y planificarlos con Runnerty para chequear el estado de nuestra app o web. &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%2Fsxblt45z0y0rauj443rq.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%2Fsxblt45z0y0rauj443rq.png" alt="Runnerty y Cypress logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para quien no lo conozca, &lt;a href="https://runnerty.io" rel="noopener noreferrer"&gt;Runnerty&lt;/a&gt;, es una tecnología "low code" que permite integrar y automatizar aplicaciones online &amp;amp; offline, infraestructura de sistemas y servicios con terceros de manera simple, rápida y segura, creando flujos de trabajo y ofreciendo una nueva forma de desarrollar.&lt;/p&gt;

&lt;p&gt;Si quieres saber un poco más acerca de por qué deberías usarlo, aquí te dejo este &lt;a href="https://dev.to/runnerty/por-que-usar-runnerty-3ce1"&gt;post&lt;/a&gt; 👀.&lt;/p&gt;
&lt;h2&gt;
  
  
  Show me the code!
&lt;/h2&gt;

&lt;p&gt;En la web de Cypress podemos encontrar documentación y casos de ejemplo muy útiles, os dejo enlace para que le echéis un ojo, muy interesante: &lt;a href="https://docs.cypress.io/guides/getting-started/writing-your-first-test" rel="noopener noreferrer"&gt;https://docs.cypress.io/guides/getting-started/writing-your-first-test&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Nosotros vamos a ejecutarlo directamente desde un proyecto de Runnerty, para dejarlo listo y planificado para que se lance cada X horas contra nuestra web en producción 😎.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;En primer lugar vamos a crear el proyecto de Runnerty&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx runnerty-cli new runnerty-cypress-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔎 Nota: Antes de continuar, yo siempre enlazo mis proyectos de Runnerty con la plataforma, para gestionarlo desde ahí.&lt;br&gt;
Solo entras en &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Runnerty Platform&lt;/a&gt;, creas el proyecto y copias el API key generado en nuestro archivo &lt;strong&gt;config.json&lt;/strong&gt;, es muy sencillo (y gratis, claro 😉).&lt;/p&gt;

&lt;p&gt;Una vez creado el proyecto, usamos el CLI de Runnerty para añadirle Cypress:&lt;/p&gt;

&lt;p&gt;Desde dentro de nuestro proyecto ejecutamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx runnerty-cli add @runnerty/executor-cypress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto nos habrá dejado el proyecto listo para empezar a usar Cypress y un Workflow de ejemplo de Runnerty con los procesos de ejemplo listos para probar. &lt;/p&gt;

&lt;p&gt;También nos habrá creado un script en nuestro &lt;strong&gt;package.json&lt;/strong&gt; para ejecutar Cypress.&lt;/p&gt;

&lt;p&gt;Nuestros tests están en la carpeta por defecto que Cypress crea para sus tests. Dentro tendremos los 2 tests creados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./cypress/integration/sample-a.spec.js
./cypress/integration/sample-a.spec.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos tests, como veis, son extremadamente sencillos, aunque no estemos muy acostumbrados podremos saber qué hacen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Runnerty IO Home Test A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;beforeEach&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="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&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;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Should have a h1 with the text "Log in" [A-1]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Log in&lt;/span&gt;&lt;span class="dl"&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;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Should fail (Fail forced) [A-2]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#mat-input-0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#mat-input-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
   &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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;Lo "único" que hacen estos tests es conectarse a &lt;a href="//app.runnerty.io"&gt;app.runnerty.io&lt;/a&gt;, variable que, por cierto, está definida en el archivo &lt;strong&gt;cypress.json&lt;/strong&gt; y en el primer bloque comprueba la página tiene un un 'h1' con el texto 'Log in' y un segundo caso que después de escribir en el campo usuario y contraseña falla intencionadamente con un&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos probar nuestros tests con Cypress con el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run cypress:open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veremos 2 test de ejemplo desde la consola de Cypress&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%2Fnsg9e0rch7cnoqdw9nuc.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%2Fnsg9e0rch7cnoqdw9nuc.png" alt="Captura de pantalla 2021-04-06 a las 15.00.30"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez lanzados desde esta consola, podremos ver su ejecución:&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%2Fu805en1qhv96jcdqvmmv.gif" 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%2Fu805en1qhv96jcdqvmmv.gif" alt="runnerty-cypress"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Planificar tests con Runnerty
&lt;/h2&gt;

&lt;p&gt;🔎 Nota: Para quien no esté familiarizado con la sintaxis de Runnerty, os recomiendo este &lt;a href="https://dev.to/runnerty/como-empezar-a-usar-runnerty-3ki0"&gt;artículo de introducción.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nosotros "simplemente" vamos a aprovechar estos tests y meterlos en la planificación de Runnerty. El CLI de Runnerty ya nos ha creado un plan de ejemplo &lt;strong&gt;plan_executor-cypress_sample.json&lt;/strong&gt; con 2 procesos para ejecutar los 2 tests, solo tenemos que copiarlo y pegarlos en nuestro &lt;strong&gt;plan.json&lt;/strong&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"processes"&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="s2"&gt;"CYPRESS_SIMPLE_SPEC_B_TEST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CYPRESS SIMPLE SPEC B TEST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="s2"&gt;"cypress_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./cypress/integration/sample-b.spec.js"&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;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="s2"&gt;"CYPRESS_SIMPLE_INTEGRATION_TESTS_1_FAIL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CYPRESS SIMPLE INTEGRATION TESTS 1 FAIL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"depends_process"&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="s2"&gt;"CYPRESS_SIMPLE_SPEC_B_TEST"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="s2"&gt;"cypress_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chrome"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"config"&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;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También vamos a cambiar el scheduler para que se ejecute cada hora, no hace falta que se ejecuten todos los tests cada minuto 😉.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;triggers&lt;/span&gt;&lt;span class="dl"&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;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;schedule_default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;schedule_interval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0 */1 * * *&lt;/span&gt;&lt;span class="dl"&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;🤔 Recuerda conectar el proyecto con &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Runnerty Platform&lt;/a&gt; para poder ejecutar la cadena desde ahí y ver qué ha pasado. &lt;/p&gt;

&lt;p&gt;Ya solo tenemos que arrancar Runnerty 🎉&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&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%2Fldg1kpqgr57efnhj8zmu.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%2Fldg1kpqgr57efnhj8zmu.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora podemos entrar en &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Runnerty Platform&lt;/a&gt;, seleccionar nuestro proyecto, ir al listado de cadenas y forzar que se lancen nuestros tests (para no esperar a la siguiente hora a que se ejecuten).&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%2F1lljb7ff0is32y7af7pe.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%2F1lljb7ff0is32y7af7pe.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y veremos cómo se van ejecutando nuestros tests cada hora o cada vez que los lancemos nosotros manualmente.&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%2Fgjnuplvqhak2axkzmyap.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%2Fgjnuplvqhak2axkzmyap.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si entramos al detalle, veremos que el primer test ha pasado correctamente pero que el segundo ha fallado (intencionadamente).&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Con Runnerty podemos automatizar nuestros tests de Cypress para tener control en todo momento de que nuestra plataforma no tiene ningún problema. &lt;/p&gt;

&lt;p&gt;Os dejo este repo para que os lo descargáis y con un &lt;strong&gt;npm start&lt;/strong&gt; veréis que cada 5 min tenéis runnerty.io funcionando 🚀.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/alo/runnerty-cypress" rel="noopener noreferrer"&gt;https://github.com/alo/runnerty-cypress&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y ahora?
&lt;/h2&gt;

&lt;p&gt;Te animo a que le eches un ojo y si te parece interesante puedes apoyarnos en &lt;a href="https://github.com/runnerty/runnerty" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐️ o mandarnos un mensaje por &lt;a href="https://twitter.com/runnerty_io" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  enjoy
&lt;/h1&gt;

</description>
      <category>lowcode</category>
      <category>automation</category>
      <category>javascript</category>
      <category>workflow</category>
    </item>
    <item>
      <title>¡La versión 3 de Runnerty ya está disponible!</title>
      <dc:creator>Álvaro A. Quirós López</dc:creator>
      <pubDate>Tue, 16 Mar 2021 08:30:40 +0000</pubDate>
      <link>https://dev.to/runnerty/runnerty-v3-2lf7</link>
      <guid>https://dev.to/runnerty/runnerty-v3-2lf7</guid>
      <description>&lt;p&gt;Tras 1 año de desarrollo, lanzamos al mundo una nueva versión de Runnerty, la versión 3. Un año de desarrollo da para mucho y más si está en las manos de nuestro CTO, &lt;a href="https://twitter.com/ccarmona"&gt;Carlos Carmona&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/runnerty/version-3-of-runnerty-now-available-2e16cb5cab76"&gt;English version here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teníamos varias líneas de desarrollo abiertas, queríamos refactorizar algunas funcionalidades completamente, hacer ese código más legible en algunos puntos, más modular en otros y optimizarlo, queríamos sacar nuevas funcionalidades, pero, sobre todo, queríamos hacerlo más low code, más fácil para nosotros, los desarrolladores. Sin olvidar que Runnerty gestiona millones de procesos diarios, ¡no queremos ~muchos~ breaking changes!&lt;/p&gt;

&lt;p&gt;Puedes &lt;a href="https://runnerty.io"&gt;empezar a utilizar Runnerty ahora&lt;/a&gt; y comenzar a desarrollar sus flujos de trabajo y tener su sistema supervisado y bajo control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactor y optimización
&lt;/h2&gt;

&lt;p&gt;Todavía teníamos algún Async / Await pendiente… probar y actualizar nuestras dependencias, y de paso darle un repaso al código en general, ver que todo está bonito. &lt;br&gt;
Hemos desarrollado esos tests que faltaban y aprovechamos para mejorar el rendimiento en algunos puntos que teníamos identificados (y en algunos que no ☺️)&lt;/p&gt;

&lt;p&gt;De paso hemos introducido &lt;a href="https://synk.io/"&gt;Synk&lt;/a&gt; como herramienta para el monitoreo de seguridad de código, llevábamos probándola hace un tiempo y nos ha parecido útil para el proyecto. &lt;/p&gt;
&lt;h2&gt;
  
  
  Nuevas funcionalidades
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Intérprete
&lt;/h3&gt;

&lt;p&gt;Runnerty está provisto de un intérprete que permite ejecutar funciones sobre cualquier dato que intervenga en el flujo, operaciones con fechas, matemáticas, criptográficas o incluso operación de evaluación que suelen utilizarse en la definición de dependencias complejas, pues en esta nueva versión, hemos optimizado nuestro intérprete y hemos añadido un par de funciones nuevas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UUID (v1-5)&lt;/li&gt;
&lt;li&gt;HTML ESCAPE/UNESCAPE&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Calendarios
&lt;/h3&gt;

&lt;p&gt;Hemos mejorado el completo sistema de calendarios, que permiten que nuestros workflows tengan por ejemplo en cuenta los festivos. Hemos mejorado el acceso, lectura y parseo de calendarios ICS y hemos añadido acceso vía URL a los mismos. &lt;/p&gt;
&lt;h3&gt;
  
  
  Outputs de procesos
&lt;/h3&gt;

&lt;p&gt;El tratamiento de los datos de salida de un proceso es algo muy interesante a la hora de definir nuestros flujos de trabajo, pues te permiten preparar la entrada para el siguiente proceso. En Runnerty V3, ahora tenemos la posibilidad de filtrar y ordenar la salida de un proceso directamente en su planificación 🤩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HaUOo8V3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r315j1rhj72u499gt0xe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HaUOo8V3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r315j1rhj72u499gt0xe.png" alt="Output de procesos"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Namespaces
&lt;/h3&gt;

&lt;p&gt;Para contextualizar nuestras cadenas. Ahora podemos hacer que Runnerty lance sólo los workflows de un determinado &lt;strong&gt;Namespace&lt;/strong&gt; o al revés, excluyendo uno o varios Namespaces. También en Runnerty Platform tendrá funcionalidades de filtrado por Namespace para visualizar solo las que te interesen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;runnerty &lt;span class="nt"&gt;--namespace&lt;/span&gt; SALES,DWH
runnerty &lt;span class="nt"&gt;--exclude_namespace&lt;/span&gt; EXPERIMENTAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Metadatos en las cadenas
&lt;/h3&gt;

&lt;p&gt;Metadatos para especificar información relevante de la cadena. Muy interesante para el mantenimiento de cualquier plataforma, si una cadena falla, ¿a quién llamo?, ¿puedo volver a lanzarla?, ¿es prioritaria?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MDy5e7w7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7cguu82yavvhqbg9ibg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MDy5e7w7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7cguu82yavvhqbg9ibg5.png" alt="Metadatos en cadena"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--axuDDB0i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idazc9a7vq9w1bgs750c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--axuDDB0i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idazc9a7vq9w1bgs750c.png" alt="Metadatos en Runnerty Platform"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mejoras para el desarrollo con Runnerty
&lt;/h2&gt;

&lt;p&gt;Pero bueno, aquí es donde realmente vamos a notar la diferencia, no hay duda. &lt;/p&gt;

&lt;h3&gt;
  
  
  Mejoras en la documentación
&lt;/h3&gt;

&lt;p&gt;Todo empieza por la documentación. Primero hemos cambiado la herramienta que usábamos para documentar, necesitábamos ser más ágiles en este sentido, ahora usamos &lt;a href="https://docusaurus.io/"&gt;Docusaurus&lt;/a&gt;, y nos encanta. Ahora lo tenemos más fácil y de paso hemos añadido versionado de documentación, podéis echarle un vistazo &lt;a href="https://docs.runnerty.io/"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hemos intentado hacerla más clara y precisa. En muchos casos hemos introducido ejemplos y le estamos dando caña al blog para que haya más y más casos de uso.&lt;/p&gt;

&lt;p&gt;Si quieres echarnos una mano, suscríbete y comparte, ¡nos ayuda un montón!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mejoras en los mensajes
&lt;/h2&gt;

&lt;p&gt;Mensajes de error y avisos más claros (y más bonitos)&lt;br&gt;
Nuestro cli nos va a avisar si hay una versión de Runnerty más reciente y si hay alguna incompatibilidad con la versión de NodeJS. Además hemos mejorado algunos mensajes para que sean más descriptivos, por ejemplo, si intentamos forzar la ejecución de una cadena que no existe. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OsvJGDBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ea8szw741zhgz75hv3mx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OsvJGDBH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ea8szw741zhgz75hv3mx.png" alt="New Runnerty version available"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZNdqsnMW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5a6tmx6rk66pjf9meibl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZNdqsnMW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5a6tmx6rk66pjf9meibl.png" alt="Incompatible NodeJS version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Scaffolds 🔥
&lt;/h2&gt;

&lt;p&gt;Pero, lo que para mí es un “game changer”, la introducción de scaffolds. Ahora, a través del CLI de Runnerty, podrás añadir módulos a tu proyecto.&lt;/p&gt;

&lt;p&gt;Nota: Recuerda que puedes instalar runnerty-cli o usarlo directamente con npx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -g runnerty runnerty-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Creamos nuestro proyecto de Runnerty
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx runnerty-cli new my-awesome-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Para usar los scaffolds, simplemente ejecuta el commando add de nuestro cli y el módulo que quieres instalar, vamos a ver un ejemplo con Cypress
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx runnerty-cli add @runnerty/executor-cypress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y nuestro proyecto tendrá el módulo instalado en nuestro package.json, con un ejemplo de configuración en nuestro config.json y un workflow de ejemplo para incluirlo en nuestros workflows 😎&lt;/p&gt;

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

&lt;p&gt;Con Runnerty, Runnerty CLI y este módulo de Cypress, podemos tener nuestra web o plataforma monitorizada en cuestión de pocos minutos 🪄, ¡os debo ese post demostrándolo! &lt;/p&gt;

&lt;p&gt;Espero que lo disfrutéis y ya sabéis, ¡estamos encantados de recibir vuestro feedback!&lt;/p&gt;

&lt;p&gt;Si os ha interesado y queréis saber cómo empezar a usar Runnerty, &lt;a href="https://dev.to/runnerty/como-empezar-a-usar-runnerty-3ki0"&gt;aquí&lt;/a&gt; os dejo un artículo que escribimos hace unos días.&lt;/p&gt;

&lt;h1&gt;
  
  
  Enjoy
&lt;/h1&gt;

</description>
      <category>workflow</category>
      <category>javascript</category>
      <category>procesos</category>
      <category>node</category>
    </item>
    <item>
      <title>¿Cómo empezar a usar Runnerty?</title>
      <dc:creator>Álvaro A. Quirós López</dc:creator>
      <pubDate>Thu, 11 Feb 2021 19:32:21 +0000</pubDate>
      <link>https://dev.to/runnerty/como-empezar-a-usar-runnerty-3ki0</link>
      <guid>https://dev.to/runnerty/como-empezar-a-usar-runnerty-3ki0</guid>
      <description>&lt;p&gt;Runnerty es una tecnología "low code" que permite integrar y automatizar aplicaciones online &amp;amp; offline, infraestructura de sistemas y servicios con terceros de manera simple, rápida y segura, creando flujos de trabajo y ofreciendo una nueva forma de desarrollar.&lt;/p&gt;

&lt;p&gt;Si quieres saber un poco más acerca de por qué deberías &lt;del&gt;probarlo&lt;/del&gt; usarlo, aquí te dejo este &lt;a href="https://dev.to/runnerty/por-que-usar-runnerty-3ce1"&gt;post&lt;/a&gt; 👀. &lt;/p&gt;

&lt;p&gt;En este artículo vamos a ver algunos conceptos básicos de Runnerty, como crear nuestro primer proyecto y cómo conectarnos con "&lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;&lt;em&gt;Runnerty Platform&lt;/em&gt;&lt;/a&gt;". &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Algunos conceptos básicos&lt;/li&gt;
&lt;li&gt;Crear nuestro primer proyecto Runnerty&lt;/li&gt;
&lt;li&gt;Estructura del proyecto&lt;/li&gt;
&lt;li&gt;Conectar con Runnerty Platform 🚀&lt;/li&gt;
&lt;li&gt;Lanzar nuestro primer proceso&lt;/li&gt;
&lt;li&gt;Extra ball: Añadir un segundo proceso y visualizarlo en la plataforma. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Conceptos básicos 📕
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cadenas o workflows
&lt;/h3&gt;

&lt;p&gt;Son una agrupación de procesos que tienen sentido en un determinado contexto. Esto puede ser tan amplio como que puedes crear una cadena para comprobar que tu web está online, crear una cadena para recoger los pedidos de tu e-commerce y comunicarlos al proveedor que corresponda o crear cadenas de ETL para tu Data Warehouse. Runnerty nos brinda muchas funcionalidades que harán que definir estos &lt;strong&gt;workflows&lt;/strong&gt; sea súper ágil y totalmente escalable, definir dependencias entre complejos, pasar valores de unos a otros o incluso evaluarlos para decidir qué “camino seguir” son solo algunas de sus posibilidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔨 Ejecutores
&lt;/h3&gt;

&lt;p&gt;Cada uno de los procesos de nuestra cadena, ejecutará una acción específica a través de estos módulos. Podemos usar ejecutores muy genéricos, como el de Shell, que te permite ejecutar cualquier comando por consola u otros muy específicos que nos permiten realizar acciones muy concretas, como por ejemplo comunicarnos con una empresa de reparto como MRW o Fedex.&lt;/p&gt;

&lt;h3&gt;
  
  
  📢 Notificadores
&lt;/h3&gt;

&lt;p&gt;Como su propio nombre indica, nos van a mantener informados en todo momento, cuando empieza o acaba una cadena o un proceso concreto, si se está reintentando o si ha fallado. Podemos mandar un correo, un sms o mensaje por Telegram o conectarlo directamente con nuestro sistema de incidencias. &lt;/p&gt;

&lt;h3&gt;
  
  
  🏁 Triggers
&lt;/h3&gt;

&lt;p&gt;Estos módulos se encargan de lanzar nuestros workflows. Puede ser algo planificado, puede ser cuando se reciba un archivo en un ftp ...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; 🔎: Ejecutores, notificadores y triggers son módulos, puedes desarrollar los tuyos muy fácilmente para que puedas llevar el potencial de Runnerty a donde quieras. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. No te lo cuento, te lo enseño 👩‍💻👨‍💻
&lt;/h2&gt;

&lt;p&gt;Lo único que necesitamos antes de empezar es tener instalada la versión LTS de NodeJS (V 14+). Si no la tienes, puedes descargártela &lt;a href="https://nodejs.org/es/download/" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runnerty
&lt;/h3&gt;

&lt;p&gt;Lo primero, es instalar Runnerty como paquete global&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; runnerty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez instalado, podemos crear nuestro primer proyecto Runnerty&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;runnerty new my-awesome-project
&lt;/code&gt;&lt;/pre&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%2Fi%2Ff7nwooqclp2q6m38qm4k.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%2Fi%2Ff7nwooqclp2q6m38qm4k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎉 ¡Ya tenemos nuestro primer proyecto Runnerty!&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Estructura de nuestro proyecto 🔎
&lt;/h2&gt;

&lt;p&gt;Es un proyecto muy sencillo, vamos a centrarnos en los 2 archivos básicos de Runnerty:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;config.json&lt;/li&gt;
&lt;li&gt;plan.json&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Config
&lt;/h3&gt;

&lt;p&gt;En el &lt;strong&gt;config.json&lt;/strong&gt; vamos a tener 3 secciones donde iremos añadiendo las configuraciones de nuestros 3 tipos de módulos (triggers, notificadores y ejecutores). Los que ves en el ejemplo son solo un identificador y un nombre para usarlo en nuestros workflows, en caso de que el módulo necesitara algún dato más, aquí sería donde se lo indicaríamos, como por ejemplo una cuenta de correo, un usuario y contraseña, etc.&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;"triggers"&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="s2"&gt;"schedule_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@runnerty-trigger-schedule"&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;"executors"&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="s2"&gt;"shell_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@runnerty-executor-shell"&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;"notifiers"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@runnerty-notifier-console"&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;h3&gt;
  
  
  Plan
&lt;/h3&gt;

&lt;p&gt;En el plan es donde definimos nuestros workflows 😎&lt;br&gt;
Podemos ver varias secciones:&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;"chains"&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="s2"&gt;"CHAIN_ONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chain one sample"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"triggers"&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="err"&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;"notifications"&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="err"&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;"defaults_processes"&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="err"&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;"processes"&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="err"&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="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;h4&gt;
  
  
  Cadenas (chains)
&lt;/h4&gt;

&lt;p&gt;Dentro de cada cadena, además de un nombre y una identificación, tendremos 4 secciones&lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Triggers&lt;/strong&gt;, lo que dispara nuestro workflow, en este caso hemos usado el plugin planificador y hemos configurado  que se ejecute el proceso cada minuto.&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"triggers"&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="s2"&gt;"schedule_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"schedule_interval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*/1 * * * *"&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="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; 🔎: Este módulo usa nomenclatura cron estándar.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Notificadores&lt;/strong&gt;, Las notificaciones propias de nuestra workflow, en este caso vemos que nos va a avisar cuando empiece la cadena, cuando termine y si falla.&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"notifications"&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;"on_start"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') START OF THE CHAIN: @GV(CHAIN_ID)"&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;"on_end"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') END OF THE CHAIN: @GV(CHAIN_ID)"&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;"on_fail"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') FAIL OF THE CHAIN: @GV(CHAIN_ID)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&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="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; 🔎: Ya podemos ver algunas funciones propias de Runnerty, como &lt;code&gt;GETDATE()&lt;/code&gt; que nos va a devolver la fecha con la máscara que definamos o la de &lt;code&gt;GV (get value)&lt;/code&gt; que en este caso nos va a devolver el identificador de la cadena. Hay muchos más, aquí te dejo enlace a la &lt;a href="https://docs.runnerty.io/values" rel="noopener noreferrer"&gt;documentación&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;3 - &lt;strong&gt;Defaults&lt;/strong&gt; (opcional). Muchas veces es muy útil definir unos valores por defecto para todos los procesos, para eso tenemos esta sección. Todos los procesos por defecto tendrán estas notificaciones configuradas, aunque siempre podemos sobrescribirlas dentro del propio proceso.&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;"defaults_processes"&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;"notifications"&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;"on_start"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') START: PROCESS @GV(PROCESS_ID)"&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;"on_fail"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') ERROR: PROCESS @GV(PROCESS_ID): @GV(PROCESS_EXEC_ERR_OUTPUT)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&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;"on_end"&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="s2"&gt;"console_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@GETDATE('YYYY-MM-DD HH:mm:ss') END: PROCESS @GV(PROCESS_ID)"&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;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 - Procesos&lt;/p&gt;

&lt;p&gt;La propiedades más comunes que podemos ver dentro de un proceso (además de su nombre y su identificador), son las siguientes propiedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exec &lt;/li&gt;
&lt;li&gt;output
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"processes"&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="s2"&gt;"PROCESS_ONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process One"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="err"&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;"output"&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="err"&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="err"&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.1 - La propiedad &lt;strong&gt;exec&lt;/strong&gt; donde vamos a indicar qué ejecutor de nuestro config.json queremos usar y donde vamos a indicarle los valores necesarios  para que se ejecute. En este caso, como vamos a usar el ejecutor de Shell, solo necesitamos indicarle el comando que queremos que ejecute.&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="err"&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="s2"&gt;"PROCESS_ONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process One"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="s2"&gt;"shell_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo Runnerty: hello world!"&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;"output"&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="err"&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="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.2 - La propiedad &lt;strong&gt;output&lt;/strong&gt;, donde tratamos la salida del proceso. En este ejemplo vamos a escribir en un fichero de log el resultado de la ejecución.&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="s2"&gt;"PROCESS_ONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process One"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="err"&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;"output"&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;"file_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./@GETVALUE(PROCESS_ID).log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"write"&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="s2"&gt;"EXECUTION @GV(PROCESS_ID) - AT @GETDATE('YYYY-MM-DD HH:mm:ss')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; @GV(PROCESS_EXEC_ERR_OUTPUT) @GV(PROCESS_EXEC_MSG_OUTPUT)"&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;"concat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"maxsize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10mb"&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="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; 🔎: Es interesante saber que puedes definir el tamaño máximo de tu archivo de log y evitar así problemas de espacio.&lt;/p&gt;

&lt;p&gt;4.3 - Como comentamos antes, también podemos configurarle notificaciones concretas para este proceso, por ahora vamos a dejar esta propiedad vacía porque tenemos las notificaciones por defecto configuradas.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Conectar con &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Runnerty Platform&lt;/a&gt; 🚀
&lt;/h2&gt;

&lt;p&gt;Vamos a conectar nuestro proyecto con Runnerty Platform para que sea más sencilla la visualización y podamos sacarle el máximo rendimiento a Runnerty. Este paso es opcional, pero te lo recomiendo, vas a disfrutar Runnerty mucho más 😊🔥.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Nos logeamos en la plataforma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creamos el proyecto, seleccionando la opción &lt;code&gt;Nuevo proyecto&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Simplemente añadimos el &lt;code&gt;API Key&lt;/code&gt; generado a nuestro archivo config.json
&lt;/li&gt;
&lt;/ol&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;"general"&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;"runnerty.io"&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;"apikey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NUESTRO_TOKEN"&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;"triggers"&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="nl"&gt;"executors"&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="nl"&gt;"notifiers"&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;So simple 😊! &lt;/p&gt;

&lt;h2&gt;
  
  
  5. ¡Echar a andar nuestra cadena!
&lt;/h2&gt;

&lt;p&gt;Ahora solo nos falta echar a andar nuestra cadena y ver qué sucede. Tan sencillo como ejecutar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Si todo está correcto, ¿por qué no iba a estarlo?, veremos el siguiente mensaje en nuestra consola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; runnerty

info: RUNNERTY v3.0.0 RUNNING - TIME...: Thu Jan 14 2021 10:29:23 GMT+0100 &lt;span class="o"&gt;(&lt;/span&gt;hora estándar de Europa central&lt;span class="o"&gt;)&lt;/span&gt;
info: Successful access to runnerty.io &lt;span class="o"&gt;(&lt;/span&gt;websockets&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este proyecto base, tenemos configurado que cada minuto se ejecute nuestro workflow, que en este caso solo muestra un mensaje por consola, y podremos ver como se han ido sustituyendo los valores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;info: 2021-01-14 10:30:00 START OF THE CHAIN: CHAIN_ONE
info: 2021-01-14 10:30:00 START: PROCESS PROCESS_ONE
info: 2021-01-14 10:30:00 END: PROCESS PROCESS_ONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero, vamos a verlo en la plataforma, se acabaron los logs interminables&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%2Fi%2Fxirlm5m21cv3z9yszwak.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%2Fi%2Fxirlm5m21cv3z9yszwak.png" alt="Vista ejecución de cadenas en Runnerty Platform"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Iremos viendo cada una de las ejecuciones de nuestro &lt;strong&gt;workflow&lt;/strong&gt;. Tenemos muchas opciones interesantes que ya explicaremos en otra ocasión, como &lt;strong&gt;relanzar nuestro workflow&lt;/strong&gt; desde la plataforma en cualquier momento o ver el &lt;strong&gt;detalle de la ejecución&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Extra ball: Añadir un segundo proceso y visualizarlo en la plataforma.
&lt;/h2&gt;

&lt;p&gt;Creamos un segundo proceso (copiamos el primero y le cambiamos el &lt;code&gt;id&lt;/code&gt; y en &lt;code&gt;name&lt;/code&gt; y le añadimos la propiedad &lt;code&gt;depends_process&lt;/code&gt; para indicarle que depende del proceso anterior. Así de fácil...&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="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"processes"&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="s2"&gt;"PROCESS_ONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process One"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="nl"&gt;"output"&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;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="s2"&gt;"PROCESS_TWO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process 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;"depends_process"&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="s2"&gt;"PROCESS_ONE"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exec"&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="s2"&gt;"shell_default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo Runnerty: Process 2 depends on process 1!"&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;"output"&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;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 ¡Hemos creado nuestro primer workflow con dependencia entre procesos!&lt;/p&gt;

&lt;p&gt;Ahora, si le echas un vistazo a la visualización de la cadena en la plataforma, verás esa dependencia &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%2Fi%2Fs82soiptu0me7qf0d37x.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%2Fi%2Fs82soiptu0me7qf0d37x.png" alt="Vista diseño de una cadena de Runnerty"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviamente, no estamos exprimiendo el potencial de Runnerty en este ejemplo tan básico, pero podemos hacer flujos de trabajo tan complejos como seas capaz de diseñar.&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%2Fi%2F52vh2qz1tpvoe8xdsiw2.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%2Fi%2F52vh2qz1tpvoe8xdsiw2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Empieza a delegar en Runnerty procesos de tu ecosistema y hazlo escalable y seguro 🔥.&lt;/p&gt;

&lt;p&gt;Te animo a que le eches un ojo y si te parece interesante puedes apoyarnos en &lt;a href="https://github.com/runnerty/runnerty" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐️ o mandarnos un mensaje por &lt;a href="https://twitter.com/runnerty_io" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>workflow</category>
      <category>node</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>¿Por qué usar Runnerty?</title>
      <dc:creator>Álvaro A. Quirós López</dc:creator>
      <pubDate>Mon, 18 Jan 2021 15:29:35 +0000</pubDate>
      <link>https://dev.to/runnerty/por-que-usar-runnerty-3ce1</link>
      <guid>https://dev.to/runnerty/por-que-usar-runnerty-3ce1</guid>
      <description>&lt;p&gt;Cada día nacen nuevos proyectos tecnológicos, más complejos y conectados con más servicios y aplicaciones de terceros. Modelos de negocio que cada día dan servicio a más usuarios en una lucha constante de mejora en su puesta de valor. Esto conlleva un elevado coste (tiempo, recursos dedicados y dinero) en su desarrollo y en su mantenimiento.&lt;/p&gt;

&lt;p&gt;Ya no hablamos de aplicaciones web, plataformas de venta online o aplicaciones móviles, hablamos de &lt;strong&gt;ecosistemas de software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Runnerty es una tecnología que propone una nueva manera de desarrollar, creando una capa de abstracción en la que integrar y automatizar un ecosistema de software, delegando en ella gran parte de tu lógica de negocio, evitando problemas de escalabilidad, seguridad y mantenimiento, haciendo mucho más evolucionable futuros desarrollos, ahorrando tiempo y recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entonces, ¿qué es Runnerty?
&lt;/h2&gt;

&lt;p&gt;Runnerty es una tecnología "low code" que permite integrar y automatizar aplicaciones online &amp;amp; offline, infraestructura de sistemas y servicios con terceros de manera simple, rápida y segura, creando &lt;strong&gt;flujos de trabajo&lt;/strong&gt; y ofreciendo una nueva forma de desarrollar.&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%2Fi%2Fvegbg0diwvp4mkgj6dnx.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%2Fi%2Fvegbg0diwvp4mkgj6dnx.png" alt="1609336560199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Da igual el tamaño de tu aplicación o plataforma e incluso el estado del desarrollo en el que se encuentre, seguramente Runnerty pueda facilitarte las cosas, darle robustez a tu sistema y darte cierta agilidad extra a la hora de evolucionarlo. &lt;/p&gt;

&lt;p&gt;Puedes usar Runnerty de muchas maneras, desde automatización de procesos de desarrollo, como tareas de CD/CI o mantenimiento de bases de datos, hasta tareas de muy alto nivel como la comunicación directa con clientes o empresas de reparto, puedes mandarle los pedidos de tu tienda online a SEUR, por ejemplo.&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%2Fi%2Fr6ufsnn4hp4j0ufl4whg.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%2Fi%2Fr6ufsnn4hp4j0ufl4whg.png" alt="1609321454115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Algunas de sus principales funcionalidades
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gestión de dependencias (complejas si es necesario)
&lt;/h3&gt;

&lt;p&gt;Quizás lo más básico de Runnerty, poder diseñar un flujo de trabajo, que los procesos tengan sentido entre sí. Pero, no solo controla cuando se acaba un proceso para que empiece el siguiente, sino que puede hacer evaluaciones complejas, esperar a que terminen varios procesos para ejecutar un proceso u otro, hacerlo cuando acaban bien, hacerlo cuando acaban mal, crear todo tipo de vinculaciones en base al resultado del proceso, etc...&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistema de notificaciones
&lt;/h3&gt;

&lt;p&gt;Runnerty te mantiene informado wherever / whenever de cualquier evento que se produzca en tus flujos de trabajo de manera sencilla. Mediante notificaciones por email, sms, Telegram, Slack... o a cualquier plataforma que tú elijas, Y, cómo no, desde &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;Runnerty Platform&lt;/a&gt;, dándote la libertad que necesitas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistema de reintentos
&lt;/h3&gt;

&lt;p&gt;Puedes definir cuántas veces quieres que se reintente un proceso antes de darse por fallido y cuánto tiempo quieres que pase entre reintentos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gestión de logs
&lt;/h3&gt;

&lt;p&gt;Para evitar mantenimiento de servidores, Runnerty se ocupa de gestionar el tamaño máximo de los logs y la ubicación. Solucionamos problemas de gestión de espacio por logs de procesos que no te imaginas ni que existen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Y si la cosa se pone seria…
&lt;/h2&gt;

&lt;p&gt;No importa el tamaño del proyecto y su complejidad, no hay límites. Cuando el trabajo se pone serio Runnerty cuenta con funcionalidades avanzadas que harán de la gestión de millones procesos algo rutinario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistema de colas de procesos
&lt;/h3&gt;

&lt;p&gt;Puedes definir diferentes colas y que los procesos se ejecuten en el orden de llegada a las mismas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistema de prioridades entre procesos
&lt;/h3&gt;

&lt;p&gt;Cuando tienes muchos procesos es normal que haya varios que estén listos para ejecutarse al mismo tiempo, con Runnerty puedes establecer prioridades para que se ejecuten los que consideres más importantes primero.&lt;/p&gt;

&lt;h2&gt;
  
  
   Y algo más ...
&lt;/h2&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%2Fi%2F2ro5eko2b3gh0x4950cb.jpeg" 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%2Fi%2F2ro5eko2b3gh0x4950cb.jpeg" alt="1609321501427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Además de todo esto, Runnerty ofrece un &lt;a href="https://app.runnerty.io" rel="noopener noreferrer"&gt;servicio en la nube&lt;/a&gt;, lo que permite visualizar todo tu sistema de manera gráfica, intuitiva y personalizada.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y ahora?
&lt;/h2&gt;

&lt;p&gt;Si quieres empezar a usar Runnerty, te dejo &lt;a href="https://dev.to/runnerty/como-empezar-a-usar-runnerty-3ki0"&gt;este artículo&lt;/a&gt; para que le eches un ojo&lt;/p&gt;

&lt;p&gt;Te animo a que le eches un ojo y si te parece interesante puedes apoyarnos en &lt;a href="https://github.com/runnerty/runnerty" rel="noopener noreferrer"&gt;Github&lt;/a&gt; ⭐️ o mandarnos un mensaje por &lt;a href="https://twitter.com/runnerty_io" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>workflow</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
