Hace un tiempo les conté por acá cómo configurar Travis para poder crear un ambiente de integración continua en un proyecto de Laravel.
Y como saben también, hace un tiempo estuve jugando con Github Actions para correr los tests de un proyecto de Rails.
En este post les voy a contar como hacer para configurar Github Actions para ejecutar los tests de Laravel.
El Proyecto
El año pasado en Programación Web II – TUPAR, la materia en la que soy docente, hicimos un proyecto de ejemplo en Laravel, al cual le configuramos Github Actions, para generar un ambiente de Continuous Integration (CI).
El proyecto es muy sencillo, una To Do List, que tiene usuarios comunes y usuarios que son manager. Está todo en este repo de Github.
En cuanto a los tests, tiene bastantes Unit tests y Feature Tests. Tambien agregamos un test de Dusk (browser test) muy sencillo, solo entra y mira el titulo de la página. Este último es solo a efectos de poder ejecutar este tipo de test «visuales» en un ambiente de CI.
¿Qué vamos a configurar?
En principio queremos que corran los unit y feature tests. Luego vamos a crear otro workflow para que corran los tests de Dusk y por último crear uno que nos haga un análisis estático de código.
A su vez, vamos a configurar Codecov, para poder ver visualmente el coverage que tenemos.
Unit Tests y Feature Tests
Si miramos un poco el proyecto, vamos a ver que estamos usando docker-compose para tener varios containers:
- App: Es donde tenemos PHP
- Web: El servidor web Nginx
- Database: La base de datos Postgres
- Adminer: App para poder acceder a la base.
- Selenium: Donde vamos a tener Chrome para ejecutar los Dusk Tests
Mirando esto lo primero que vamos a necesitar para correr Unit y Feature tests es una base de datos. Por lo tanto en nuestra acción vamos a necesitar un servicio de Postgres corriendo.
Configurar Postgres
Cuando agregamos el servicio de Postgres, tenemos que configurar el usuario, la password y el nombre de la base de datos. También mapeamos el puerto de Postgres al mismo puerto de la máquina host. De esta forma, donde en el container que genera Github, vamos a poder usar la base de datos.
Un dato importante acá es la variable de entorno DB_HOST
. Usen 127.0.0.1
, en lugar de localhost
. (Alguna vez esto me trajo problemas)
Con respecto al servicio de Postgres se agrega una línea más, que sirve para saber si el servicio está listo para atender requests. No es completamente necesario, pero puede arreglarte algún que otro lío.
Steps
Luego, lo que tenemos que agregar son los steps que vamos a necesitar.
- Hacer checkout del codigo, este paso nos va a traer el código al container donde se van a ejecutar los tests.
- Crear el .env de Laravel para que la solución funcione. Aca es importante que tengamos un .env.example en nuestro proyecto con todo pre-configurado. Esto nos sirve tanto para usarlo en Github Actions o también para cualquier miembro de nuestro equipo pueda crearse un .env muy rapido y facil. Hay que recordar siempre de hacer los ajustes en ese archivo además de en nuestro .env, ya que este último archivo no se commitea en el repo.
- Instalar las dependencias usando composer
- Generar una key para que nuestra app funcione. Esta key es la que se usa para todo lo que tenga que ver con encripción en nuestra app.
- Actualizamos permisos de carpetas donde van a crearse algunos archivos, para que cualquier usuario pueda escribir.
- Ejecutamos los tests
- Subimos los resultados a Codecov.
Dusk Tests
Para los Dusk Tests, qué son los que corren en el browser, vamos a tener que agregar algunas partes más.
En primer lugar, tenemos que agregar la variable de entorno APP_URL
, para que cuando ejecutemos los tests, Dusk sepa dónde tiene que ir a abrir la app en el browser.
Steps
La primer diferencia con el workflow de la sección anterior es que como tenemos una configuración para ejecutar Dusk localmente, lo que tenemos que hacer es borrarla para que no interfiera con la configuración en Github Actions.
Luego los steps son prácticamente los mismos, se suman estos:
- Ejecutar las migraciones, esto nos va a permitir que nuestra app funcione correctamente.
- Actualizar el Plugin de Chrome, con este paso actualizamos el binario que vamos a usar de Chrome.
- Le damos más permisos a la carpeta de binarios de Dusk para que se puedan ejecutar.
- Levantamos el server de artisan para poder acceder a nuestra app. Redirigimos toda la salida a /dev/null para que no interfiera con el output de nuestros tests. Es muy importante el & del final, para poder ejecutar en paralelo los siguientes steps.
- Ejecutamos Chrome, también agregamos el & al final.
- Ejecutamos los tests de Dusk
Análisis estático de código (Phan)
Por último, podemos crear otro workflow para chequear el estilo de código que tenemos.
Este es mucho más sencillo, porque al ser un análisis estático de código, no necesitamos tener la app corriendo. Solo necesitamos ejecutar Phan
Espero que les sirva y puedan usarlo en sus proyectos Laravel.