Python: Versão melhorada do Makefile

Esta documentação faz parte do guia Usos avançados. Consulte o guia completo aqui: Avançar com as suas implementações Python.

👋 Bem-vindo à documentação do Stackhero!

Stackhero oferece uma solução cloud Python pronta a usar que proporciona uma série de benefícios, incluindo:

  • Implemente a sua aplicação em segundos com um simples git push.
  • Utilize o seu próprio nome de domínio e beneficie da configuração automática de certificados HTTPS para uma segurança reforçada.
  • Desfrute de tranquilidade com backups automáticos, atualizações com um clique, e preços simples, transparentes e previsíveis.
  • Obtenha performance ótima e segurança robusta graças a uma VM privada e dedicada.

Poupe tempo e simplifique a sua vida: só leva 5 minutos para experimentar a solução de hospedagem cloud Python do Stackhero!

Abaixo está um Makefile melhorado que suporta múltiplas regras:

  • make dev (ou simplesmente make): Inicia a aplicação em modo de desenvolvimento.
  • make deploy: Implementa a aplicação no remoto chamado stackhero. Isto funciona bem quando tem uma única instância Stackhero.
  • make deploy-production: Implementa a aplicação no remoto chamado stackhero-production.
  • make deploy-staging: Implementa a aplicação no remoto chamado stackhero-staging.

Este Makefile é projetado para lidar com situações onde o código não mudou, evitando o erro "Everything up-to-date".

Copie e cole o seguinte conteúdo como o seu novo Makefile:

# Regra a executar por padrão ao invocar "make" sem argumento
.DEFAULT_GOAL := dev


# Stackhero para Python executará a regra "run" na sua instância.
# Este é o comando a executar nos seus ambientes de produção e staging.
run:
  ENV=production gunicorn app:app \
    --error-logfile - \
    -b 0.0.0.0:8080


# O comando a usar no ambiente de desenvolvimento
dev:
  python app.py


# Regra "deploy" para implementar na instância "stackhero".
# Adequado se tiver apenas uma instância.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# As regras "deploy-*" implementam numa instância chamada "stackhero-*".
# Por exemplo, executar "make deploy-production" implementa em "stackhero-production",
# ou "make deploy-staging" implementa em "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Regra de implementação interna. Não a modifique.
deploy-script:
  @echo "Implementando o ramo \"${DEPLOY_BRANCH}\" para \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Não é possível implementar porque há alterações não confirmadas:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Pode usar este comando para confirmar as alterações:"; \
    echo "git add -A . && git commit -m \"Sua mensagem\""; \
    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 "Nada novo para implementar... Forçar implementação (isto criará um novo 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 "Nada para implementar!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}