【问题标题】:Rails Automatic Builds with Capistrano使用 Capistrano 自动构建 Rails
【发布时间】:2012-12-29 06:39:57
【问题描述】:

我曾经是一名 .NET 人员,喜欢使用名为 CruiseControl.NET 的夜间构建系统(持续集成),每晚自动将我的应用程序部署到我的暂存环境。

现在我已经跳转到 Ruby on Rails 和 GitHub,我发现自己对如何设置等效的自动化夜间构建系统有点困惑。我想以 Rails 的方式正确地做事,但我可以使用正确的推动力。

这是我正在使用的...

  • Ruby on Rails 3.2.9(带有资产管道)
  • RVM
  • 阿帕奇 + 乘客
  • MySQL
  • Ubuntu 12.04(登台服务器操作系统)
  • GitHub (SCM)

我正在寻找满足这些要求的系统/解决方案:(最好使用 Capistrano...)

  • 将最新提交从我的 GitHub 存储库中的“主”分支部署到我的暂存服务器。
  • 一键按需构建:我想随时点击按钮或链接强制部署(或重新部署)
  • 能够在部署过程中在登台服务器上运行自定义命令(即“捆绑安装”、重新启动 Apache 等...)
  • 每天或在 GitHub 上提交后自动部署(可选

因为我从来没有先做一些研究才问这个问题,这里有一些我找到的相关资源,但无法破译

建议,有人吗?谢谢!

  • 大卫

【问题讨论】:

    标签: ruby-on-rails continuous-integration capistrano


    【解决方案1】:

    好吧,事实证明有很多关于如何为此目的使用 Capistrano 的好信息(包括 Prakash's reference),但似乎没有一个是完全全面的。

    经过几个小时的挑选指南、论坛、堆栈溢出问题后,我设法实现了大部分目标。为了节省其他人的时间,我将尝试提供我在原始问题的上下文中找到的答案和信息。


    更新

    原来我一直在寻找Jenkins:它是我之前使用的 CruiseControl 构建服务器应用程序的完美(甚至是改进)模拟。 Jenkins 是一个 Web 应用程序,它可以按计划启动构建,或者使用插件启动提交事件。它不包含实际部署我的 Rails 应用程序的功能,因此 Capistrano 介入其中。使用 Jenkins 的“shell 执行”构建任务来触发 Capistrano 部署,我能够实现上述所有目标。

    查看this guide了解更多详情。


    原帖:

    首先,Capistrano 可以用于构建系统,但它与 CruiseControl 完全不同。

    CruiseControl 是:

    • 在充当“构建服务器”的机器上运行的 Web 应用程序
    • 任何用户都可以访问网络应用程序来运行构建;用户无需进行任何设置或配置……它只是一个网页。
    • 该接口还提供了日志、责备、计划构建等功能......

    Capistrano 是:

    • 不是应用程序或服务,而是类似于rake 的gem;它具有与 CruiseControl 用于部署目的的 Ant 和 Nant 脚本类似的功能。
    • Capistrano 在用户的本地计算机(通常是 Rails 应用程序文件夹)上运行,并且需要对其端进行配置才能运行
    • 它通过 SSH 直接从用户的机器连接到远程服务器以执行部署(如果您不想授予用户 SSH 访问远程服务器的权限,这可能不是可取的)
    • 命令通过控制台运行,即cap deploy(这与“一键式”部署最接近。)
    • 它确实会生成日志、执行回滚等。
    • 它不会自行启动预定的构建(建议使用 cron)

    关于我原来的要求...

    将最新提交从我的 GitHub 存储库中的“主”分支部署到我的暂存服务器。

    配置 Capistrano 的 deploy.rb 文件将完成此操作。

    一键按需构建:我想随时点击按钮或链接强制部署(或重新部署)

    所有 Capistrano 部署都是通过“强制”完成的:您在控制台中手动运行“cap deploy”

    能够在登台服务器上运行自定义命令作为部署的一部分(即“捆绑安装”、重新启动 Apache 等...)

    配置 Capistrano 的 deploy.rb 文件将完成此操作。大多数这些命令都是开箱即用的。

    每天或在 GitHub 上提交后自动部署(可选)

    我还没有想出这个... cron 作业可能是最好的方法。

    设置 Capistrano

    首先从GitHub 开始本教程。在您的 Rails App 文件夹中,您应该会得到一个 Capfileconfig/deploy.rb 文件。

    为节省您一些时间,请复制并粘贴这些文件,然后根据您的需要调整设置。 以下文件配置用于:

    • 部署到测试环境
    • GitHub
    • 基于 RVM 的 Rails
    • 使用 Ruby 和 gemset 的显式版本
    • 包括未跟踪的文件(即您未提交给 SCM 的 database.yml 文件)
    • 使用 Rails 资产管道
    • 在每次部署时运行迁移和种子
    • 每次部署都重新启动基于 Apache 的Passenger

    Capfile

    # Set this if you use a particular version of Ruby or Gemset
    set :rvm_ruby_string, 'ruby-1.9.3-p286@global'
    #set :rvm_ruby_string, ENV['GEM_HOME'].gsub(/.*\//,"") # Read from local system
    
    require "bundler/capistrano"
    # Uncomment this if you're using RVM
    require "rvm/capistrano"
    
    load 'deploy'
    # Uncomment if you are using Rails' asset pipeline
    load 'deploy/assets'
    load 'config/deploy' # remove this line to skip loading any of the default tasks
    

    config/deploy.rb

    # BEGIN RUBY CONFIG
    # You can manually override path variables here
    # set :default_environment, {
    #     'PATH' => "/usr/local/bin:/bin:/usr/bin:/bin:/<ruby-dir>/bin",
    #     'GEM_HOME' => '<ruby-dir>/lib/ruby/gems/1.8',
    #     'GEM_PATH' => '<ruby-dir>lib/ruby/gems/1.8',
    #     'BUNDLE_PATH' => '<ruby-dir>/lib/ruby/gems/1.8/gems'  
    # }
    # This changes the default RVM bin path
    # set :rvm_bin_path, "~/bin"
    
    # If your remote server doesn't have a ~/.rvm directory, but is installed
    # at the /usr/local/rvm path instead, use this line
    set :rvm_type, :system
    # END RUBY CONFIG
    
    default_run_options[:pty] = true  # Must be set for the password prompt
                                      # from git to work
    
    # BEGIN MULTIPLE ENVIRONMENT DEPLOYS
    # Read the following URL if you need to deploy to different environments (test, development, etc)
    # https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension
    # set :stages, %w(production test)
    # set :default_stage, "test"
    # require 'capistrano/ext/multistage'
    # END MULTIPLE ENVIRONMENT DEPLOYS
    
    # BEGIN APPLICATION VARS
    set :application, "yourapp"
    set :rails_env, 'test'
    # END APPLICATION VARS
    
    # BEGIN PATH DEFINITIONS
    set(:releases_path)     { File.join(deploy_to, version_dir) }
    set(:shared_path)       { File.join(deploy_to, shared_dir) }
    set(:current_path)      { File.join(deploy_to, current_dir) }
    set(:release_path)      { File.join(releases_path, release_name) }
    # END PATH DEFINITIONS
    
    # BEGIN SCM VARS
    set :repository, "git@github.com:yourgithubuser/yourrepository.git"  # Your clone URL
    set :scm, "git"
    set :scm_username, "yourgithubuser"
    set :scm_password, proc{Capistrano::CLI.password_prompt('GitHub password:')}  # The deploy user's password
    set :branch, "master"
    # END SCM VARS
    
    
    # BEGIN SERVER VARS
    set :user, "ubuntu"  # The server's user for deploys
    role :web, "dev.#{application}" # The location of your web server i.e. dev.myapp.com
    role :app, "dev.#{application}" # The location of your app server i.e. dev.myapp.com
    role :db, "dev.#{application}", :primary => true  # The location of your DB server i.e. dev.myapp.com
    
    set :deploy_to, "/home/#{user}/www/#{application}"
    set :deploy_via, :remote_cache
    # Uncomment this if you want to store your Git SSH keys locally and forward
    # Else, it uses keys in the remote server's .ssh directory
    # ssh_options[:forward_agent] = true
    # END SERVER VARS
    
    # BEGIN ADDITIONAL TASKS
    before "deploy:start" do
      deploy.migrate
      deploy.seed
    end
    
    before "deploy:restart" do
      deploy.migrate
      deploy.seed
    end
    
    # Some files that the Rails app needs are too sensitive to store in SCM
    # Instead, manually upload these files to your <Rails app>/shared folder
    # then the following code can be used to generate symbolic links to them,
    # so that your rails app may use them.
    # In this example below, I link 'shared/config/database.yml' and 'shared/db/seed_data/moderators.csv'
    before "deploy:assets:precompile" do
      run ["ln -nfs #{shared_path}/config/settings.yml #{release_path}/config/settings.yml",
           "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml",
           "mkdir -p #{release_path}/db/seed_data",
           "ln -nfs #{shared_path}/db/seed_data/moderators.csv #{release_path}/db/seed_data/moderators.csv",
           "ln -fs #{shared_path}/uploads #{release_path}/uploads"
      ].join(" && ")
    end
    
    namespace :deploy do
      # Define seed task (call 'cap deploy:seed')
      desc "Reload the database with seed data"
      task :seed do
        run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}"
      end
    
      # If you are using Passenger mod_rails uncomment this:
      task :start do ; end
      task :stop do ; end
      task :restart, :roles => :app, :except => { :no_release => true } do
        run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
      end
    end
    # END ADDITIONAL TASKS
    

    【讨论】:

      【解决方案2】:

      我会说使用 Capistrano 进行部署。

      CI 部分(在执行 git push 时构建)最好使用 CI 服务器来实现,例如 travis(如果您在 Github 上)或 Jenkins,如果您有私有存储库。

      对于一键构建,直接使用 capistrano(命令行中的cap deploy)或运行所有测试的简单 CI 挂钩,然后运行 ​​cap deploy

      【讨论】:

      • 这是一个很好的答案;我最终安装了 Jenkins 作为我的构建应用程序,我通过 shell 执行使用 Capistrano 为它“供电”。这种组合满足了我上面的所有目标。谢谢!
      【解决方案3】:

      是的。 Capistrano 是您正在寻找的工具。将Capistranocron 系统一起使用应该使您能够实现具有上述所有四个要求的构建/部署系统。相当容易。

      了解 Capistrano 的最佳资源是 Deploying Rails 书。它有两章介绍 Capistrano,第一章介绍基本用法,第二章介绍一些高级使用概念。最后还有一个 Capistrano 案例研究,它通过一个真实的部署脚本示例探索进一步的配置选项。

      仅供参考:我昨天在几个小时内读完了这两章and tweeted about it ;-)

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多