Github actions - Proyecto-FIS/frontend GitHub Wiki

GITHUB ACTIONS

FIS. Grupo 2. Proyecto Coffaine.

Contenido

Github actions

Fuente principal: https://docs.github.com/en/actions

Conceptos

Actualmente, se muestra como estándar el uso de una plataforma intermedia entre el servidor y el sistema de control de versiones para manejar el proceso de despliegue continuo. En nuestro caso para explicarlo, vamos a dar por hecho que se utilizarán Heroku y Github respectivamente. De esta manera, si lo configurásemos de la “manera tradicional”, Github suministraría el código desde los repositorios, donde podría a disposición de Travis CI los ficheros de configuración para el despliegue, a partir de ellos, Travis CI automatizará el proceso hasta desplegar nuestra aplicación en Heroku.

figure-github-actions-docs

Figura 1. Travis como método tradicional al uso de Github actions

Frente a ello, surge por parte de github, Github actions , una herramienta que nos permiten realizar el mismo proceso ahorrándonos el paso intermedio de Travis, además de ofrecer funcionalidades adicionales. Y especificando todos los pasos con un simple fichero de configuración en formato. yaml.

figure-github-actions-docs

Figura 2. Github actions

La automatización es la clave para agilizar los procesos de trabajo y Github actions es la mejor manera de potenciar un flujo de trabajo en github, ya que le permite crear flujos de trabajo para ciclos de vida de desarrollo software personalizados, además de poder realizarlo directamente dentro del repositorio de github.

Github actions está totalmente integrado en github. Está construido integrando desde el Merge box hasta las pruebas de verificación. Y desde la interfaz de usuario a la API, como se puede ver en la siguiente figura.

figure-github-actions-docs

Figura 3. Integración de funcionalidades de github

Github actions funciona de la misma manera que github, y como sirve de apoyo a todos los flujos de trabajo de desarrollo de software, además de automatizarlos, almacena el código y da soporte para la colaboración en pull requests e issues dentro de la misma plataforma.

Este permite descubrir, crear y compartir actions o acciones a través de su marketplace, para realizar, esencialmente, cualquier trabajo que quieras. Incluyendo CI y CD y acciones combinadas tanto propias como del Marketplace, se puede personalizar completamente el flujo de trabajo.

Así que, para visualizar cómo esto puede ser útil. Vamos a echar un vistazo rápido a la metodología para el flujo básico de Github: Github Flow.

Este es un flujo de trabajo ligero y eficaz basado en ramas, comúnmente utilizado en github, que después nos servirá para ver cómo las acciones de github encajan en él.

figure-github-actions-docs

Figura 4. Github flow (1)

El primer paso para cuando queremos hacer cambios en el código en nuestro repositorio de github es crear una “feature Branch” de la rama principal o la rama de producción, es decir, bifurcar la rama principal y crear una copia de ella teniendo como título el de la feature que queremos desarrollar, para posteriormente realizar los commits pertinentes asociados a dicha funcionalidad.

Cuando terminamos de desarrollar y por tanto finalizamos esta feature, abrimos un pull request en github para compartir nuestros cambios.

figure-github-actions-docs

Figura 5. Github flow ( 2 )

Una vez revisada y aprobada la pull request, fusionamos esta rama en la rama principal, y luego eliminamos nuestra feature branch.

figure-github-actions-docs

Figura 6. Github flow ( 3 )

Teniendo claro la metodología a seguir a la hora de desarrollar dentro del proyecto, ¿en qué punto Github actions entra en juego?

figure-github-actions-docs

Figura 7. Github flow + actions (1)

La ventaja de las acciones de github es que en cualquier etapa de Github Flow se pueden aplicar las acciones de github existentes o incluso crear tus propias acciones de github.

En este documento vamos a tratar específicamente la inclusión del CI/CD a través de Github actions, ya que será lo que posteriormente apliquemos al proyecto de Coffaine.

