使用 Mina 轻松(且真正、真正快速地)部署 Rails!





5.00/5 (1投票)
使用 Mina 快速轻松地部署 Ruby on Rails 应用程序。
摘要
将 Ruby on Rails 应用程序部署到生产 Linux 服务器可能会很麻烦。使用 Mina 可以使事情变得更容易。
引言
Ruby on Rails 框架自诩为将 Web 应用程序发布到真实世界的最简单平台之一,在使用该框架十年后,我不得不承认这一点。它抽象了不那么令人愉快的事情,例如数据库连接、编写 SQL 查询、低级别地跟踪会话 cookie 等。
Rails 方面不那么令人愉快的是将其部署到生产服务器。诚然,Rails 自从最初需要手动在 Linux 服务器上安装 Mongrel 服务器和某种代理与它们通信以来,已经走了很长一段路。但它仍然具有很高的学习曲线,特别是如果您没有花大量时间在 Linux 命令行上。即使成功设置后,推送最新的功能或错误修复到您的应用程序也不是一件容易的事。
最近,我一直在使用 Mina 来部署我的应用程序。当您使用 Mina 设置应用程序然后告诉它进行部署时,它会将部署编译为 bash 脚本,通过 SSH 将脚本上传到您的服务器,然后运行它。这意味着每次部署只有一个 SSH 会话,这比其他系统使用的“每个命令一个 SSH 会话”的安排要快得多。最终结果是部署速度非常快。我们说的是秒而不是分钟。即使对于我的一个大型应用程序,部署通常也只需要不到三秒钟即可完成。
想看看它是如何工作的吗?让我们开始学习如何使用 Mina 部署一个简单的 Rails 应用程序。下面的命令和代码示例假定您使用的是 Mac OS 开发环境,部署到 Linux 服务器,并且您已经将 SSH 密钥添加到了服务器。
入门
打开项目的 Gemfile,然后添加以下行
gem 'mina'
保存文件,然后转到命令行并键入
$ bundle install
该命令运行后,您现在可以使用以下命令设置 Mina 与您的项目
$ mina init
init 命令将在您的项目(位于 config/deploy.rb)中安装一个新文件。在您选择的文本编辑器中打开该文件,让我们看一下。确保将以下行设置为对您的应用程序有意义的值
set :domain, 'mysite.com' set :deploy_to, '/home/deployer/mysite/' #path on server you want to deploy to set :repository, 'git@github.com:<user>/<project>.git' # change this to reflect your username and project. set :branch, ENV["BRANCH"] || 'master'
您可能想知道关于用于部署的分支的最后一行。这意味着 Mina 将假定您想使用您的源代码控制系统的 master 分支,但如果您愿意,可以在部署时在命令行上指定一个不同的分支。
再看几个项目
set :shared_paths, ['config/database.yml', 'config/secrets.yml', 'log'] set :user, 'deployer' # Username in the server to SSH to... set :forward_agent, true # SSH forward_agent.
我们来逐一介绍这些
- `shared_paths` 指令告诉 Mina 在部署到服务器后要链接到您的应用程序的哪些文件或目录。一般而言,您会希望 `database.yml` 和 `secrets.yml` 文件属于此安排,但您的需求可能会有所不同。在此处包含日志也是个好主意,因为您可能不希望每次部署时都丢失 Rails 日志。
- `user` 指令很简单——只需指定 Mina 应该登录的服务器上的用户。您必须取消注释此行。
- 如果取消注释 `forward_agent` 行,它将允许您通过服务器将本地开发计算机上的 SSH 密钥传递到 GitHub 或托管您源代码的任何其他地方。这可以防止您为服务器用于与 GitHub 交互而创建特殊的部署密钥。我总是取消注释此行。
设置,然后部署
您应该不需要对 setup 部分做太多更改,但最好还是检查一下。找到 `config/deploy.rb` 文件中看起来像下面的部分
task :setup => :environment do queue! %[mkdir -p "#{deploy_to}/#{shared_path}/log"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/#{shared_path}/log"] queue! %[touch "#{deploy_to}/#{shared_path}/config/database.yml"] queue! %[touch "#{deploy_to}/#{shared_path}/config/secrets.yml"] queue %[echo "-----> Be sure to edit '#{deploy_to}/#{shared_path}/config/database.yml' and 'secrets.yml'."] if repository repo_host = repository.split(%r{@|://}).last.split(%r{:|\/}).first repo_port = /:([0-9]+)/.match(repository) && /:([0-9]+)/.match(repository)[1] || '22' queue %[ if ! ssh-keygen -H -F #{repo_host} &>/dev/null; then ssh-keyscan -t rsa -p #{repo_port} -H #{repo_host} >> ~/.ssh/known_hosts fi ] end end
如您所见,根据这些说明,Mina 将在初始设置过程中创建需要链接的必要文件和/或目录。我们现在只是使用一个简单的示例应用程序来说明基础知识,所以我们不需要在这里更改任何内容。
保存 `config/deploy.rb` 文件,然后转到命令行并键入以下命令
$ mina setup -v
这将导致 Mina 在您的服务器上设置必要的目录和符号链接以进行部署。`-v` 开关告诉 Mina 详细显示,以便您可以看到它在做什么。
设置完成后,您就可以部署了。输入以下命令
$ mina deploy
完成此操作后,您就完成了!不算太难,对吧?这种简单的设置和惊人的速度使 Mina 成为我选择的 Rails 部署工具。
如果您在 `config/deploy.rb` 文件中使用了我之前演示过的分支调整,您可以使用此语法部署不同的分支
$ BRANCH=my-branch mina deploy
很棒,很棒的任务
我对 Mina 如此着迷的另一个原因是因为它包含一些非常好的任务,可以帮助我们更轻松地处理生产服务器。以下是我最喜欢的一些
mina console # Starts an interactive console mina log # Tail log from server mina ssh # Open an ssh session to the server and cd to deploy_to folder
我经常需要查看服务器的日志,或者从 Rails 控制台运行一些东西,所以这些任务可以节省大量时间。您可以通过运行以下命令查看可用任务的完整列表
$ mina tasks
如果您一直在寻找 Rails 的部署选项,不妨试试 Mina。即使您一直在使用流行的 Capistrano 系统进行部署,Mina 也值得一看。它将消除 Rails 开发中的一个痛点。
历史
这是文章的第一个版本。