Blog

Erleichtern Sie sich das Leben mit Makefiles

Joris Conijn

Aktualisiert Oktober 20, 2025
4 Minuten

In diesem Blogbeitrag zeige ich Ihnen, wie Sie sich mit Makefile das Leben leichter machen können. In diesem Blog werde ich CDK mit Python verwenden. Aber das Prinzip von funktioniert bei fast jedem Projekt.Wenn Sie ein neues PoC starten, haben Sie noch keine vollständige CI/CD-Umgebung.Wie können Sie also Ihre CDK-Anwendung bereitstellen? Und wie können Sie die CI/CD-Pipeline zu einem späteren Zeitpunkt einfach hinzufügen?

Fangen wir an!

Ich habe CDK 1.124.0 (Build 65761fe) für diesen Blogbeitrag verwendet.

Zunächst benötigen wir ein CDK-Projekt. Wir erstellen also einen Arbeitsordner mit dem Namen: makefile_cdk_blog:

mkdir makefile_cdk_blog
cd makefile_cdk_blog
cdk init --language python
mkdir tests

Zu diesem Zeitpunkt haben Sie ein leeres CDK-Projekt. Die meisten Projekte haben Abhängigkeiten. Sie können diese in 2 Kategorien einteilen:

  • Projektabhängigkeiten, Abhängigkeiten, die für das Projekt benötigt werden, finden Sie unter setup.py.
  • Entwicklungsabhängigkeiten, Abhängigkeiten, die für die Entwicklung des Projekts benötigt werden, befinden sich in requirements.txt. Beginnen wir mit dem Hinzufügen einiger Entwicklungsabhängigkeiten in der Datei requirements.txt:
-e .
black
pytest
pytest-cov
pytest-black
setuptools

Jetzt müssen wir pytest konfigurieren. Fügen Sie das Folgende in eine neue Datei setup.cfg ein:

[tool:pytest]
testpaths = tests

[coverage:run] branch = True source = makefile_cdk_blog

[coverage:report] show_missing = true fail_under = 100 exclude_lines = pragma: no cover if name ==.main.:

Das Einzige, was noch fehlt, ist die Makefile selbst. Erstellen Sie eine Datei namens Makefile im Stammverzeichnis Ihres Projekts. Stellen Sie sicher, dass sie den folgenden Inhalt hat:

SHELL = /bin/bash -c
VIRTUAL_ENV = $(PWD)/.venv
export BASH_ENV=$(VIRTUAL_ENV)/bin/activate

$(VIRTUAL_ENV):
    python3 -m venv $(VIRTUAL_ENV)

.PHONY: install clean synth diff deploy test lint

install: $(VIRTUAL_ENV)
    pip install -r requirements.txt

clean:
    [[ -d $(VIRTUAL_ENV) ]] && rm -rf $(VIRTUAL_ENV) || true
    [[ -d .pytest_cache ]] && rm -rf .pytest_cache || true
    [[ -d cdk.out ]] && rm -rf cdk.out || true
    [[ -f .coverage ]] && rm .coverage || true

synth:
    cdk synth

diff:
    cdk diff

deploy: test
    cdk deploy

test: lint
    pytest --cov --cov-report term-missing

lint:
    black .

 $(VERBOSE).SILENT:

Alles klar, wir sind bereit! Zuerst wollen wir unsere Änderungen committen, aber bevor wir das tun können, sollten wir sie testen. Wir haben Abhängigkeiten hinzugefügt, also müssen wir diese zuerst installieren! Aber da wir jetzt ein Make-Target dafür haben, können wir es verwenden.

make install

Ich werde Ihnen zeigen, was im Hintergrund passiert:

  1. Zunächst wählt Makefile die Bash als Shell aus.
  2. Legen Sie den Standort der virtuellen Umgebung fest.
  3. Die Variable BASH_ENV ist von dem Ziel $(VIRTUAL_ENV) abhängig. Sie erstellt eine virtuelle Umgebung an dem definierten Ort.
  4. Die virtuelle Umgebung wird dann in die Variable BASH_ENV exportiert.
  5. Dann führen wir das Ziel install aus. Alle Befehle werden nun im Kontext der virtuellen Umgebung ausgeführt.
  6. pip install wird alle Abhängigkeiten im requirements.txt und im setup.py installieren.

Wir können nun das Ziel test ausführen, um zu sehen, ob alles wie erwartet funktioniert.

make test

Sie würden etwas sehen wie:

pytest Ergebnisse

Was ist also passiert? Wir haben das Ziel aufgerufen. Dieses Ziel ist vom Ziel lint abhängig. Das Ziel lint enthält black . und dieser Befehl formatiert den gesamten Python-Code. Danach wird er fortgesetzt und führt die Befehle im Ziel aus.Der Test schlägt also fehl, weil wir den konfigurierten Schwellenwert für die Codeabdeckung nicht erreicht haben. Das ist für den Moment in Ordnung, also lassen Sie uns festschreiben!

git add .
git commit -m "chore: setup project using a Makefile"

Zeit für den Einsatz!

Bevor wir mit der Bereitstellung beginnen, gehe ich davon aus, dass Sie Ihre AWS-Anmeldedaten richtig konfiguriert haben.

export AWS_PROFILE=my-profile-name
make deploy

Und es ist fehlgeschlagen? Weil das Ziel eine Abhängigkeit vom Ziel hat. Das Test-Ziel wird also zuerst ausgeführt, schlägt aber fehl. Das ist die eigentliche Stärke von Makefile. Sie haben einfache Namen für Aktionen, die Sie durchführen möchten. Zum Beispiel: test, deploy usw. Und in diesem Fall sollten Sie nicht deployen, wenn Ihr Test fehlschlägt. Sie können diese Ziele mit verschiedenen Prüfungen/Befehlen erweitern. Sie könnten zum Beispiel die Vorlage synthetisieren und dann die folgenden Tools verwenden:

  • cfn_nag
  • cloudformation-guard.

    Fazit

    Makefiles ermöglichen es Ihnen, Aktionen projektübergreifend zu standardisieren. Sie können Befehle in virtuellen Umgebungen für Sie ausführen. Und wenn sie einfach gehalten werden, sind sie leicht zu lesen!

Update: Verbessern Sie Ihr Makefile noch mehr, indem Sie ein Hilfeziel hinzufügen!

Verfasst von

Joris Conijn

Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.

Contact

Let’s discuss how we can support your journey.