<?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: Alejandro E. Rendon</title>
    <description>The latest articles on DEV Community by Alejandro E. Rendon (@arendondiosa).</description>
    <link>https://dev.to/arendondiosa</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%2F375031%2Fc35b7aae-2fa0-4dea-a193-66576a84ae96.jpg</url>
      <title>DEV Community: Alejandro E. Rendon</title>
      <link>https://dev.to/arendondiosa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arendondiosa"/>
    <language>en</language>
    <item>
      <title>Concurrencia en flujos de Github Actions</title>
      <dc:creator>Alejandro E. Rendon</dc:creator>
      <pubDate>Sat, 18 Dec 2021 21:02:15 +0000</pubDate>
      <link>https://dev.to/arendondiosa/concurrencia-en-flujos-de-github-actions-4ihb</link>
      <guid>https://dev.to/arendondiosa/concurrencia-en-flujos-de-github-actions-4ihb</guid>
      <description>&lt;p&gt;En algunos casos se espera que un flujo de trabajo sea ejecutado una única vez (&lt;em&gt;e.g. despliegues&lt;/em&gt;) o ejecutar la versión más actual (&lt;em&gt;e.g. el último commit de un Pull Request&lt;/em&gt;) pero a simple vista no es tan sencillo de configurar utilizando &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;El gasto de actions es una de las razones principales por la se requiere optimizar al máximo la configuración de los flujos de trabajos. Una de las tareas más comunes que se quiere evitar es la de ejecutar multiples veces flujos cada vez que realizamos una acción.&lt;/p&gt;

&lt;p&gt;Para este caso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Oc8rhPH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73w0kz4v3o4ag398apue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Oc8rhPH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73w0kz4v3o4ag398apue.png" alt="ejemplo-multiples-ejecuciones-mismo-job" width="800" height="302"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;staging&lt;/span&gt; &lt;span class="c1"&gt;# Despliegue de aplicación&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;staging&lt;/span&gt; &lt;span class="c1"&gt;# Validaciones por cada commit agregado en un Pull Request&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cualquiera de las opciones anteriores, se espera que sólo se tenga en cuenta la versión más reciente de los cambios y no se requiere que se ejecuten todos los flujos que se encolen.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Actions creados por terceros: &lt;a href="https://github.com/marketplace/actions/cancel-workflow-action"&gt;cancel-workflow-action&lt;/a&gt; es una alternativa que funciona pero nunca va a ser tan respaldada como una "opción nativa" porque un action creado por un tercero requiere más configuración y tiempo de ejecución.
Ésta fue una gran opción hasta el inicio del año 2021 ya que no se tenia una configuración del propio GitHub. Por eso es una opción valida.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cancel Previous Runs&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;styfle/cancel-workflow-action@0.9.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;access_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.token }}&lt;/span&gt;
      &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agregando el action &lt;code&gt;cancel-workflow-action&lt;/code&gt; como un paso en el job será suficiente para ejecutar una única vez el job por flujo. Se utiliza &lt;code&gt;access_token&lt;/code&gt; (&lt;em&gt;credencial generada en GitHub&lt;/em&gt;) para acceder a la API de GitHub y consultar información sobre ejecuciones activas y poder cancelarlas de ser necesario.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Opción efectiva pero "costosa" en tiempo y recursos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Configuración del flujo de trabajo (&lt;strong&gt;Recomendada&lt;/strong&gt;): Establecer las opciones de &lt;a href="https://github.blog/changelog/2021-04-19-github-actions-limit-workflow-run-or-job-concurrency/"&gt;Concurrencia&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ci-${{ github.ref }}&lt;/span&gt; &lt;span class="c1"&gt;# Grupo filtrado por nombre de la rama github.ref&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Concurrencia se refiere a la cantidad de ejecuciones del mismo tipo que se realizan simultáneamente. Es decir, las ejecuciones marcadas como &lt;code&gt;group&lt;/code&gt; (&lt;em&gt;tag para agrupar cierto tipo de jobs&lt;/em&gt;) se podrían ejecutar al mismo tiempo o ser ejecutadas de a una.&lt;/p&gt;

&lt;p&gt;Por defecto, la opción &lt;code&gt;cancel-in-progress&lt;/code&gt; está activada y por esto obtenemos el resultado esperado: Cancelar todas las ejecuciones menos la más reciente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OkpDAVlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rogbqkejwk48dvle8wo1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OkpDAVlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rogbqkejwk48dvle8wo1.png" alt="ejemplo-multiples-ejecuciones-mismo-job-cancelar" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si &lt;code&gt;cancel-in-progress&lt;/code&gt; se desactiva, cada uno de las ejecuciones encoladas se pausará y terminarán una a la vez hasta llegar a la más reciente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X2V920z7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qf58wkbptc5byn3tn9bt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X2V920z7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qf58wkbptc5byn3tn9bt.png" alt="ejemplo-multiples-ejecuciones-mismo-job-cola" width="800" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;De momento es la opción recomendada: Al ejecutarse en la sección de configuración del flujo de trabajo es más rápida y ahorra recursos ya que en este punto aún no se han desplegado los requerimientos de los jobs. &lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>github</category>
      <category>ci</category>
      <category>devops</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
