Desarrollo

MakeFile ¿Para qué sirven?

Los Makefiles son una herramienta que ha vuelto a resurgir, como complemento de automatización en los proyectos de software actuales.

Pensados originalmente para la compilación de ficheros de C, hoy en día se está empezando a utilizar también como un punto de entrada de comandos para cualquier aplicación.

Instalación:

  • Linux: Viene instalado en la inmensa mayoría de distribuciones, aunque siempre podemos forzar la instalación desde nuestro gestor de paquetes ej: 
    • sudo apt install make

¿Para qué sirven?

Para automatizar cualquier flujo de trabajo, instalación de proyectos, deploy, scripting, en definitiva cualquier tarea que necesite ser lanzada desde un comando es susceptible de ser asignada a un comando de make, por supuesto ¡esto también incluye a todo lo relacionado con Docker!

En AvaiBook, utilizamos un fichero makeFile en cada uno de nuestros repositorios de código, con una estructura similar, que nos permite tener comandos comunes en cada uno de ellos. 

De esta forma, la receta para ejecutar los procesos de trabajo típicos, la tenemos versionada y es común a todos los proyectos:

  • Instalar desde 0 el proyecto.
  • Acceder por ssh a la máquina de docker.
  • Levantar o parar los contenedores asociados al proyecto.
  • Consultar logs.
  • Ejecutar migraciones.
  • Lanzar tests y un largo etc.

Ejemplo de uso paso a paso.

Lo primero de todo es crear un fichero vacío con nombre MakeFile, sin extensión, en nuestro proyecto.

Por terminal ir a la ruta donde se encuentre y ejecutar “make”, la consola debería devolvernos algo parecido a esto:

Perfecto, bajo este punto inicial lo que solemos hacer en AvaiBook es crear una primera instrucción help, ¿todo comando tiene que tener su ayuda no?


help: ## Show this help message
	@echo 'usage: make [target]'
	@echo
	@echo 'targets:'
	@egrep '^(.+)\:\ ##\ (.+)' ${MAKEFILE_LIST} | column -t -c 2 -s ':#'

Los ficheros de makeFile, tienen una división muy sencilla, tenemos los targets y luego debajo indentado el proceso de ejecución.

De esta forma, en este ejemplo estaríamos definiendo el comando help, para poder llamarlo con «make help», esto ejecutaría cada una de las líneas que se encuentran indentadas debajo del target.

Es muy importante respetar la tabulación, ya que es lo que asigna cada automatización a cada target.

Si te fijas, en este comando estamos usando un grep, es un pequeño truco que usamos en AvaiBook para autodocumentar los comandos, que lo que hace es leer los comentarios ## que se encuentran después de cada target.

De esta forma si ejecutamos «make help», deberíamos obtener:

¿Mola verdad?

Ahora vamos a definir otro target, solo como ejemplo:

hi: ## Show "Hello World message"
	@echo "Hello World"

Como ya hemos visto, hemos dado de alta un nuevo target, y su instrucción indentada, ahora podemos hacer un: «make hi» y nos devolverá:

Hello World

Nuestra instrucción help, sigue haciendo de las suyas y ayudándonos en la autodocumentación.

Y a partir de aquí…

Recomendamos encarecidamente su uso para automatizar tareas con docker. Trabajar con estos ficheros actuando como alias para tareas del día a día termina siendo mucho más portable y fácil de recordar para el equipo, más aún si los tenemos versionados en el repositorio.