Capistrano3 与 Mina

链接: http://blog.naixspirit.com/2014/12/14/cap_and_mina/

 

Capistrano

0. 服务器目录结构

首先来看看经过多次部署后, 服务器会生成一个这样的目录结构

├── current -> /var/www/your_app/releases/20141201042659
├── releases
│   ├── 20141201032351
│   ├── 20141201042256
│   ├── 20141201042659
├── repo
│   ├── branches
│   ├── hooks
│   ├── info
│   ├── objects
│   └── refs
└── shared├── bin├── bundle├── config├── log├── public├── tmp└── vendor
  • current 是指当前版本, link 到 release 下的指定版本目录(默认为最新的 releases)

  • releases 每次部署都会产成一个目录存放项目源码, 目录个数由 :keep_releases 变量来控制

  • repo 项目的 .git 目录

  • shared 是项目中共享的内容, 不会随部署而改变


1. 安装 Cap

# Gemfile
gem 'capistrano', '~> 3.2.0' gem 'capistrano-rails', '~> 1.1.0' gem 'capistrano-bundler', '~> 1.1.0' gem 'capistrano-rvm', '~> 0.1.0' gem 'capistrano3-unicorn', '~> 0.2.0' # Add this if you're using rbenv # gem 'capistrano-rbenv', '~> 2.0.0' 

2. Cap install 生成相关部署文件

$ bundle install 之后执行 $ bundle exec cap install, 会自动生成以下几个文件

├── Capfile                   # Cap 配置文件
├── config
│   ├── deploy
│   │   ├── production.rb     # 不同环境的部署配置
│   │   └── staging.rb
│   └── deploy.rb             # 公共变量
└── lib└── capistrano└── tasks         # 一些自定义的 task

3. Capfile 文件

Cap 的配置文件, 可按需求加载一些插件

require 'capistrano/setup'               # 加载 Cap 的 DSL
require 'capistrano/deploy' # 加载 Cap 的 Workflow require 'capistrano/rvm' # 加载 RVM 相关配置 # require 'capistrano/rbenv' # 加载 Rbenv 相关配置 require 'capistrano/bundler' # 加载 Bundle, 以便完成 bundle install require 'capistrano/rails/assets' # 加载 Rails 的 js, css 文件预编译 require 'capistrano/rails/migrations' # 加载 Rails 的数据库自动迁移 require 'capistrano3/unicorn' # 加载 Unicorn 服务 Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } 

其中, require 'capistrano3/unicorn' 后, 会增加几个 Unicorn 的部署命令, 可在本地远程运行命令直接控制服务器 Unicorn 的服务

cap unicorn:add_worker               # 增加一个 Unicorn Worker cap unicorn:duplicate # Restart cap unicorn:legacy_restart # 传统方式 Restart, 使用 USR2 + QUIT cap unicorn:reload # Reload cap unicorn:remove_worker # 减少一个 Unicorn Worker cap unicorn:restart # 无缝 Restart, 使用 USR2 cap unicorn:start # 启动 Unicorn cap unicorn:stop # 关闭 Unicorn (QUIT) 

4. config/deploy.rb 文件

用来配置不同环境的一些公共变量

# config valid only for Capistrano 3.1
lock '3.2.1'set :application, 'your app name' # 设置部署项目的名字 set :repo_url, 'git@xxx.git' # 设置项目的 git repo set :deploy_to, "/var/www/xxx" # 设置部署目录 set :deploy_user, 'deploy' # 设置部署时的用户 set :scm, :git set :format, :pretty set :pty, true # linked_dirs # 是将项目的指定目录 link 到 shared 目录中, 这个操作会在从 repo 取下代码之后进行. # 比如 log 目录, 每次部署完毕后新的版本中的 log 目录都会 link 到 shared/log 下 set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} # linked_files # 它是将 shared 目录中的文件 link 到项目中, 文件要首先存在于 shared 目录中, 不然 deploy 时会报错 # 在 Rails 项目中, 主要就是 database.yml, secret.yml 这样的敏感文件 set :linked_files, %w{config/database.yml} # rvm_type # :auto (default): just tries to find the correct path. ~/.rvm wins over /usr/local/rvm # :system: defines the RVM path to /usr/local/rvm # :user: defines the RVM path to ~/.rvm set :rvm_type, :system set :rvm_ruby_version, '2.1.2' set :rvm_roles, [:app, :web, :db] set :keep_releases, 10 # 最多存放十个部署版本 namespace :deploy do # 自定义了一个部署任务, 即自动运行 rake RAILS_ENV=rails_env db:create # 其中 release_path 指的是当前 release 目录 # `fetch(:rails_env)` 读取配置中的 rails_env 变量, 并在 rake 命令中带上 env 变量 task :create_database do on roles(:db) do within release_path do with rails_env: fetch(:rails_env) do execute :rake, 'db:create' end end end end before :migrate, :create_database # 在每次 rake db:migrate 前都运行 rake db:create after :finishing, 'deploy:cleanup' # 在每次部署完毕后, 清理部署时生成的 tmp 文件及多余的版本 end 

