Python: Verbesserte Version des Makefile

Diese Dokumentation ist Teil des Erweiterte Anwendungen-Leitfadens. Den vollständigen Leitfaden finden Sie hier: Weiterführende Schritte mit Ihren Python-Bereitstellungen.

👋 Willkommen bei der Stackhero-Dokumentation!

Stackhero bietet eine einsatzbereite Python-Cloud-Lösung, die zahlreiche Vorteile bietet, darunter:

  • Deployen Sie Ihre Anwendung in Sekundenschnelle mit einem einfachen git push.
  • Verwenden Sie Ihren eigenen Domainnamen und profitieren Sie von der automatischen Konfiguration von HTTPS-Zertifikaten für erhöhte Sicherheit.
  • Genießen Sie beruhigende automatische Backups, Ein-Klick-Updates und eine einfache, transparente und vorhersehbare Preisgestaltung.
  • Erhalten Sie optimale Leistung und robuste Sicherheit dank einer privaten und dedizierten VM.

Sparen Sie Zeit und vereinfachen Sie Ihr Leben: Es dauert nur 5 Minuten, um die Python-Cloud-Hosting-Lösung von Stackhero auszuprobieren!

Unten ist ein verbessertes Makefile, das mehrere Regeln unterstützt:

  • make dev (oder einfach make): Startet die Anwendung im Entwicklungsmodus.
  • make deploy: Stellt die Anwendung auf dem Remote namens stackhero bereit. Dies funktioniert gut, wenn Sie nur eine Stackhero-Instanz haben.
  • make deploy-production: Stellt die Anwendung auf dem Remote namens stackhero-production bereit.
  • make deploy-staging: Stellt die Anwendung auf dem Remote namens stackhero-staging bereit.

Dieses Makefile ist so konzipiert, dass es Situationen handhabt, in denen sich der Code nicht geändert hat, indem es den "Everything up-to-date" Fehler vermeidet.

Kopieren Sie den folgenden Inhalt und fügen Sie ihn als Ihr neues Makefile ein:

# Standardregel, die ausgeführt wird, wenn "make" ohne Argument aufgerufen wird
.DEFAULT_GOAL := dev


# Stackhero für Python wird die "run" Regel auf Ihrer Instanz ausführen.
# Dies ist der Befehl, der sowohl in Ihren Produktions- als auch in Ihren Staging-Umgebungen ausgeführt wird.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# Der Befehl, der in der Entwicklungsumgebung verwendet wird
dev:
  python app.py


# Regel "deploy" zur Bereitstellung auf der Instanz "stackhero".
# Geeignet, wenn Sie nur eine Instanz haben.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# Die "deploy-*" Regeln stellen auf einer Instanz bereit, die "stackhero-*" heißt.
# Zum Beispiel, das Ausführen von "make deploy-production" stellt auf "stackhero-production" bereit,
# oder "make deploy-staging" stellt auf "stackhero-staging" bereit.
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Interne Bereitstellungsregel. Nicht ändern.
deploy-script:
  @echo "Bereitstellung des Branches \"${DEPLOY_BRANCH}\" auf \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Kann nicht bereitstellen, da es nicht festgeschriebene Änderungen gibt:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Sie können diesen Befehl verwenden, um die Änderungen festzuschreiben:"; \
    echo "git add -A . && git commit -m \"Ihre Nachricht\""; \
    echo "\e[0m"; \
    exit 1; \
  fi

  @git push --dry-run ${DEPLOY_REMOTE} ${DEPLOY_BRANCH} 2>&1 | grep -q -F "Everything up-to-date"; \
  EXIT_CODE=$$?; \
  if [ $$EXIT_CODE -eq 0 ]; then \
    echo -n "Nichts Neues zu bereitstellen... Bereitstellung erzwingen (dies wird einen neuen Commit erstellen)? (y/N) "; \
    read answer && \
    case $$answer in \
      y|Y|yes|YES) \
      git commit --allow-empty -m "Force update for deploy purpose to \"${DEPLOY_REMOTE}\"" ; \
      ;; \
    *) \
      echo "Nichts zu bereitstellen!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}