我曾经是一名.NET员工,并且喜欢使用名为CruiseControl.NET的夜间构建系统(持续集成)来自动将我的应用程序部署到我的临时环境中。
既然我已经跳转到Ruby on Rails和GitHub,我发现自己对如何设置等效的自动化夜间构建系统感到困惑。我想做正确的事情,Rails的方式,但我可以使用正确的方向。
以下是我正在使用的内容......
我正在寻找满足这些要求的系统/解决方案:(理想情况下使用Capistrano ......)
因为我没有先做一些研究就不会问这个问题,这里有一些我找到的相关资源,但是无法破译:
建议,有人吗?谢谢!
答案 0 :(得分:4)
嗯,事实证明,有很多关于如何使用Capistrano用于此目的的良好信息(包括Prakash's reference),但似乎没有一个完全全面。
经过多个小时的指导,经过论坛,在堆栈溢出问题之后,我设法完成了我的大部分目标。为了节省其他人的时间,我将尝试提供我在原始问题的背景下找到的答案和信息。
<强>更新强>:
事实证明我一直在寻找Jenkins:它是我之前使用的CruiseControl构建服务器应用程序的完美(甚至是改进的)模拟。 Jenkins是一个Web应用程序,可以按计划启动构建,或者使用插件启动事件。它并没有包含实际部署我的Rails应用程序的功能,所以Capistrano介入的地方。使用Jenkins&#39; &#34; shell执行&#34;构建任务以触发Capistrano部署,我能够实现上述所有目标。
请查看this guide了解更多详情。
原始帖子:
首先,Capistrano可以用于构建系统,但是,它与CruiseControl完全不相似。
CruiseControl是:
Capistrano是:
rake
一样工作的gem;它具有与CruiseControl用于部署目的的Ant和Nant脚本类似的功能。cap deploy
(这就像它到达时一样,只需点击一下即可部署。)关于我的原始要求......
从我的&#39; master&#39;部署最新的提交。在我的GitHub存储库中分支到我的登台服务器。
配置Capistrano的deploy.rb文件将实现此目的。
按需单击构建:我想单击按钮或链接以随时强制部署(或重新部署)
所有Capistrano部署都是通过“强制执行”来实现的:您可以通过“部署”来实现部署&#39;在您的控制台中手动
能够作为部署的一部分在登台服务器上运行自定义命令(即&#39;捆绑安装&#39;,重启Apache等等)
配置Capistrano的deploy.rb文件将实现此目的。大多数这些命令都是开箱即用的。
每天自动部署或在GitHub上提交后自动部署(可选)
我还没有想出这个...一个cron工作可能是最好的方法。
设置Capistrano
首先从GitHub开始本教程。在您的Rails App文件夹中,您最终应该使用Capfile
和config/deploy.rb
文件。
为了节省您的时间,复制并粘贴这些文件,并根据您的需要调整设置。 以下文件配置为:
database.yml
文件)<强> 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
<强>配置/ 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
答案 1 :(得分:1)
是。 Capistrano
是您正在寻找的工具。将Capistrano
与系统cron
一起使用可以使您实现具有上述所有四个要求的构建/部署系统。相当容易。
了解Capistrano的最佳资源是Deploying Rails书。它有两章关于Capistrano,第一章涉及基本用法,第二章涉及一些高级用法概念。最后还有一个Capistrano案例研究,它使用真实生活部署脚本示例探索了进一步的配置选项。
仅供参考:我昨天在几个小时内阅读了两章and tweeted about it ;-)
答案 2 :(得分:1)
我会说与Capistrano合作进行部署。
CI部分(当你执行git推送时构建)最好通过使用CI服务器来实现,例如travis(如果你在Github上)或Jenkins,如果你有私人仓库。
对于一键构建,请直接使用capistrano(命令行为cap deploy
)或运行所有测试的简单CI挂钩,然后运行cap deploy
。