本文基于Capistrano 2版本,文中的命令不必定适用于Capistrano 3。git
简单地讲,Capistrano是一个gem
。对于不太熟悉Ruby的朋友来讲,gem
就是一套按照必定规范打包好的Ruby代码,能够类比Java里面的Package。github
实际上,Capistrano是专门用来部署rails程序的一套工具。web
Rails应用程序的部署方案十分灵活,适应于不一样的生产服务器场景。在实际生产中,rails程序中包含的各种gem和生产服务器上的gem每每版本不一致,这就为部署增长了一些难度。数据库
利用Capistrano进行部署,就能很容易解决这个问题。同时,使用Capistrano部署rails程序,更有一种“敏捷”的感受。api
在进行Rails开发过程当中,一个重要的工具就是版本控制,而咱们常常用Git。用过Heroku的开发者,或者有静态博客的朋友都能感觉到一点——把版本控制与部署方案融合到一块儿很是方便。幸运的是,Capistrano对包括Git在内的各种版本控制有很是好的支持。本文中,我将使用Git做为版本控制软件,与Capistrano一块儿工做,进行项目部署。服务器
利用Capistrano部署Rails程序,能够分为下面四个步骤。app
配置部署服务器ssh
对应用程序进行版本控制工具
远程部署应用程序测试
版本控制推动部署
对生产服务器的基本配置,包括Web静态服务器、数据库、版本控制搭建、防火墙等的控制不在本文讨论范围内。它们之中任何一点拿出来都够写一本书了。
首先,要在部署服务器能够访问到的地方建立一个新的版本库。
读者能够在公司/实验室里搭建GitLab,或者链接到GitHub上。若是是本身搭建GitLab,其实彻底能够把Git服务器和生产服务器放在同一台机器上。能够经过如下命创建Server端的远程版本库,也能够经过访问Git服务器的Web界面自行操做。
$ mkdir -p ~/git/project.git $ cd ~/git/project.git $ git --bare init
值得注意的是,即便是把Git Server和Web Server放在同一台机器上,Capistrano也是经过Web服务的形式访问Git。这里能够配置公钥来简化整个流程。
$ test -e ~/.ssh/id_dsa.pub || ssh-keygen -t dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
还有一件很是重要的事情:Capistrano将在应用程序目录名和Rails子目录中插入名为current
的目录,其中包括public
子目录。在用Capistrano部署好的项目中,目录结构相似下面的样子(current
是当前部署的版本,releases
是该分支下根据版本生成的曾经的项目,shared
中是各个版本共享的资源):
$ ls project > current releases shared
而这个public
目录就是咱们熟悉的Rails程序中静态资源目录;也就是说,不论你用Apache或Ngnix仍是其余Web服务器来部署静态资源,须要把这个目录设置为根目录。以Apache配置为例:
DocumentRoot /home/project/current/public/
到此为止,对服务器的预先配置就已经完成了,接下来的工做均可以在开发环境中完成。
最开始,要在项目的Gemfile中加入Capistrano gem:
... gem 'capistrano' ...
而后执行命令bundle install
来安装gem。接下来执行一条很重要的命令,它的做用是把项目中用到的gem及其版本号都记录下来:
$ bundle pack //而后能够作一个版本记录,并推送到远程库 $ git add . $ git commit -m "install capistrano & bundle gems" $ git push origin master
以上,已经完成了项目gem整理。接下来咱们要把项目代码放入生产环境。
接下来的过程,咱们能够先猜想一下:
把代码pull到服务器的DocumentRoot
在生产服务器上生成数据库
安装gem
重启Passenger
……
这些事情,能够想到的话,就能够手动来作;可是等下,要Capistrano是作什么的……
没错,到了这一步,就能够显示Capistrano的威力了:自动化部署。以上的事情能够全交给它来作,固然前提是要写一份自动化部署的脚本。
首先,在开发环境的项目根目录中执行命令:
$ capify [add] writing './Capfile' [add] writing './config/deploy.rb' [done] capified! //Capistrano3中使用下面的命令 $ cap install
如今多出来了两个文件:Capfile
和deploy.rb
,前者是Capistrano对Rakefile的模拟,不须要改动,后者是一个自动化的脚本,须要编辑的就是这个。这个文件里须要用到一些Capistrano的DSL,能够看这里参考。在此给出一份比较简单的脚本做为参考,它是上面命令生成的默认脚本。
# config valid only for Capistrano 3.1 lock '3.1.0' set :application, 'my_app_name' set :repo_url, 'git@example.com:me/my_repo.git' namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :publishing, :restart after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end end
在修改好:application
、:repo_url
等值后,就能够开始进行部署了。
第一次部署的时候,请运行:
$ cap deploy:setup
以后会要求输入服务器密码。链接成功后会在生产服务器上生成必要的目录。
若是想测试配置,看还有没有别的问题,能够运行:
$ cap deploy:check
一旦解决完全部问题,就能够运行下面的命令,进行数据库生成,并完成部署:
$ cap deploy:migrate $ cap deploy
至此,就已经把项目部署到生产服务器上了。
已经部署完了么?
并非这样的,不要忽视掉最开始强调版本控制的用意。Capistrano能让你在持续开发的状况下进行版本推动部署,而操做很是简单。每次作好提交、并把版本库推送到远端后,就能够运行cap deploy
进行部署。
若是有某些缘由,须要回到上一个部署的版本,执行命令:
$ cap deploy:rollback
没错!整个部署的过程就是这样。
若是想掌握关于它的高级用法,能够看Wiki文档。
本文只是以Rails为例讲解了Capistrano的用法,实际上它还能够用来部署其余语言写的Web应用程序,好比Java、PHP、Python等,读者有兴趣的话能够继续探索下去。