Existen tantas alternativas de configuración en github actions, que permite automatizar cualquier parte del proceso. Por ejemplo, si se quiere ejecutar un automatizado específico cuando una issue abierta, etiquetada de una forma concreta, se cierra.

figure-github-actions-docs

Figura 8. Github flow + actions ( 2 )

Otro ejemplo sería para una pull request que está abierta y se quiere que se creen recordatorios automatizados, basados en etiquetas o en revisores específicos. Con esto se pretende ilustrar que las acciones son capaces de automatizar workflows personalizados en cualquier punto del ciclo de vida del desarrollo del software, de manera directa desde el repositorio de github.

figure-github-actions-docs

Figura 9. Github flow + actions ( 4 )

Las acciones de Github son impulsadas por eventos, lo que significa que se puede ejecutar una serie de comandos después de que un evento específico haya ocurrido. Por ejemplo, cada vez que alguien crea un pull request para un repositorio, se puede ejecutar automáticamente un comando que ejecute un script de pruebas de software. En lugar de utilizar integraciones CI o CD, como es el caso de Travis, con github actions puedes hacer los build entre otras funcionalidad, directamente en el repositorio github.

figure-github-actions-docs

Figura 10. Github events (1)

Esto da máxima libertad para personalizar, ya que las acciones trabajan sobre una tarea automatizada a lo largo del ciclo de vida de desarrollo de software.

Ahora se muestra dónde podemos aplicar la automatización utilizando acciones de github dentro del workflow de desarrollo de software. Se exponen de una manera más cercana cómo las acciones de github funcionan.

figure-github-actions-docs

Figura 11. Github events ( 2 )

Las acciones de Github utilizan la sintaxis yaml para definir los eventos, trabajos (jobs) y pasos (steps). Estos archivos yaml se almacenan en el repositorio de código, en el directorio llamado .github/workflows.

Un evento desencadena automáticamente el workflow que contiene un trabajo.

figure-github-actions-docs

Figura 12. Github events ( 3 )

Los jobs utilizan los steps para controlar el orden de ejecución de las acciones. Estas acciones son los comandos que automatizan aquello que deseamos, como el caso de las pruebas de software.

Por lo tanto, en este flujo de trabajo de ejemplo, se activa automáticamente una serie de comandos, cada vez que el código es pusheado. Github actions “checkea” el código pucheado , e instala las dependencias de software y ejecuta "bats -v", para dar salida a la nueva versión del software.

figure-github-actions-docs

Figura 13. Github events ( 4 )

Con github actions, también puedes construir, probar y publicar a través de múltiples plataformas de sistemas operativos y lenguajes, todo dentro del mismo flujo de trabajo. Por ejemplo en este se hace uso de la última versión de Ubuntu, tal y como se especifica en el “runs- on”.

figure-github-actions-docs

Figura 14. Github actions cross-platfom

y luego ver las comprobaciones de estado mostradas dentro de tu solicitud de extracción.

figure-github-actions-docs

Figura 15. Github pull request actions state

Con las acciones de github, se tiene la posibilidad de crear acciones propias o aprovechar acciones pre-construidas por la comunidad que se encuentran en el marketplace de github. Por lo tanto, es la solución perfecta si se desea personalizar y automatizar un workflow para llevarlo desde una idea a producción.

Uso específico para Node.js

Para la aplicación de github actions en nuestro proyecto, que se basa en node, hay que seguir una plantilla específica para node.js.

# This workflow will do a clean install of node dependencies, build
the source code and run tests across different versions of node

name: Node.js CI

on:
  push:
    branches: [ $default-branch ]
  pull_request:
    branches: [ $default-branch ]

jobs:
  build:

  runs-on: ubuntu-latest

  strategy:
    matrix:
      node-version: [10.x, 12.x, 14.x, 15.x]

  steps:
    - uses: actions/checkout@v
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v
        with:
          node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

Para elegir la versión exacta de Node.js para construir y realizar los test utilizaremos:

strategy:
  matrix:
    node-version: [8.16.2, 10.17.0]

