Encapsulando pruebas de carga en una Github Action propia

Ahora que ya sabemos como ejecutar una prueba de carga, lo siguiente sería encapsularlo en una Github Action, así, cada vez que necesitemos ejecutarlo no tenemos que repetir manualmente los pasos para compilar la imagen de Docker y crear el contenedor, sino que directamente use la acción que está preparada para ello.

Manos a la obra

Se pueden crear acciones propias de diferente forma:

  • Utilizando Docker
  • Utilizando Javascript
  • A partir de una composición de pasos a ejecutar en una acción.

La documentación oficial la puedes encontrar en el siguiente enlace:

Creando acciones github

En nuestro caso, vamos a aprovechar el fichero Dockerfile que hemos creado anteriormente y simplemente vamos a proveer los parámetros para ejecutar la prueba desde fuera.

Para ello, crearemos una carpeta llamada load-test-action y dentro el fichero action.yml para definir nuestra propia acción que ejecute el fichero Dockerfile:

./load-test-action/action.yml

name: Acción Apache Bench
description: Ejecuta pruebas de carga usando Apache Bench

inputs:
  url:
    description: 'URL donde realizar las pruebas.'
    required: true
  number-of-requests:
    description: 'Número de peticiones en total.'
    required: false
    default: '1000'
  concurrency:
    description: 'Número de peticiones concurrentes.'
    required: false
    default: '50'

runs:
  using: 'docker'
  image: 'Dockerfile'

Le añadimos un nombre y una descripción, ambos campos requeridos.

Incluimos los parámetros necesarios para ejecutar las pruebas

Y por último le indicamos que lo ejecute utilizando Docker mediante, el fichero Dockerfile

Antes de actualizar el fichero Dockerfile para recoger los inputs, vamos a hacer un pequeño inciso. Por defecto, Github crea variables de entorno por cada input que añadimos a la acción con el formato INPUT<VARIABLE_NAME>_. Lo que significa que transformará el nombre de tu variable a mayúsculas y los espacios los transformará en guión bajo (_), por ejemplo:

url -> $INPUT_URL
concurrency -> $INPUT_CONCURRENCY

Mas información.

Sin embargo, los guiones no los transformará en guión bajo y la variable number-of-requests quedaría con el siguiente formato:

number-of-requests -> $INPUT_NUMBER-OF-REQUESTS

Si queremos que todas sigan el mismo formato, podemos crearla nosotros mismos:

./load-test-action/action.yml

...

runs:
  using: 'docker'
  image: 'Dockerfile'
+ env:
+   INPUT_NUMBER_OF_REQUESTS: ${{ inputs.number-of-requests }}

Por último, movemos el fichero Dockerfile también dentro de la carpeta load-test-action ya que el fichero anterior necesita encontrarlo en el mismo directorio y lo actualizamos:

./load-test-action/Dockerfile

FROM alpine:latest

RUN apk add --no-cache apache2-utils

- ENTRYPOINT ab -n 1000 -c 50 https://www.basefactor.com/
+ ENTRYPOINT ab -n $INPUT_NUMBER_OF_REQUESTS -c $INPUT_CONCURRENCY $INPUT_URL

Con estos pasos, hemos encapsulado un proceso para ejecutar pruebas de rendimiento con Apache Bench y Docker en una acción de Github Actions. Ya estamos preparados para poder utilizarla y ejecutarla en un flujo de trabajo de Github.

¿Te gusta el mundo Devops?

En Lemoncode impartimos un Bootcamp Devops Online, en él encontrarás todos los recursos necesarios: clases de los mejores profesionales del sector, tutorías en cuanto las necesites y ejercicios para desarrollar lo aprendido en los distintos módulos. Si quieres saber más puedes pinchar aquí para más información sobre este Bootcamp Devops.