Python: Ulepszona wersja Makefile

Ta dokumentacja jest częścią przewodnika Zaawansowane zastosowania. Pełny przewodnik znajdziesz tutaj: Dalsze kroki z wdrożeniami Python.

👋 Witamy w dokumentacji Stackhero!

Stackhero oferuje gotowe do użycia rozwiązanie Python cloud, które zapewnia wiele korzyści, w tym:

  • Wdrażaj swoją aplikację w kilka sekund za pomocą prostego git push.
  • Używaj własnej nazwy domeny i korzystaj z automatycznej konfiguracji certyfikatów HTTPS dla zwiększonego bezpieczeństwa.
  • Ciesz się spokojem dzięki automatycznym kopiom zapasowym, aktualizacjom jednym kliknięciem oraz prostemu, przejrzystemu i przewidywalnemu cennikowi.
  • Uzyskaj optymalną wydajność i solidne zabezpieczenia dzięki prywatnej i dedykowanej VM.

Oszczędzaj czas i upraszczaj sobie życie: wypróbowanie rozwiązania Python cloud hosting Stackhero zajmuje tylko 5 minut!

Poniżej znajduje się ulepszony Makefile, który obsługuje wiele reguł:

  • make dev (lub po prostu make): Uruchamia aplikację w trybie deweloperskim.
  • make deploy: Wdraża aplikację do zdalnego o nazwie stackhero. Działa dobrze, gdy masz jedną instancję Stackhero.
  • make deploy-production: Wdraża aplikację do zdalnego o nazwie stackhero-production.
  • make deploy-staging: Wdraża aplikację do zdalnego o nazwie stackhero-staging.

Ten Makefile jest zaprojektowany do obsługi sytuacji, gdy kod się nie zmienił, unikając błędu "Everything up-to-date".

Skopiuj i wklej poniższą zawartość jako swój nowy Makefile:

# Domyślna reguła do wykonania przy wywołaniu "make" bez argumentu
.DEFAULT_GOAL := dev


# Stackhero dla Python wykona regułę "run" na Twojej instancji.
# To jest polecenie do uruchomienia w środowiskach produkcji i staging.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# Polecenie do użycia w środowisku deweloperskim
dev:
  python app.py


# Reguła "deploy" do wdrażania na instancji "stackhero".
# Odpowiednia, jeśli masz tylko jedną instancję.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# Reguły "deploy-*" wdrażają na instancję o nazwie "stackhero-*".
# Na przykład, uruchomienie "make deploy-production" wdraża na "stackhero-production",
# lub "make deploy-staging" wdraża na "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Wewnętrzna reguła wdrażania. Nie modyfikuj jej.
deploy-script:
  @echo "Wdrażanie gałęzi \"${DEPLOY_BRANCH}\" do \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Nie można wdrożyć, ponieważ są niezatwierdzone zmiany:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Możesz użyć tego polecenia, aby zatwierdzić zmiany:"; \
    echo "git add -A . && git commit -m \"Twoja wiadomość\""; \
    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 "Nic nowego do wdrożenia... Wymusić wdrożenie (to stworzy nowy commit)? (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 "Nic do wdrożenia!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}