使用 Capistrano 部署总结

使用 Capistrano 部署总结
2014年6月27日 admin发表评论阅读评论
简介
Capistrano 是一个 Ruby 程序,它提供高级的工具集来部署你的 Web应用到服务器上。Capistrano 允许你通过 SSH 从源代码控制仓库(SVN 或 Git)复制代码到服务器,并执行如重启 Web服务器、操作缓存、重命名文件、迁移数据库等部署前/后的功能。利用 Capistrano一次也可部署多台机器。

安装 Capistrano
为了安装 Capistrano,你的电脑需要已安装 Ruby 和 RubyGems。

# gem list Capistrano -a -r http://ruby.taobao.org/
*** REMOTE GEMS ***
capistrano (3.2.1, 3.2.0, 3.1.0, 3.0.1, 3.0.0, 2.15.5, 2.15.4, 2.15.3, 2.15.2, 2.15.1, 2.15.0, 2.14.2, 2.14.1, 2.13.5, 2.12.0, 2.11.2, 2.9.0, 2.8.0, 2.7.0, 2.6.0, 2.5.21, 2.5.20, 2.5.19, 2.5.18, 2.5.17, 2.5.16, 2.5.15, 2.5.14, 2.5.13, 2.5.12, 2.5.11, 2.5.10, 2.5.9, 2.5.8, 2.5.7, 2.5.6, 2.5.5, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.3, 2.4.2, 2.4.1, 2.4.0, 2.3.0, 2.2.0, 2.1.0, 2.0.0, 1.4.2, 1.4.1, 1.4.0, 1.3.1, 1.3.0, 1.2.0, 1.1.0)
capistrano-af83 (0.4.7, 0.4.6, 0.4.5, 0.4.4, 0.4.3, 0.4.2, 0.4.1, 0.4.0, 0.3.8, 0.3.2, 0.3.1, 0.3.0, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0, 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0)
capistrano-akamai (0.0.1)
capistrano-alice (0.0.7, 0.0.6, 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1)
capistrano-asgroup (0.0.1)
上面的命令列出了目前capistrano所有的版本及其相关的插件(插件还有很多,这里我没粘全),可以看到目前capistrano的最新版本为3.2.1 。不过由于webistrano环境所使用的是2.6.0 。本篇还是以2.6.0的版本进行安装和总结。

注:capistrano 3.X.X 版本和 capistrano 2.X.X之间已经发生了比较大的变化 。这有点类似于python3与python2的区别。

安装方法:

$ gem install capistrano  -v 2.6.0
//如果需要安装capistrano扩展,再增加下面的操作
$ gem install capistrano-ext
如果你遇到了问题或想要了解更多细节,可以参考官方的 Capistrano 入门指南,或找到使 Capistrano 工作的各种组件。

注:安装时,会自动安装依赖包,请确认 net-ssh 的版本号为2.7.0  ,不然执行任何deploy操作时会遇到类似如下的ssh认证报错

[deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: ... (Net::SSH::AuthenticationFailed: Authentication failed for user
具体可以参看github上的net-ssh项目的issues部分 。

创建项目
在终端中导航到你的应用根目录,并执行以下命令:

$ sudo capify  .
[add] writing ‘./Capfile‘
[add] making directory ‘./config‘
[add] writing ‘./config/deploy.rb‘
[done] capified!
$ tree
.
├── Capfile
└── config
    └── deploy.rb
在capistrano 3.x.x的版本中,此处已经不能使用这样的方法创建项目,应该使用下面的操作:

$ capify .
--------------------------------------------------------------------------------
Capistrano 3.x is incompatible with Capistrano 2.x.
This command has become `cap install` in Capistrano 3.x
For more information see http://www.capistranorb.com/
--------------------------------------------------------------------------------
$ sudo cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified
$ tree
.
├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
        └── tasks
也不难看出,两者的目录结构也已经发生了一些变化。个人尝试了下3.x.x版本,发现其功能和细节较2.x.x 做了很多优化。如果不使用古老的webistrano做web前端,建议使用新版本。由于webistrano 已经三年多没更新(作者也已宣布不再更新),所以不确定其与capistrano 3.x.x 的兼容性 。

创建的项目中一个特殊的 Capfile 文件,Capfile 将帮助 Capistrano 正确加载你的 deploy.rb模板,而deploy.rb文件定义了模块、namespace、task等,在部署过程中,只需要按主机组执行相应的task即可完成相应的操作。

编写 Capistrano模板
1、配置deploy.rb文件

以下deploy.rb
文件中一些详细的分析

require ‘bundler/capistrano‘     #添加之后部署时会调用bundle install, 如果不需要就可以注释掉
require "capistrano/ext/multistage"     #多stage部署所需
set :stages, %w(development production)
set :default_stage, "development"
set :application, "crm_app_end"   #应用名称
set :repository,  "https://test.361way.com/svn/trunk"
set :keep_releases, 5          #只保留5个备份
set :deploy_to, "/var/www/#{application}"  #部署到远程机器的路径
set :user, "user1"              #登录部署机器的用户名
set :password, "user1"      #登录部署机器的密码, 如果不设部署时需要输入密码
default_run_options[:pty] = true          #pty: 伪登录设备
#default_run_options[:shell] = false     #Disable sh wrapping
set :use_sudo, true                            #执行的命令中含有sudo, 如果设为false, 用户所有操作都有权限
set :runner, "user2"                          #以user2用户启动服务
set :svn_username, "xxxx"
set :scm, :subversion                        #注意subversion前有冒号,不能少
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
#set :deploy_via, :copy                     #如果SCM设为空, 也可通过直接copy本地repo部署
#set :domain, "crm.abc.com"    #custom define
role :web, "192.168.0.13", "192.168.0.117"                          # Your HTTP server, Apache/etc
role :app, "192.168.0.13", "192.168.0.117"                          # This may be the same as your `Web` server
role :db,  "192.168.0.13", :primary => true # This is where Rails migrations will run
#role :db,  "your slave db-server here"
#
namespace :deploy do
    desc "remove and destory this app"
    task :destory, :roles => :app do
        run "cd #{deploy_to}/../ && #{try_sudo} mv #{application} /tmp/#{application}_#{Time.now.strftime(‘%Y%d%m%H%M%S‘)}"      #try_sudo 以sudo权限执行命令
    end
    after "deploy:update", "deploy:shared:setup"              #after, before 表示在特定操作之后或之前执行其他任务
    namespace :shared do
        desc "setup shared folder symblink"
        task :setup do
            run "cd #{deploy_to}/current; rm -rf shared; ln -s #{shared_path} ."
        end
    end
    after "deploy:setup", "deploy:setup_chown"
    desc "change owner from root to user1"
    task :setup_chown do
        run "cd #{deploy_to}/../ && #{try_sudo} chown -R #{user}:#{user} #{application}"
    end
    task :start do
       run "cd #{deploy_to}/current && ./crmd.sh start"
       #try_sudo "cd #{deploy_to}/current && ./restart.sh"
    end
    task :stop do
       run "cd #{deploy_to}/current && ./crmd.sh stop"
    end
    task :restart do
       run "cd #{deploy_to}/current && ./crmd.sh restart"
    end
end
上面关于环境部分这里特别说下,如果有多个stage要部署,则在config下创建deploy文件夹, 在该文件夹下有各stages文件, 文件名和 set :stages, %w(development production) 对应, 如development.rb production.rb,在各文件中设置相应变量即可,

set :stages, ["staging", "production"]
set :default_stage, "staging"
production.rb 设置类似如下:

 set :deploy_to, "/var/www/#{application}"
# The hostnames to deploy to.
role :web, "devel.example.com"
# Specify one of the web servers to use for database backups or updates.
# This server should also be running Drupal.
role :db, "devel.example.com", :primary => true
# The username on the target system, if different from your local username
# ssh_options[:user] = ‘alice‘
# The path to drush
set :drush, "cd #{current_path} ; /usr/bin/php /data/lib/php/drush/drush.php"
同样development.rb:

server "my_fancy_server.com", :app, :web, :db, :primary => true
set :deploy_to, "/var/www/fancy_shoes_development"
实际应用中,我们也可以配置在不同环境中使用同一主机中使用不同的目录,也可以配置不同的环境里包含着不同的主机。在多环境中,执行部署的命令需要指定环境:

cap production deploy:...
在2.x.x 的多环境配置中使用cap发布也可以不指环境,这需要在配置中指定其中一个环境为默认环境 。在3.x.x中,默认创建的demo项目中,就已经创建好了deploy目录,并生成了production和staging两个环境文件,而且在执行时默认强制需要指定发布的环境,所以3.x.x的默认结构更清晰 。

2、验证配置的执行deploy

全部准备好后,先试试我们的 recipe,以便让 Capistrano
在服务器上创建初始的目录结构。从你的应用根目录执行下列命令:

$ cap deploy:setup
当你执行该命令时,Capistrano 将 SSH 到你的服务器,进入你在 deploy_to 变量中所指定的目录,并创建特殊的 Capistrano 目录结构。如果遇到权限或 SSH
访问错误,你将获得错误消息。当命令执行时仔细看看 Capistrano 的输出。

在我们使用 Capistrano 做实际部署之前的最后一步是,确保 setup
命令在服务器上全都设置正确。使用以下命令进行简单验证:

$ cap deploy:check
该命令将检查你的本机环境及服务器,并定位问题。如果你看到错误消息,修复后再运行此命令。一旦你执行 cap deploy:check 没有错误,则可继续处理。

部署过程中我们还会用到下面的语句(需要在deploy.rb里事先进行定义task):

$cap deploy:setup #建立部署路径
$cap deploy:update #部署
$cap deploy:start    #启动服务
$cap deploy:stop   #停止服务
$cap deploy:restart #重启服务
$cap deploy:rollback #回滚
提示与技巧
使用远端缓存改进性能

Capistrano
的工作方式在每次部署时都将创建新的仓库克隆及导出。那必将很慢,通过添加一些扩展选项到
deploy.rb recipe 则可提速。添加下列内容到 deploy.rb 文件描述 scm 设置的位置:

set :deploy_via, :remote_cache
此命令使 Capistrano 在服务器上只克隆/导出仓库一次,然后在每次部署时使用 svn
up 或 git pull 代替。如果你经常部署,你将发现提速明显。

添加定制的部署钩子(Hook)

Capistrano 显然比通过 SSH
复制文件要高级。你可以配置事件或命令以便在文件复制完成后执行,如重启 Web
服务器、执行定制的脚本等。Capistrano 称这些为“任务”。例如,添加以下代码到
deploy.rb 文件:

namespace :deploy do
  task :restart, :roles => :web do
    run "touch #{ current_path }/tmp/restart.txt"
  end
  task :restart_daemons, :roles => :app do
    sudo "monit restart all -g daemons"
  end
end
Capistrano 中的任务非常强大,我们在本指南中仅接触到表皮。你可以创建任务在部署
前、部署后或单独操作服务器。这可以是任何维护类型:重启进程、清理文件、发送
邮件通知、执行数据库迁移、运行脚本等等。

我们的示例包括两个定制任务。“restart”任务是内建于 Capistrano
中的,将在部署完成后自动执行。我们使用由 Passenger 驱动的现代 Rails 应用技术
touch tmp/restart.txt,你的 Web 服务器可能需要不同的命令。

我们的第二个示例任务是“restart_daemons”,Capistrano
不会默认执行此定制任务。为了让它运行,我们需要添加一个 hook:

after "deploy", "deploy:restart_daemons"
此命令告诉 Capistrano 在我们的部署操作完成后执行任务。其他可用的 hook 是
before,将在文件复制之前执行任务。

关于 before 及 after hook,你可以阅读官方的 Capistrano 文档:

Before Tasks
After Tasks
将 Git 分支与环境关联

因为我们有两个服务器环境(临时和生产),你可能想要绑定 Git
分支到这些环境。这样,你可以自动部署 staging 分支到临时环境,master
分支到生产环境。简单添加下列内容到 production.rb:

set :branch, ‘production‘
并添加以下内容到 staging.rb

set :branch, ‘staging‘
现在每次你执行 cap deploy 时,Capistrano 将从你的 staging 分支(因为 staging
是我们的默认环境)部署代码。如果你运行 cap production deploy,Capistrano
将从你的 master 分支部署代码。

参考文档:

largetalk的csdn博客

capistrano部署drupal应用

dl528888 51cto博客

使用capistrano部署web应用

github wiki页

  

时间: 2024-08-09 22:01:00

使用 Capistrano 部署总结的相关文章

capistrano 部署后自动清理之前的release

(1)如何自动清理老的release capistrano 部署后自动清理老 release,默认只保留 5 个 releases 添加下面代码到 config/deploy.rb # if you want to clean up old releases on each deploy uncomment this: after "deploy:restart", "deploy:cleanup" (2)如何人指定保留数量如果想制定具体保留几个releases文件

使用GitLab CI + Capistrano部署CakePHP应用程序

使用 GitLab CI + Capistrano 部署 CakePHP 应用程序 摘要:本文描述了如使用GitLab CI + Capistrano部署CakePHP应用程序. 目录 1. 问题2. 解决方法3. 安装GitLab CI Runner4. 安装和配置Capistrano    4.1 安装Ruby    4.2 安装Capistrano    4.3 在项目中配置Capistrano    4.4 用户的验证和授权    4.5 其它工具和设置5. 部署6. 小结A. 参考资料

Nodejs部署再思考

pm2 好处就不说了 今天遇到一个奇怪的问题,部署一台新的机器,无论怎么弄,什么版本都会报错 js-bson: Failed to load c++ bson extension, using pure JS version 我曾经无数次的怀疑,是mongodb的问题,于是我手动编译了bson和bson-ext,以及相关的 connect-mongo mongoose 可是还不好使..... 我觉得很奇怪,没有理由啊,我去查pm2的源码和文档,发现cluster mode必须是0.12之后才有,

部署node程序并维持正常运行时间

12.2部署的基础知识 假定你创建了一个想要展示的Web程序,或者创建了一个商业应用,在把它放到生产环境中之前需要测试一下.你很可能会从一个简单的部署开始,然后再做些工作让它的正常运行时间和性能达到最优.本节会带着你经历一次简单.临时的Git部署,并教你如何用Forever把程序跑起来.临时性部署在重启后会丢失,但它们的优势是设置起来很迅速. 12.2.1 从Git存储库部署我们快速过一下使用Git存储库的基本部署,让你对主要步骤有个直观的认识.大多数部署都需要完成下面这些步骤:(1) 用SSH

大数据系统工具集

Bootstrapping引导:Kickstart.Cobbler.rpmbuild/xen.kvm.lxc.Openstack. Cloudstack.Opennebula.Eucalyplus.RHEV配置类工具:Capistrano.Chef.puppet.func.salstack.Ansible.rundeck监控类工具:Cacti.Nagios(Icinga).Zabbix.基于时间监控前端Grafana.Mtop 日志系统:Logstash.Scribe绘图工具:RRDtool.G

Capistrano自动化部署工具安装详细过程

Capistrano是一种通过ssh向多个服务器部署web应用的一种框架和工具.具体更详细的介绍,大家可以登录官方网站或其它相关网站进行了解. 一.软件版本 1. 操作系统:CentOS6.8最小化安装 2. Ruby:2.4.0 3. gem:2.6.10 4. capistrano:3.7.2 二.安装ruby 1. 下载 wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.gz (请先安装wget: yum instal

Capistrano初探--Ruby快速部署工具

1.Capistrano介绍 是什么?---一种部署工具.(部署就是在生产服务器上安装应用程序,或是更新最新版本:web服务器的启动重启与停止:使网站进入维护状态或将其恢复为常态) 在进行 Rails 部署的时候你可以直接从 svn 或者 git 下面更新代码,运行 db:migrate  来进行数据库的更新,然后进行这样那样的操作后,再启动服务器,便可进行部署,即便你只有一台机器,你也会觉得太麻烦,如果你需要多台机器来运行,那你可 能就会觉得每次手工部署都是一场恶梦,你可以使用 shell 脚

Capistrano+Nginx+Unicorn 自动部署Rails

配置你的服务器 你需要在你的服务器上安装Ruby的环境,你可以使用RVM或者是rbenv. 上传到github 这步需要将你的应用上传到github,在你的github上创建新的repository,然后在你本机代码位置执行下面的命令,初始化git仓库. git init git add . git commit -m"<message>" git remote add origin [email protected]:<username>/<git re

利用Fabric+Capistrano实现Python自动化部署

Fabric是一个用于应用(批量)部署和系统(批量)管理的Python库和命令行工具,关于Fabric的介绍请参考:http://www.fabfile.org/. Capistrano是一个用Ruby语言编写的远程服务器自动化和部署工具,关于Capistrano的介绍请参考:http://capistranorb.com/. 本文仅使用Python语言和部分Linux或Windows系统命令,借助Fabric模块和Capistrano的部署思路,实现在Linux平台和Windows平台的自动化