capistrano是一个ruby语言写的代码自动部署工具。它的源代码在https://github.com/capistrano/capistrano。
作为一个自动部署工具,它的功能主要有:
1 可实现自动部署
2 通过ssh,可远程执行命令。
它与其他的自动部署工具不同之处有:
1和git /svn等版本控制工具亲和性高, 可实现自动代码拉取和回滚等功能。
https://github.com/stefanooldeman/capistrano-handbook/wiki
https://github.com/capistrano/capistrano/wiki
sudo apt-get install ruby1.9.1 rubygems
sudo gem install capistrano -v 2.5.15
其实capistrano3 已经发布了, 但是其文档当前比较少,只有其官网http://capistranorb.com/上有一点点可怜的入门教程。
而capistrano2的文档则相对比较全, 推荐这个wiki
https://github.com/capistrano/capistrano/wiki
用gem安装的时候切换成国内的源会比较快
gem sources --remove http://rubygems.org/
gem sources -a http://ruby.taobao.org/
gem sources -l # 请确保只有 ruby.taobao.org
如果是debian用户需要在安装完gem之后运行:
export RUBYOPT=rubygems
不然在运行cap的时候会出错,并提示:
costa@pepsi :~/test/vines$ cap
/var/lib/gems/1.8/gems/capistrano-2.15.5/bin/cap:3:in `require': no such file to load -- capistrano/cli (LoadError)
from /var/lib/gems/1.8/gems/capistrano-2.15.5/bin/cap:3
部署项目首先需要有权限。
权限分为两种:
1 执行部署脚本的服务器需要有访问被部署的服务器的权限。 这部分是通过ssh协议实现的。
可以通过密码鉴权,也可以通过public key鉴权。
通过密码鉴权只需要配置:user 和 :password 这两个配置项。
不过今天我一直都不能配置直接用password登录成功,非常郁闷。
通过public key鉴权, 不需要配置password。
step 1: 生成并且配置好public key, 可参考http://www.ece.uci.edu/~chou/ssh-key.html
step 2: 在执行部署脚本的服务器上启动ssh-agent。并将private key加入ssh-agent管理。
exec ssh-agent bash
ssh-add <你的private key文件>
2 被部署的服务器访问代码服务器的权限。代码服务器指的是类似git svn这样的服务器。
代码服务器对外的服务接口有多种形式的实现。以git为例, 一般有ssh git http这3种协议。
ssh 协议上文已说过有两种方式鉴权。如果代码服务器与被部署的服务器接受同样的public key的话, 可以利用ssh的 agent forwarding的性质直接借用前一次的权限。
关于ssh agent forwarding的原理可以看这篇文章:
http://unixwiz.net/techtips/ssh-agent-forwarding.html
如果是git、http或者ssh采用用户名密码鉴权可以设置scm_username和scm_password这两个配置。
ssh的 public key鉴权方式不知道如何配置。
https的客户端证书鉴权方式不知道如何配置。
在cap 中打开ssh agent forwarding选项需要在脚本中设置:
ssh_options[:forward_agent] = true
执行后在根目录下会创建 config/deploy.rb。
在deploy.rb中定义下面的配置项:
:application 项目名称
:user :password上文讲过是ssh的用户名和密码
:scm :scm_username :scm_password 定义你的代码服务器、用户名和密码。 例如 git costaxu 123
:repository 代码服务器的uri
:deploy_to 部署的位置
:use_sudo 是否运行sudo部署。 true or false。 如果配置成true, 你的部署用户需要有sudo的权限, 并且不需要输入密码就可以sudo。
:keep_releases 在部署之后保持的release的数量。部署中不会自动清除release, 需要手工执行
cap deploy:cleanup 会删除多余的release。
在项目的根目录下,运行 cap deploy。
运行完之后会在deploy_to目录下生成 current 和 release。 current软链到release下面的某个子目录,表示当前版本。
在项目的根目录下,运行 cap deploy:rollback。
任务是capistrano的基础。 任务可以定义在deploy.rb中或者Capfile中。 也可以写在其他文件中,由Capfile指定加载。
一个最简单的capistrano任务如下:
desc "Search Remote Application Server Libraries" task :search_libs, :roles => :app do run "ls -x1 /usr/lib | grep -i xml" end第一行 desc是一行描述。
第二行 task 指定了任务的名字,以及在哪些role上运行这个任务。 每台被部署的服务器都会指定一个或多个role。
第三行 run 是DSL语言的一个action module。 可以用来运行命令。
一个deploy任务流程如下:
namespace :deploy do task :default do update update_code strategy.deploy! finalize_update symlink restart # <= v2.5.5 end enddefault是一个namespace下的默认流程。
cap deploy 相当于执行 cap deploy:default
可以利用before/ after, 把你自己的流程加入到部署的默认流程当中 。
例如下面的流程定义
after("deploy:symlink") do # Some more logic here perhaps notifier.email_the_boss end你可以在deploy:symlink完成之后 运行 notifier.email_the_boss。
一般情况下你需要自定义deploy:restart deploy:start deploy:stop 这3个task。
例如
namespace :deploy do task :start, roles => :app do puts "start vines" end task :stop, roles=> :app do puts "stop vines" end task :restart, :roles => :app do puts "restart vines" end end
可以用 upload , download实现上传和下载
上传文件或者文件夹使用
upload(from, to, options={}, &block)
下载文件或者文件夹使用
download(from, to, options={}, &block)例如:
task :test_upload do upload_options={} upload_options[:recursive] = true upload_options[:via] = :scp upload("/home/costa/test/log", "/home/deploy/", upload_options) end
cap invoke COMMAND=""
costa@pepsi:~/test/vines$ cap invoke COMMAND="free -m" * 2014-02-22 23:17:58 executing `invoke' * executing "free -m" servers: ["192.168.1.135"] [192.168.1.135] executing command ** [out :: 192.168.1.135] total used free shared buffers cached ** [out :: 192.168.1.135] Mem: 248 185 63 0 20 88 ** [out :: 192.168.1.135] -/+ buffers/cache: 77 171 ** [out :: 192.168.1.135] Swap: 375 85 290 command finished in 178ms
cap简单的实现了事务性功能, 也就是说确保任务成功, 若不能成功,则回滚。
例如:
task :deploy do transaction do update_code symlink end end task :update_code do on_rollback { run "rm -rf #{release_path}" } source.checkout(release_path) end task :symlink do on_rollback do run <<-EOC rm #{current_path}; ln -s #{previous_release} #{current_path} EOC end run "rm #{current_path}; ln -s #{release_path} #{current_path}" end
cap shell
* 2014-02-22 23:32:43 executing `shell' ==================================================================== Welcome to the interactive Capistrano shell! This is an experimental feature, and is liable to change in future releases. Type 'help' for a summary of how to use the shell. -------------------------------------------------------------------- cap> pwd [establishing connection(s) to 192.168.1.135] ** [out :: 192.168.1.135] /data/home/deploy cap> ls ** [out :: 192.168.1.135] git_test log projects test vines cap>
cap deploy # Deploys your project.
cap deploy:check # Test deployment dependencies.
cap deploy:cleanup # Clean up old releases.
cap deploy:cold # Deploys and starts a `cold' application.
cap deploy:create_symlink # Updates the symlink to the most recently deployed version.
cap deploy:migrate # Run the migrate rake task.
cap deploy:migrations # Deploy and run pending migrations.
cap deploy:pending # Displays the commits since your last deploy.
cap deploy:pending:diff # Displays the `diff' since your last deploy.
cap deploy:restart # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:rollback # Rolls back to a previous version and restarts.
cap deploy:rollback:code # Rolls back to the previously deployed version.
cap deploy:setup # Prepares one or more servers for deployment.
cap deploy:start # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:stop # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:symlink # Deprecated API.
cap deploy:update # Copies your project and updates the symlink.
cap deploy:update_code # Copies your project to the remote servers.
cap deploy:upload # Copy files to the currently deployed version.
cap deploy:web:disable # Present a maintenance page to visitors.
cap deploy:web:enable # Makes the application web-accessible again.
cap invoke # Invoke a single command on the remote servers.
cap shell # Begin an interactive Capistrano session.
冷部署用的是 deploy:cold