009 - Makefile

1. Allgemein

Jedes Projekt MUSS ein Makefile enthalten.

2. Targets

2.2 install

Jedes Makfile MUSS ein install target (phony) enthalten.

Das install target MUSS das frisch geklonte Projekt zur direkten Verwendung installieren, d.h. z.B.

  • docker-compose build durchführen
  • environment und config dist files kopieren
  • die Datenbank initialisieren

2.2 up

Jedes Makefie MUSS ein up (phony? [^1]) target enthalten.

Das up target MUSS das Projekt so starten, dass es aufgerufen werden kann, also z.B.:

  • composer install ausführen
  • Datenbankmigrationen ausführen

Es SOLLTE die Adressen ausgeben, unter denen das Projekt aufgerufen werden können, z.B.:

Project is up and running on http://localhost:8080

Wenn das Projekt docker verwendet, MUSS vor dem up target das down target ausgeführt werden, um Probleme mit unsauber geschlossenen Containern, z.B. durch sleep modus, zu vermeiden.

Beispiel

up:             ## Start service (rebuild if necessary), composer install and apply migrations
    $(MAKE) down
    docker-compose $(COMPOSE_FILES_PATH) up --build -d
    $(MAKE) vendor
    $(MAKE) migrate

2.3 down

tbd

2.4 restart

Das Makefile SOLLTE ein restart target enthalten, das die container neu startet.

2.4 deploy

tbd

2.5 bash

tbd

2.6 vendor

tdb

2.7 logs

tbd

2.8 tests

tbd

2.9 help

tbd

2.10 uninstall

Das Makefile SOLLTE ein uninstall Target haben, das folgendes ausführt:

  • anonyme und named volumes entfernen
  • container entfernen

Beispiel Makefile

Achtung: veraltet und berücksichtigt nicht die aktuellsten Anpassungen. @tbd

# Default make ENV is development. use make [target] ENV=prod for production
ENV ?= dev

.DEFAULT_GOAL:=help

ifeq ($(filter $(ENV),dev prod),)
$(error The ENV variable is invalid. Must be one of <prod|dev> )
endif

COMPOSE_FILES_PATH := -f docker-compose.yml -f $(ENV).yml

# --------------------------

.PHONY: up down deploy logs bash help

up:             ## Start service, rebuild if necessary
    docker-compose $(COMPOSE_FILES_PATH) up --build -d

down:           ## down service
    docker-compose down

deploy:         ## [TBD] Deploy Prod Image (alias for `make up ENV=prod`)
    @make up ENV=prod

logs:           ## Tail container logs with -n 1000
    docker-compose logs --follow --tail=1000

bash:           ## Enter php-fpm container bash
    docker-compose exec php-fpm /bin/bash   

help:           ## Show this help.
    @echo "Tierarzt Zeh make"
    @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m ENV=<prod|dev> (default: dev)\n\nTargets:\n"} /^[a-zA-Z_-]+:.*?##/ { printf "  \033[36m%-12s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST)

Referenz

  • Hilfreiche Artikel zum Thema Makefiles in Webanwendungen:
  • https://www.smashingmagazine.com/2015/10/building-web-applications-with-make/
  • https://nicwortel.nl/blog/2019/01/29/building-web-applications-with-make
  • https://stackoverflow.com/questions/5377297/how-to-manually-call-another-target-from-a-make-target
  • Beispiel Makefile: https://github.com/sherifabdlnaby/symdocker/blob/master/Makefile

Footnotes

[^1]: Noch nicht geklärt, ob es möglich ist, das docker up anhand von docker dateien nicht phony zu machen.