自动部署工具capistrano学习笔记

倾然丶 夕夏残阳落幕 提交于 2020-03-12 13:00:50

简介

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

如何安装capistrano

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

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!