【问题标题】:Capistrano in Open Source Projects and different environments开源项目和不同环境中的 Capistrano
【发布时间】:2012-11-23 10:49:37
【问题描述】:

我考虑使用 Capistrano 在我的服务器上部署我的 Rails 应用程序。目前我正在使用一个脚本,它为我完成了所有的工作。但是 Capistrano 看起来不错,我想试一试。

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

  1. 它包含有关我的服务器的敏感信息。我不想发布它们:)
  2. 它包含 MY 服务器的配置。对于将开源项目部署到自己的服务器的其他人,配置可能会有所不同。所以发布我的配置是非常没有意义的,因为它对其他人毫无用处。

第二个问题/问题:我如何管理不同的环境? 背景:在我的服务器上,我为我的应用程序提供了两种不同的环境:使用当前稳定版本分支并位于 www.domain.com 下的稳定系统。以及在 dev.domain.com 下运行 master 分支的开发团队的集成环境。

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

【问题讨论】:

  • 好的,2 周没有答案。似乎 capistrano 不适合该用例。

标签: capistrano


【解决方案1】:

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

在将这种方法与 Capistrano 一起使用时,您必须做一些不同的事情:

  1. 通常APP_CONFIG 是从您的config/application.rb 加载的(因此它发生得足够早,可以在其他任何地方使用);但 Capistrano cap 任务不会加载该文件。但是你也可以从config/deploy.rb 加载它;这是使用需要用户名/密码的 HTTP 存储库的人为设计的 config/deploy.rb 文件的顶部。

    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
    # ...
    
  2. config/app_config.yml 文件未检入版本控制(将该路径放入您的.gitignore 或类似文件中);我通常会签入显示需要配置的参数的config/app_config.yml.sample

    repo_user: 'usernamehere'
    repo_password: 'passwordhere'
    
  3. 如果您将APP_CONFIG 用于您的应用程序,它可能需要在您的不同部署主机上具有不同的值。因此,让您的 Capistrano 设置在签出后从 shared/ 目录到每个版本的符号链接。您希望在部署过程的早期执行此操作,因为应用迁移可能需要数据库密码。所以在你的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多