教程:使用 Capistrano 部署 Rails 应用程序
Capistrano 是一个使用部署脚本部署应用程序的工具。 要执行部署,您可以使用预定义任务或创建自定义 Rake 任务。 RubyMine 允许您通过双击 Ctrl 快速运行 Capistrano 任务,并使用 运行配置 配置 Capistrano 运行选项。 您可以 自定义运行配置 以传递特定任务参数、选择所需的阶段等。
在本教程中,我们将向您展示如何使用 Capistrano 将 示例 Rails 应用程序 部署到远程服务器。 作为应用程序服务器,将使用 Passenger 和 Nginx 的组合。
先决条件
在本教程中,我们将使用两台机器来演示应用程序的部署:
在 Web 服务器上安装 rbenv 和 Ruby
首先,我们需要在 Web 服务器上安装 Ruby 解释器。 我们将使用 rbenv 和 ruby-build 插件来完成此操作。 要在服务器上执行所需操作,我们将使用嵌入到 RubyMine 中的终端模拟器。
在 RubyMine 中打开 示例 Rails 应用程序 并按照以下步骤操作。
转到 。 在调用的对话框中,指定 Web 服务器地址和部署用户的凭据。 点击 确定。

安装 构建 Ruby 源代码 、安装 Passenger、使用 SQLite 等所需的包。 此外,安装 Node.js 和 Yarn 以管理 JavaScript 依赖项。
sudo apt-get update sudo apt-get install curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev dirmngr gnupg apt-transport-https ca-certificates nodejs yarn按照 Basic GitHub Checkout 章节中的描述安装 rbenv。 然后,按照 Installation 中的说明安装编译和安装 Ruby 所需的 ruby-build 插件。
通过执行以下命令, 安装应用程序使用的 Ruby 发行版。
rbenv install 2.6.3 rbenv global 2.6.3最后,安装 Bundler 来管理项目 gems。
gem install bundler
安装并配置 Passenger 和 Nginx
作为应用程序服务器,我们将使用 Passenger 和 Nginx 的组合。 让我们将它们安装到 Web 服务器并调整其配置。
要安装 Passenger 包,请执行以下命令。
#(a) Install the PGP key sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 #(b) App the APT repository sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update #(c) Install Passenger and Nginx module sudo apt-get install -y libnginx-mod-http-passenger #(d) Make sure the configuration files exist if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi sudo ls /etc/nginx/conf.d/mod-http-passenger.conf现在我们需要将 Passenger 指向正确版本的 Ruby。 使用 Nano 打开 mod-http-passenger.conf 配置文件。
sudo nano /etc/nginx/conf.d/mod-http-passenger.conf然后以以下方式更改 passenger_ruby 选项。
passenger_ruby /home/deploy/.rbenv/shims/ruby;保存 mod-http-passenger.conf 文件并关闭它。
让我们移除默认的 Nginx 服务器……
sudo rm /etc/nginx/sites-enabled/default……并为我们的示例应用程序添加一个。
sudo nano /etc/nginx/sites-enabled/sample_rails_app在打开的 sample_rails_app 文件中,指定以下配置。
server { listen 80; listen [::]:80; server_name _; root /home/deploy/sample_rails_app/current/public; passenger_enabled on; passenger_app_env staging; }最后,启动 Nginx 服务。
sudo service nginx start
安装 Capistrano gems
现在我们准备将 Capistrano 集成到我们的应用程序中。
首先,我们将创建一个用于部署应用程序的单独分支。 按 Alt+` ,在调用的弹出窗口中选择 分支 ,然后选择 新建分支。 在 创建新分支 对话框中,指定分支名称(在我们的示例中为 capistrano-deploy ),然后单击 创建。

打开项目 Gemfile 并添加以下 Capistrano gems。
gem 'capistrano', '3.11.2' gem 'capistrano-rails', '1.4.0' gem 'capistrano-rbenv', '2.1.4 ' gem 'capistrano-passenger', '0.2.0'将光标放在任何高亮显示的 gem 上,然后按 Alt+Enter 使用 Bundler 安装它们。

Capify 应用程序
在这一部分,我们将初始化 Capistrano 并配置部署脚本。
要 Capify 应用程序,请从主菜单中选择 。 以下文件将被添加到项目中。
Capfile
config/deploy.rb
staging.rb 和 production.rb 位于 config/environments 目录中
请注意, 执行
cap install命令。 运行此命令后,RubyMine 会创建用于执行install任务的运行配置。 如果需要,您可以 自定义此配置 以传递特定参数。打开 Capfile 并添加以下行以加载所需的依赖项。
require "capistrano/rails" require "capistrano/rbenv" require "capistrano/passenger"在同一个文件中,为 rbenv 指定以下设置。
set :rbenv_type, :user set :rbenv_ruby, '2.6.3'在配置部署设置之前, 提交并推送 更改到远程存储库。 在我们的教程中,它将是示例 Rails 应用程序的 capistrano-deploy 分支。
打开 config/deploy.rb 文件。 在这里,您需要指定 Git 存储库的详细信息以及 Web 服务器上的部署路径。
set :application, "sample_rails_app" set :repo_url, "https://github.com/JetBrains/sample_rails_app" set :branch, "capistrano-deploy" set :deploy_to, "/home/deploy/#{fetch :application}" append :linked_files, "config/master.key"最后,打开 config/deploy/staging.rb 并按以下方式修改它以指向我们的 Web 服务器地址。
server "sample-web-server", user: "deploy", roles: %w{app db web}
提供自定义凭据
由于我们使用的是 staging 配置进行部署,因此我们需要在 Rails 应用程序中添加 staging 环境。 然后,我们应该提供自定义凭据。
按照 创建 Rails 环境 中的描述创建 staging 环境。 在我们的示例中,创建的配置( config/environments/staging.rb )复制了 开发 配置,除了以下一行。
config.require_master_key = true此选项指定用于解密凭据的主密钥应在我们的 Web 服务器上可用。
现在我们需要生成加密的 credentials.yml.enc 文件和 master.key 用于 加密/解密。 通过从主菜单中选择 打开本地终端并执行以下命令。
rails secret EDITOR="mine" bin/rails credentials:editconfig/master.key 和 config/credentials.yml.enc 文件将被生成。 按照 将文件添加到 Git 中的描述将 config/credentials.yml.enc 文件添加到 VCS。
由于 config/master.key 文件应放置在 VCS 之外,我们需要创建一个自定义任务将此文件上传到我们的 Web 服务器。 在项目视图 Alt+1 中打开 lib/capistrano/tasks 目录,并创建一个包含以下内容的新 setup.rake 文件。
namespace :deploy do namespace :check do before :linked_files, :set_master_key do on roles(:app), in: :sequence, wait: 10 do unless test("[ -f #{shared_path}/config/master.key ]") upload! 'config/master.key', "#{shared_path}/config/master.key" end end end end end提交并推送 更改到远程存储库。
部署您的应用程序
完成上述所有步骤后,我们准备将 Rails 应用程序部署到 Web 服务器。
按两次 Ctrl 并在调用的弹出窗口中输入
cap staging deploy。 按 Enter 开始部署。
等待 Capistrano 完成部署应用程序所需的所有步骤。 您可以在 运行 工具窗口 Alt+4 中查看进度。

打开浏览器并指定应用程序地址。 在我们的示例中,它将是 http://sample-web-server 。

在运行 Capistrano 任务后,RubyMine 会自动创建一个特殊的配置文件——一个临时的 运行/调试配置。 您可以 自定义此配置的设置 ,例如,您可以传递任务参数、指定环境变量等。 然后,您可以 保存 自定义配置,以便将来快速运行此配置。
Capistrano 运行/调试配置
当您运行 Capistrano 任务(例如, install 或 deploy )时,RubyMine 会自动创建一个相应的 Capistrano 临时配置 ,可以保存。 如果必要,您可以从预定义模板中 Capistrano 手动 创建 run/debug 配置。
要自定义 Capistrano 运行/调试配置,请执行以下操作:
通过以下方法之一打开 运行/调试配置 对话框:
从主菜单中选择 。
在 Navigation bar 可见 () 的情况下,从运行/调试配置选择器中选择 。

请按 Alt+Shift+F10 然后按 0。
在打开的 运行/调试配置 对话框中,选择 Capistrano 组中的所需配置,并指定其设置。

例如,您可以在 配置 选项卡中指定以下设置:
选项
描述
任务名称
请指定要执行的 Capistrano 任务的名称。 请注意,您可以使用 自动补全 Ctrl+Space 查看可用任务。
示例:
deploy、install参数
指定要传递给 Capistrano 任务的参数。 参数应以空格分隔。
示例:
--roles=app,web、--hosts=web-server-1,web-server-2阶段
请选择所需的阶段。 阶段可以在 config/deploy.rb 文件中配置,该文件会在 Capify 应用程序 后出现。
示例:
staging、生产启用调用/执行跟踪,启用完整回溯(--trace)
启用
--traceCapistrano 命令行选项。工作目录
指定正在运行的任务使用的工作目录。
环境变量
将 环境变量 列表指定为名称-值对,并用分号分隔。 或者,单击省略号按钮,在 环境变量 对话框中创建变量并指定其值。
Ruby 参数
指定要传递给 Ruby 解释器的 command-line arguments。
Ruby 解释器
指定用于运行任务的 Ruby 解释器。 您可以选择项目默认的 Ruby 解释器,或者从已配置的 Ruby 解释器列表中选择一个不同的解释器。