Python: Version améliorée du Makefile

Cette documentation fait partie du guide Usages avancés. Consultez le guide complet ici : Aller plus loin avec vos déploiements Python.

👋 Bienvenue dans la documentation Stackhero !

Stackhero offre une solution Python cloud clé en main conçue pour simplifier vos déploiements :

  • Déployez votre application en production en quelques secondes grâce à un simple git push.
  • Utilisez votre propre nom de domaine, avec une configuration automatique du certificat HTTPS pour des connexions sécurisées gérées pour vous.
  • Profitez de sauvegardes automatiques, de mises à jour en un clic et d'une tarification prévisible, afin que vous puissiez vous concentrer sur votre code plutôt que sur la gestion de l'infrastructure.
  • Bénéficiez d'une performance et d'une sécurité accrues sur une infrastructure privée et dédiée. Votre environnement est isolé et protégé.

Gagnez du temps et simplifiez votre workflow : votre code peut être en ligne avec l'hébergement Python cloud de Stackhero en seulement 5 minutes.

Voici un Makefile amélioré qui prend en charge plusieurs règles :

  • make dev (ou simplement make) : Démarre l'application en mode développement.
  • make deploy : Déploie l'application sur le distant nommé stackhero. Cela fonctionne bien lorsque vous avez une seule instance Stackhero.
  • make deploy-production : Déploie l'application sur le distant nommé stackhero-production.
  • make deploy-staging : Déploie l'application sur le distant nommé stackhero-staging.

Ce Makefile est conçu pour gérer les situations où le code n'a pas changé en évitant l'erreur "Everything up-to-date".

Copiez et collez le contenu suivant comme votre nouveau Makefile :

# Règle à exécuter par défaut lors de l'invocation de "make" sans argument
.DEFAULT_GOAL := dev


# Stackhero pour Python exécutera la règle "run" sur votre instance.
# C'est la commande à exécuter sur vos environnements de production et de staging.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# La commande à utiliser dans l'environnement de développement
dev:
  python app.py


# Règle "deploy" pour déployer sur l'instance "stackhero".
# Convient si vous n'avez qu'une seule instance.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# Les règles "deploy-*" déploient sur une instance nommée "stackhero-*".
# Par exemple, exécuter "make deploy-production" déploie sur "stackhero-production",
# ou "make deploy-staging" déploie sur "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Règle de déploiement interne. Ne pas la modifier.
deploy-script:
  @echo "Déploiement de la branche \"${DEPLOY_BRANCH}\" vers \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Impossible de déployer car il y a des modifications non validées :"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Vous pouvez utiliser cette commande pour valider les modifications :"; \
    echo "git add -A . && git commit -m \"Votre message\""; \
    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 "Rien de nouveau à déployer... Forcer le déploiement (cela créera un nouveau 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 "Rien à déployer !"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}