Ruby: 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 Ruby.

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

A Stackhero oferece uma solução Ruby cloud 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 desempenho ótimo 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 Ruby cloud hosting da Stackhero!

Abaixo está um Makefile melhorado que acomoda várias regras para tarefas comuns:

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

Este Makefile é projetado para lidar com casos onde o código já foi implementado, evitando o erro "Everything up-to-date".

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

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


# Stackhero para Ruby executará a regra "run" na sua instância.
# Este é o comando a executar nas plataformas de produção e staging.
run:
  rake assets:precompile
  rake db:migrate RAILS_ENV=production
  RAILS_ENV=production bundle exec puma -C config/puma.rb


# Comando a executar no ambiente de desenvolvimento
dev:
  RAILS_ENV=development rails server -b 0.0.0.0


# A regra "deploy" implementa na instância "stackhero".
# Adequado quando tem apenas uma instância.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# A regra "deploy-*" implementa na instância "stackhero-*".
# Por exemplo, execute "make deploy-production" para implementar em "stackhero-production",
# ou "make deploy-staging" para implementar em "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


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

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "Não é possível implementar porque há alterações não comprometidas:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Pode usar este comando para comprometer 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}