这里有几个细节需要特别注意:

  • deploy_user 一定需要有 /var/www/[deploy_to] 的权限, 在自动化部署中, 部署者的权限是个很重要的因素!

  • deploy_user 建议使用 id_rsa.pub authorized_keys 的方式进行免密码登陆, 这也是 cap3 中推荐的方法

  • 首次部署, 需要执行 cap [environment] deploy:check 命令, 把 linked_files 在服务器上创建!

  • 首次部署, 如果用 Mysql 的话, 服务器上是没有 database 的, 需要自己手动 rake db:create, 这里我写了个 create_database 的 task 来执行 rake db:create

  • rvm 与 rbenv 的安装路径一定要确认, 是在 root 下安装的还是在 deploy_user 下安装的, 这里强烈建议用 deploy_user 安装 rvm/rbenv, 并且把 /var/www 文件夹的权限赋予 deploy_user, 这样会少走很多弯路


5. config/deploy/production.rb | staging.rb

Cap 中的运行环境(又称 Stage ), 默认建立了2个 Stage, 不同的 Stage 可以定义一些专有的变量, 并可以重写 deploy.rb 中定义的公共变量, 相当于不同环境下对应不同的服务器.

# Production Stage
set :stage, :production # 设置 stage set :branch, 'master' # 设置 git branch set :rails_env, :production # 设置 rails_env # 以下几个 server 会同时部署 server 'xxx.xxx.xxx.xxx', user: 'deploy', roles: %w(web app db), primary: true server 'xxx.xxx.xxx.xxx', user: 'deploy', roles: %w(web app db) 

这里需要说明的是 roles 的定义, 在 Cap 中, 不同的 server 是可以有不同的 role 的, 一些服务器负责 web 服务, 一些服务器负责 db 服务, 从上面的自定义 create_database 命令中, 可以看到, on roles(:db), 说明这条命令只有在指定了 role 为 db 的服务器上运行.

这里讲的是多台服务器同时部署, 那么如何实现多台服务器依次部署呢? 只要再写一个 Stage, 运行指定的 stage 就可以了


6. Cap Flow

部署的时候执行命令, cap [environment] deploy, Cap 会自动执行一系列 Task, 这些 Task 被称为 Cap Flow, 每个 Task 都可以通过 beforeafter 来添加自定义的 Task.

deploydeploy:starting[before]deploy:ensure_stagedeploy:set_shared_assetsdeploy:check                  # 检查 ssh, rvm/rbenv, linked_dirs, linked_files, gitdeploy:starteddeploy:updatinggit:create_releasedeploy:symlink:shareddeploy:updated[before] deploy:bundle # 重新 bundle install [after] deploy:migrate # rake db:migrate deploy:compile_assets deploy:normalize_assets deploy:publishing deploy:symlink:release deploy:restart # restart, 可自定义一些需要 restart 的服务 deploy:published deploy:finishing deploy:cleanup deploy:finished deploy:log_revision 

7. Cap stage deploy

最后 show 一张运行 cap [environment] deploy 命令部署成功后的图片

Capistrano Deploy


 

 

1. 安装 Mina

# Gemfile
gem 'mina', '~> 0.3' 

2. Mina init

$ bundle install 之后执行 $ mina init, 会生成 config/deploy.rb 文件, 定义了一系列的变量和 Task.

require 'mina/bundler'
require 'mina/rails'
require 'mina/git' # require 'mina/rbenv' # for rbenv support. (http://rbenv.org) # require 'mina/rvm' # for rvm support. (http://rvm.io) # Basic settings: # domain - The hostname to SSH to. # deploy_to - Path to deploy into. # repository - Git repo to clone from. (needed by mina/git) # branch - Branch name to deploy. (needed by mina/git) set :domain, 'foobar.com' set :deploy_to, '/var/www/foobar.com' set :repository, 'git://...' set :branch, 'master' # Manually create these paths in shared/ (eg: shared/config/database.yml) in your server. # They will be linked in the 'deploy:link_shared_paths' step. set :shared_paths, ['config/database.yml', 'log'] # Optional settings: # set :user, 'foobar' # Username in the server to SSH to. # set :port, '30000' # SSH port number. # This task is the environment that is loaded for most commands, such as # `mina deploy` or `mina rake`. task :environment do # If you're using rbenv, use this to load the rbenv environment. # Be sure to commit your .rbenv-version to your repository. # invoke :'rbenv:load' # For those using RVM, use this to load an RVM version@gemset. # invoke :'rvm:use[ruby-1.9.3-p125@default]' end # Put any custom mkdir's in here for when `mina setup` is ran. # For Rails apps, we'll make some of the shared paths that are shared between # all releases. task :setup => :environment do queue! %[mkdir -p "#{deploy_to}/shared/log"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"] queue! %[mkdir -p "#{deploy_to}/shared/config"] queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"] queue! %[touch "#{deploy_to}/shared/config/database.yml"] queue %[echo "-----> Be sure to edit 'shared/config/database.yml'."] end desc "Deploys the current version to the server." task :deploy => :environment do deploy do # Put things that will set up an empty directory into a fully set-up # instance of your project. invoke :'git:clone' invoke :'deploy:link_shared_paths' invoke :'bundle:install' invoke :'rails:db_migrate' invoke :'rails:assets_precompile' to :launch do queue "touch #{deploy_to}/tmp/restart.txt" end end end # For help in making your deploy script, see the Mina documentation: # # - http://nadarei.co/mina # - http://nadarei.co/mina/tasks # - http://nadarei.co/mina/settings # - http://nadarei.co/mina/helpers 

