Ruby: 改进版 Makefile

本文件是高级用法指南的一部分。您可以在这里查看完整指南:深入了解 Ruby 部署

👋 欢迎来到 Stackhero 文档!

Stackhero 提供现成的 Ruby cloud 解决方案,具有众多优势,包括:

  • 通过简单的 git push 在几秒钟内 部署您的应用程序。
  • 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
  • 享受 自动备份一键更新,以及简单、透明和可预测的定价带来的安心。
  • 通过专用私有 VM获得最佳的性能和强大的安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Ruby cloud hosting 解决方案!

以下是一个改进的 Makefile,它支持多个常见任务的规则:

  • make dev(或简单地 make):以开发模式启动应用程序。
  • make deploy:将应用程序部署到名为 stackhero 的远程(理想情况下,当您只有一个 Stackhero 实例时)。
  • make deploy-production:将应用程序部署到名为 stackhero-production 的远程。
  • make deploy-staging:将应用程序部署到名为 stackhero-staging 的远程。

Makefile 旨在处理代码已部署的情况,避免 "Everything up-to-date" 错误。

将以下内容复制并粘贴到您的新 Makefile 中:

# 默认执行规则,当调用 "make" 时不带参数
.DEFAULT_GOAL := dev


# Stackhero for Ruby 将在您的实例上执行 "run" 规则。
# 这是在生产和 staging 平台上运行的命令。
run:
  rake assets:precompile
  rake db:migrate RAILS_ENV=production
  RAILS_ENV=production bundle exec puma -C config/puma.rb


# 在开发环境中运行的命令
dev:
  RAILS_ENV=development rails server -b 0.0.0.0


# "deploy" 规则部署到 "stackhero" 实例。
# 适用于只有一个实例的情况。
deploy:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero DEPLOY_BRANCH=main


# "deploy-*" 规则部署到 "stackhero-*" 实例。
# 例如,运行 "make deploy-production" 部署到 "stackhero-production",
# 或 "make deploy-staging" 部署到 "stackhero-staging"。
deploy-%:
  @$(MAKE) -s deploy-script DEPLOY_REMOTE=stackhero-$* DEPLOY_BRANCH=main


# 内部部署规则。请勿修改。
deploy-script:
  @echo "Deploying branch \"${DEPLOY_BRANCH}\" to \"${DEPLOY_REMOTE}\"..."
  @echo

  @if [ -n "$$(git status --porcelain)" ]; then \
    echo "无法部署,因为有未提交的更改:"; \
    echo "\e[0m"; \
    git status -s; \
    echo ""; \
    echo "\e[0;31m"; \
    echo "您可以使用此命令提交更改:"; \
    echo "git add -A . && git commit -m \"Your 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 "没有新内容可部署... 强制部署(这将创建一个新提交)?(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 "没有可部署的内容!"; \
      exit 1; \
      ;; \
    esac \
  fi

  git push ${DEPLOY_REMOTE} ${DEPLOY_BRANCH}