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}