3. Mina setup

部署的前执行命令, mina setup, 创建 shared 文件夹, 在编辑需要 shared 的文件后, 再执行 mina deploy 就可以部署了, 非常的简洁.

转载于:https://www.cnblogs.com/qinyan20/p/4365196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连续赋值与求值顺序var a = {n:1};a.x = a = {n:2}; alert(a.x);

连续赋值与求值顺序var a {n:1};a.x a {n:2}; alert(a.x);

Vim/GVim格式化xml文件

From: http://yaven.iteye.com/blog/1084044 今天找了很久关于在VIM中格式化xml的插件都没找到,后来才发现其实不用装插件,在linux环境中使用xmllint就可以实现对xml文件的格式化功能。 1,安装libxml2。 Libxml2 是一个xml的c语言版的解析器&…

pythonsys标准_python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出...

标准输出(sys.stdout)对应的操作就是print(打印)了,标准输入(sys.stdin)则对应input(接收输入)操作,标准错误输出和标准输出类似也是print(打印)。python最基本的操作 - 打印:print其效果是把 1 写在console(命令行)里面让你看。实际上他的操…

用 VNC 远程图形化登录 Linux (VNC 全屏显示)

From: http://www.cnblogs.com/cy163/archive/2007/05/23/757625.html VNC简介』 网络遥控技术是指由一部计算机(主控端)去控制另一部计算机(被控端),而且当主控端在控制端时,就如同用户亲自坐在被控端前操…

金山毒霸的云查杀很牛X

金山毒霸的云查杀很牛X无论安装包大小、资源占用率、查杀率、还是新病毒反应速度(秒级对比),牛X!听说,金山毒霸2011-增加了免费服务时间!以后是否也会全免费?既然免费了,就试试吧!下…

提示:不建议在没有为偏离分支指定合并策略时执行 pull 操作。 您可以在执行下一次

提示:不建议在没有为偏离分支指定合并策略时执行 pull 操作。 您可以在执行下一次

python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛

字符编码python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言&…

Linux内核初探3

1.内核的任务 内核:充当底层的驱动程序,应用程序只与内核有联系,内核是应用程序的所知道的层次结构中最底层的,也是资源管理程序,也是一种库,提供了一组面向系统的命令。 2.实现策略 微内核(中央内核&#…

ar 和 nm 用法

From: http://blog.chinaunix.net/space.php?uid7685522&doblog&id2045788 当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发…

warning.js:7 Warning: [antdv: Table] Each record in dataSource of table should have a unique `key`

warning.js:7 Warning: [antdv: Table] Each record in dataSource of table should have a unique key

python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...

知识不分边界......人,为什么要读书?举个例子:当看到天边飞鸟,你会说:“落霞与孤鹜齐飞,秋水共长天一色。”而不是:“卧靠,好多鸟。”;当你失恋时你低吟浅唱道:“人生若只如初见&…

在webservice中传递Hashtable

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> webservice中不支持hashtable的数据类型&#xff0c;那么如何在webservice中传递hashtable呢&#xff1f;我们可以通过将hashtable转化为webservice中支持的数组的类型来进行传递&am…

Vue中生成二维码的一种方式—vue-qr

Vue中生成二维码的一种方式—vue-qr vue实现二维码生成&#xff08;vue vue-qr&#xff09;

华为命令全

史上最全华为路由器交换机配置命令大合集 http://network.51cto.com 2010-01-12 09:03 佚名 天极 我要评论(11) 华为路由器交换机配置命令是大家使用时经常遇到的&#xff0c;顾名思义关于交换机的计算机命令&#xff0c;路由器命令&#xff0c;交换机命令和动静态命令都将…

电化学仿真的基础知识笔记

1 概述 电化学反应是一种特殊的化学反应&#xff0c;其能量转移形式为化学能和电能之间互相转换。根据能量转换方向&#xff0c;可分为两类&#xff1a; 原电池&#xff08;Galvanic cells&#xff09;&#xff1a;将化学能转化为电能&#xff0c;对外放电电解槽&#xff08;…

mysql以秒为单位限制资源_MYSQL中限制资源的使用

今天看到手册&#xff0c;不小心看到了这里&#xff0c;自己做了几个例子。从MYSQL4.x开始&#xff0c;MYSQL就增加了以每个用户为基础&#xff0c;限制MYSQL服务器的资源利用。自己查看MYSQL.USER 表就会发现里面最后几个字段&#xff1a;mysql> select version();--------…

[Linux C]利用libxml2解析xml文件

为了解析xml&#xff0c;可以使用Linux下默认安装的libxml2。 /*a.c功能&#xff1a;利用libxml2解析xml文件 */#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <libgen.h> #include <libxml/xml…