自動部署工具capistrano學習筆記

簡介

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

如何安裝capistrano

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

Authentication權限的配置

部署項目首先須要有權限。

權限分爲兩種:

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

如何配置一個項目進行自動部署

部署一個項目,首先進行在項目的根目錄下執行 "capify ."


執行後在根目錄下會建立 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
end
default是一個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



運行後, 可把 /home/costa/test/log上傳到/home/deploy/log的位置。

如何直接執行遠程命令

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



在deploy中定義一個transaction。 transaction的任何一步失敗,都執行回滾動做。

遠程shell

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>


內置task

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

相關文章
相關標籤/搜索