开源项目和不同环境中的Capistrano

时间:2012-11-23 10:49:37

标签: capistrano

我考虑使用Capistrano在我的服务器上部署我的rails应用程序。目前我正在使用一个脚本,它为我完成所有工作。但卡皮斯特拉诺看起来很漂亮,我想尝试一下。

我现在的第一个问题是:如何在开源项目中正确使用Capistrano?我不想发布我的deploy.rb有几个原因:

  1. 它包含有关我的服务器的明智信息。我不想发布它们:)
  2. 它包含MY服务器的配置。对于将该开源项目部署到其自己的服务器的其他人,配置可能会有所不同。因此发布我的配置毫无意义,因为它对其他人来说毫无用处。
  3. 第二个问题/问题:如何管理不同的环境? 背景:在我的服务器上,我为我的应用程序提供了两种不同的环境:使用当前稳定版本分支的稳定系统,位于www.domain.com下。以及运行master分支的dev.domain.com下的开发团队的集成环境。

    如何告诉Capistrano部署稳定系统或开发系统?

1 个答案:

答案 0 :(得分:3)

我在Capistrano中处理敏感信息(密码等)的方式与我处理它们的方式相同:我使用来自未检入版本控制的YAML文件的APP_CONFIG哈希。这是一种经典技术,例如:在RailsCast #226中,或参见this StackOverflow question

在Capistrano中使用这种方法时,您需要做一些不同的事情:

  1. 通常APP_CONFIG会从config/application.rb加载cap(所以它发生得足够早,可以在其他地方使用);但Capistrano 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
  2. .gitignore文件未检入版本控制(将该路径放在config/app_config.yml.sample或类似内容中);我通常会检查repo_user: 'usernamehere' repo_password: 'passwordhere' ,其中显示了需要配置的参数:

    APP_CONFIG
  3. 如果您的应用程序使用shared/,则可能需要在不同的部署主机上使用不同的值。因此,您的Capistrano设置会在签出后从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 中放了这个:

    config/deploy.rb
  4. 现在,对于问题的第二部分(关于部署到多个主机),您应该为每个主机配置单独的Capistrano“阶段”。您将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' 中有一个定义阶段的部分:

    cap

    (您可以随意调用各个阶段; Capistrano阶段名称与Rails环境名称分开,因此阶段不必称为“生产”。)现在,当您使用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 和目标名称之间插入阶段名称,例如

    {{1}}