Python: Versione migliorata del Makefile

Questa documentazione fa parte della guida Utilizzi avanzati. Consulta la guida completa qui: Approfondire i tuoi deployment Python.

👋 Benvenuto nella documentazione di Stackhero!

Stackhero offre una soluzione Python cloud pronta all'uso, progettata per semplificare il processo di deployment:

  • Distribuisci la tua applicazione in produzione in pochi secondi con un semplice git push.
  • Utilizza il tuo nome di dominio, con configurazione automatica del certificato HTTPS per connessioni sicure gestite direttamente da noi.
  • Affidati a backup automatici, aggiornamenti con un clic e prezzi prevedibili, così puoi concentrarti sul tuo codice invece che sulla gestione dell'infrastruttura.
  • Approfitta di elevate prestazioni e sicurezza su un'infrastruttura privata e dedicata. Il tuo ambiente è isolato e protetto.

Risparmia tempo e semplifica il tuo workflow: il tuo codice può essere operativo con il Python cloud hosting di Stackhero in soli 5 minuti.

Di seguito è riportato un Makefile migliorato che supporta più regole:

  • make dev (o semplicemente make): Avvia l'applicazione in modalità sviluppo.
  • make deploy: Distribuisce l'applicazione sul remoto chiamato stackhero. Funziona bene quando hai una sola istanza Stackhero.
  • make deploy-production: Distribuisce l'applicazione sul remoto chiamato stackhero-production.
  • make deploy-staging: Distribuisce l'applicazione sul remoto chiamato stackhero-staging.

Questo Makefile è progettato per gestire situazioni in cui il codice non è cambiato evitando l'errore "Everything up-to-date".

Copia e incolla il seguente contenuto come tuo nuovo Makefile:

# Regola da eseguire di default quando si invoca "make" senza argomento
.DEFAULT_GOAL := dev


# Stackhero per Python eseguirà la regola "run" sulla tua istanza.
# Questo è il comando da eseguire sui tuoi ambienti di produzione e staging.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# Il comando da usare nell'ambiente di sviluppo
dev:
  python app.py


# Regola "deploy" per distribuire sull'istanza "stackhero".
# Adatto se hai solo un'istanza.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# Le regole "deploy-*" distribuiscono su un'istanza chiamata "stackhero-*".
# Ad esempio, eseguire "make deploy-production" distribuisce su "stackhero-production",
# o "make deploy-staging" distribuisce su "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Regola di deployment interna. Non modificarla.
deploy-script:
  @echo "Distribuzione del branch \"${DEPLOY_BRANCH}\" su \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Impossibile distribuire perché ci sono modifiche non commesse:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Puoi usare questo comando per commettere le modifiche:"; \
    echo "git add -A . && git commit -m \"Il tuo messaggio\""; \
    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 "Niente di nuovo da distribuire... Forzare il deployment (questo creerà un nuovo 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 "Niente da distribuire!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}