capistrano是一個ruby語言寫的代碼自動部署工具。它的源代碼在https://github.com/capistrano/capistrano。 html
做爲一個自動部署工具,它的功能主要有: git
1 可實現自動部署 github
2 經過ssh,可遠程執行命令。 web
它與其餘的自動部署工具不一樣之處有: shell
1和git /svn等版本控制工具親和性高, 可實現自動代碼拉取和回滾等功能。 api
https://github.com/stefanooldeman/capistrano-handbook/wiki ruby
https://github.com/capistrano/capistrano/wiki bash
sudo apt-get install ruby1.9.1 rubygems 服務器
sudo gem install capistrano -v 2.5.15 session
其實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