Para instalar las dependencias utilizaremos npm install , que instalará las dependencias especificadas en el archivo package.json definido en la raíz del proyecto.

steps:
- uses: actions/checkout@v
- name: Use Node.js
  uses: actions/setup-node@v
    with:
      node-version: '12.x'
- name: Install dependencies
  run: npm install

A continuación vemos el ejemplo concreto que aplicación de Github actions en el proyecto Coffaine.

Github actions en Coffaine

Visualización del estado de workflows

figure-github-actions-docs

Figura 16. Estructura de Coffaine

Frontend común

Debido a la estructura de este proyecto, como se puede ver en la Figura 16 , tendremos que tener en cuenta las acciones para un repositorio de frontend, que será el que se comunique con el API GATEWAY para acceder a los recursos proporcionados por cada microservicio. Por lo que se podrá ver es estado de los workflows asociado al repositorio de frontend.

figure-github-actions-docs

Figura 17. Workflows en repositorio de frontend

Microservicios

Para cada uno de los cuatro microservicios, gracias a la coherencia entre tecnologías y estructura entre los diversos grupos de trabajo, se ha configurado las actions de github de manera análoga, por lo tanto el estado de sus workflows son análogos a los de la siguiente figura.

figure-github-actions-docs

Figura 18. Workflow en repositorio de cada microservicio

Configuración

Repositorio

Crear directorio .github/workflows donde añadiremos los ficheros de configuración para cada una de las acciones.

figure-github-actions-docs

Dockerfile

Github podría encargarse de la build directamente, sin embrago, en nuestro caso hacemos uso de la definición de Dockerfile para que se realice el despliegue en Heroku utilizando Docker.

figure-github-actions-docs

Figura 19. Definición del Dockerfile

Variables de entorno

Este paso es muy importante para la correcta ejecución de github actions. Añadiremos dos variables de entorno como secretos de github para utilizarlas desde los scripts:

  • HEROKU_API_KEY
  • HEROKU_EMAIL

figure-github-actions-docs Figura 20. Secretos de github

figure-github-actions-docs

Figura 21. Procedencia del secreto: Heroku

Github actions for Testing

figure-github-actions-docs

Figura 22. Yaml configuration file to test app

En este script especificamos que para cada pull request que se realice, se ejecutarán los test en un entorno con sistema operativo Ubuntu en la última versión disponible. Con el “strategy: matrix” especificamos la versión concreta de node con la que queremos que se ejecuten los test. Y posteriormente detallamos los pasos a seguir en el job, en los que hacemos uso de las actions del Marketplace: “checkout” y “setup-node” con las versiones 2 y 1 respectivamente.

figure-github-actions-docs

Figura 23. Github Marketplace

Vemos que en caso de “setup-node”, dentro del with especificamos la versión concreta de node con la que queremos que se ejecute, previamente definida en el “strategy: matrix”.

Finalmente ejecutamos el comando necesario para instalar las dependencias y correr los test especificando en el “env:” las variables de entorno necesarias para su ejecución, las cuales se tomarán del settings de github, definido como se indica en el apartado Variables de entorno.

Despliegue

figure-github-actions-docs

Figura 24. Yaml configuration file to deploy app

En este caso, se define el script de despliegue, que se ejecutará cada vez que se realice un push a la rama main , como se indica en las líneas [3-5] de la Figura 24.

Análogamente al caso anterior con el fichero de configuración para las pruebas, se define en el “steps”, los pasos a seguir cuando se ejecute el job. Aquí, primero se llama a la acción “checkout” que fija el código del repositorio para que se confirme el acceso del github actions al mismo. Y la acción de “heroku-deploy” que es una acción de GitHub muy sencilla que permite desplegar en Heroku. La acción funciona ejecutando los comandos asociados al despliegue de heroku en el shell a través de NodeJS. Para el correcto funcionamiento de esta acción es necesario indicar los valores que se recogen en el “with” en la configuración de los secretos del repositorio, como se indica en el apartado Variables de entorno.