Ruby: Versión mejorada del Makefile

Esta documentación forma parte de la guía Usos avanzados. Consulte la guía completa aquí: Avanzando con sus despliegues de Ruby.

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero ofrece una solución Ruby cloud lista para usar que proporciona una serie de beneficios, incluyendo:

  • Despliegue su aplicación en segundos con un simple git push.
  • Use su propio nombre de dominio y benefíciese de la configuración automática de certificados HTTPS para una mayor seguridad.
  • Disfrute de la tranquilidad con copias de seguridad automáticas, actualizaciones con un clic, y precios sencillos, transparentes y predecibles.
  • Obtenga un rendimiento óptimo y una seguridad robusta gracias a una VM privada y dedicada.

Ahorre tiempo y simplifique su vida: solo toma 5 minutos probar la solución de Ruby cloud hosting de Stackhero!

A continuación se muestra un Makefile mejorado que acomoda múltiples reglas para tareas comunes:

  • make dev (o simplemente make): Inicia la aplicación en modo desarrollo.
  • make deploy: Despliega la aplicación en el remoto llamado stackhero (ideal cuando tiene una sola instancia de Stackhero).
  • make deploy-production: Despliega la aplicación en el remoto llamado stackhero-production.
  • make deploy-staging: Despliega la aplicación en el remoto llamado stackhero-staging.

Este Makefile está diseñado para manejar casos donde el código ya ha sido desplegado, evitando el error "Everything up-to-date".

Copie y pegue el siguiente contenido en su nuevo Makefile:

# Regla a ejecutar por defecto al invocar "make" sin argumento
.DEFAULT_GOAL := dev


# Stackhero para Ruby ejecutará la regla "run" en su instancia.
# Este es el comando para ejecutar en las plataformas de producción y staging.
run:
  rake assets:precompile
  rake db:migrate RAILS_ENV=production
  RAILS_ENV=production bundle exec puma -C config/puma.rb


# Comando para ejecutar en el entorno de desarrollo
dev:
  RAILS_ENV=development rails server -b 0.0.0.0


# La regla "deploy" despliega en la instancia "stackhero".
# Adecuado cuando solo tiene una instancia.
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# La regla "deploy-*" despliega en la instancia "stackhero-*".
# Por ejemplo, ejecute "make deploy-production" para desplegar en "stackhero-production",
# o "make deploy-staging" para desplegar en "stackhero-staging".
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# Regla de despliegue interno. No modificar.
deploy-script:
  @echo "Desplegando la rama \"${DEPLOY_BRANCH}\" a \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "No se puede desplegar porque hay cambios no confirmados:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "Puede usar este comando para confirmar los cambios:"; \
    echo "git add -A . && git commit -m \"Su mensaje\""; \
    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 nuevo para desplegar... ¿Forzar el despliegue (esto creará un nuevo 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 que desplegar!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}