我考虑使用 Capistrano 在我的服务器上部署我的 Rails 应用程序。目前我正在使用一个脚本,它为我完成所有工作。但 Capistrano 看起来很不错,我想尝试一下。
我现在的第一个问题是:如何在开源项目中正确使用Capistrano?我不想发布我的deploy.rb有几个原因:
- 它包含有关我的服务器的重要信息。我不想发布它们:)
- 它包含我的服务器的配置。对于将该开源项目部署到自己的服务器的其他人来说,配置可能会有所不同。所以发布我的配置是毫无意义的,因为它对其他人来说毫无用处。
第二个问题:如何管理不同的环境? 背景:在我的服务器上,我为我的应用程序提供了两种不同的环境:使用当前稳定版本分支并位于 www.domain.com 下的稳定系统。以及在 dev.domain.com 下运行 master 分支的开发团队的集成环境。
如何告诉 Capistrano 部署稳定系统或开发系统?
最佳答案
我在 Capistrano 中处理敏感信息(密码等)的方式与我处理一般信息的方式相同:我使用 APP_CONFIG
来自未 checkin 版本控制的 YAML 文件的哈希值。这是一种经典技术,例如在 RailsCast #226 ,或参见this StackOverflow question .
在 Capistrano 中使用这种方法时,您必须做一些稍微不同的事情:
通常
APP_CONFIG
已从您的config/application.rb
加载(所以它发生得足够早,可以在其他地方使用);但卡皮斯特拉诺cap
任务不会加载该文件。但你可以从config/deploy.rb
加载它也;这是一个人为的config/deploy.rb
的顶部使用需要用户名/密码的 HTTP 存储库的文件。require 'bundler/capistrano' APP_CONFIG = YAML.load_file("config/app_config.yml") set :repo_user, APP_CONFIG['repo_user'] set :repo_password, APP_CONFIG['repo_password'] set :repository, "http://#{repo_user}:#{repo_password}@hostname/repositoryname.git/" set :scm, :git # ...
config/app_config.yml
文件未 checkin 版本控制(将该路径放入.gitignore
或类似路径中);我通常 checkinconfig/app_config.yml.sample
显示需要配置的参数:repo_user: 'usernamehere' repo_password: 'passwordhere'
如果您使用
APP_CONFIG
对于您的应用程序,它可能需要在不同的部署主机上具有不同的值。因此,让您的 Capistrano 设置从shared/
创建一个符号链接(symbolic link) checkout 后每个版本的目录。您希望在部署过程的早期执行此操作,因为应用迁移可能需要数据库密码。所以在你的config/deploy.rb
把这个:after 'deploy:update_code', 'deploy:symlink_app_config' namespace :deploy do desc "Symlinks the app_config.yml" task :symlink_app_config, :roles => [:web, :app, :db] do run "ln -nfs #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml" end end
现在,对于问题的第二部分(关于部署到多个主机),您应该为每个主机配置单独的 Capistrano“阶段”。您将所有阶段中常见的所有内容都放在 config/deploy.rb
中。文件,然后将每个阶段特有的所有内容放入 config/deploy/[stagename].rb
中文件。您将在 config/deploy.rb
中有一个部分定义阶段:
# Capistrano settings
require 'bundler/capistrano'
require 'capistrano/ext/multistage'
set :stages, %w(preproduction production)
set :default_stage, 'preproduction'
(您可以根据需要将阶段称为任何名称;Capistrano 阶段名称与 Rails 环境名称是分开的,因此阶段不必称为“生产”。)现在,当您使用 cap
时命令,在 cap
之间插入阶段名称和目标名称,例如:
$ cap preproduction deploy #deploys to the 'preproduction' environment
$ cap production deploy #deploys to the 'production' environment
$ cap deploy #deploys to whatever you defined as the default
关于开源项目和不同环境中的 Capistrano,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527524/