Capistrano:自动化代码部署
Capistrano是一种在多台服务器上运行脚本的开源工具,它主要用于部署web应用(它自动完成多台服务器上新版本的同步更新,包括数据库的改变)
注:fabric是一款Python的库,也支持在多台服务器上运行脚本的功能,功能相对基础
同自动化运维工具来说(puppet,ansible)自动化运维框架,提供基于流程的自动化方案,capistrano和fabric更像是工具,提供了一定的应用范围的支持,提供更多基于语言的命令支持,并且通过角色定义,来区分脚本执行的逻辑划分
- 通过版本控制软件实现项目的自动化部署,支持的有:git , svn , hg
- 通过定义不同的环境设置不同的部署脚本(capistrano-ext中提供的Capistrano Multistage功能),每个脚本内能定义各自的代码仓库,及相应的服务器集群角色:web, app ,db, workers等
- 通过在部署脚本内定义任务(task)来执行不同的脚本命令,能通过命名空间划分任务(namespace)
- 任务能指定执行的角色,并且对于执行任务制定钩子,分为:before,after
$ gem install capistrano-ext ## capistrano是基本安装,capistrano-ext提供更多容易的扩展工具集
$ cap $ bundle exec cap
$ bundle exec cap -vT $ bundle exec cap staging deploy $ bundle exec cap production deploy $ bundle exec cap production deploy --dry-run $ bundle exec cap production deploy --prereqs $ bundle exec cap production deploy --trace
3.在工作目录执行生成cap的配置文件,帮助正确加载recipe和库
$ capify .
在你现有的空 deploy.rb 文件中,让我们在第一行输入应用的名称。如果你的应用名称是“fancy shoes”,则输入:
set :application, "app_name"
接着我们添加要访问的仓库。Git 用户可以添加:
set :scm, :git set :repository, "git@xxxx:/repository.git" set :scm_passphrass, ""
Subversion 用户需添加:
set :scm, :subversion set :repository, "https://xxxx/repository"
然后,我们设置服务器的帐号:
set :user, "server-user-name"
确保该帐号具有 deploy_to
变量所指定目录的读写访问权限。
因为使用了capistrano-ext,则可以
require 'capistrano/ext/multistage'
然后指定你的环境,或“stages”:
set :stages, ["staging", "production"] set :default_stage, "staging"
当你指定哪个 stage 想要部署时,Capistrano 方能加载适合的文件。
绑定 Git 分支,在不同的部署文件中
set:branch,'production set:branch,'staging'
6.脚本设置:
namespace :deploy do task :start do ; end task :stop do ; end task :restart, :roles => :app, :except => { :no_release => true } do run "#{try_sudo} /etc/init.d/lsws reload" # we use LiteSpeed Web Server end end # The task below serves the purpose of creating symlinks for asset files. # Large asset files like user uploaded contents and images should not be checked into the repository anyway, so you should move them to a shared location. task :create_symlinks, :roles => :web do run "ln -s #{shared_path}/uploads #{current_release}/uploads" run "ln -s #{shared_path}/zb #{current_release}/zb" end # Let's run the task immediately after the deployment is finalised. after "deploy:finalize_update", :create_symlinks