Rails 的自动化部署工具Cap(Capistrano)和mina

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liiuijkiuu/article/details/52764384

项目的自动化部署工具。cap 整合了与rails 相关的自动化部署命令
项目经过多次部署后,服务器会生成一个这样项目的目录

current 是指当前版本, link 到 release 下的指定版本目录(默认为最新的 releases)
releases 每次部署都会产成一个目录存放项目源码, 目录个数由 :keep_releases 变量来控制
repo 项目的 .git 目录
shared 是项目中共享的内容, 不会随部署而改变
1.安装cap
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’
2. Cap install 生成相关部署文件
bundleinstall bundle exec cap install, 会自动生成以下几个文件

├── Capfile # Cap 配置文件
├── config
│ ├── deploy
│ │ ├── production.rb # 不同环境的部署配置
│ │ └── staging.rb
│ └── deploy.rb # 公共变量
└── lib
└── capistrano
└── tasks # 一些自定义的 task
3. Capfile 文件
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 }
4. config/deploy.rb 文件
用来配置不同环境的一些公共变量

config valid only for Capistrano 3.1

lock ‘3.2.1’

set :application, ‘your app name’ # 设置部署项目的名字
set :repo_url, ‘[email protected]’ # 设置项目的 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 都可以通过before 和 after 来添加自定义的 Task.
7. Cap stage deploy

Mina
Mina 相对于 Cap 来说, 较为简洁, 只有基本的几个 Task(可用 mina -T 查看), 有点 Sinatra VS Rails 的感觉, 其服务器部署结构与 Cap 类似.
Mina init
bundleinstall mina init, 会生成 config/deploy.rb 文件, 定义了一系列的变量和 Task.

config valid only for current version of Capistrano

lock ‘3.5.0’

set :application, ‘elephant’
set :deploy_user, ‘deploy’
set :repo_url, ‘ssh://[email protected]:7999/jyd/joker.git’

Default branch is :master

ask :branch, git rev-parse --abbrev-ref HEAD.chomp

set :branch, ‘develop’

Default deploy_to directory is /var/www/my_app_name

Default value for :scm is :git

set :scm, :git

Default value for :format is :pretty

set :format, :pretty

Default value for :log_level is :debug

set :log_level, :info

Default value for :pty is false

set :pty, true

Default value for :linked_files is []

set :linked_files, fetch(:linked_files, []).push(‘config/mongoid.yml’, ‘config/secrets.yml’)

Default value for linked_dirs is []

set :linked_dirs, fetch(:linked_dirs, []).push(‘log’, ‘tmp/pids’, ‘tmp/cache’, ‘tmp/sockets’, ‘vendor/bundle’, ‘public/system’, ‘public/upload’,’public/assets’)

Default value for default_env is {}

set :default_env, { path: “/opt/ruby/bin:$PATH” }

Default value for keep_releases is 5

set :keep_releases, 5

set :resque_server_roles, :web

set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, ‘2.3.1’

after “deploy:published”, “god:resque_restart”
after “deploy:restart”, “god:resque_restart”

namespace :god do
desc “god restart resque and resque-scheduler”
task :resque_restart do
on roles(:web) do
with path: ‘/home/deploy/.rbenv/shims:$PATH’ do
within(current_path) do
execute :god, “stop resque_joker”
execute :god, “load #{current_path}/config/resque-pool.god”
execute :god, “start resque_joker”
end
end
end
end
end

namespace :deploy do

after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
# Here we can do anything such as:
# within release_path do
# execute :rake, ‘cache:clear’
# end
end
end

end
3. Mina setup
部署的前执行命令, mina setup, 创建 shared 文件夹, 在编辑需要 shared 的文件后, 再执行 mina deploy 就可以部署了, 非常的简洁.
更多自动化部署信息请参照https://segmentfault.com/a/1190000002490286

猜你喜欢

转载自blog.csdn.net/liiuijkiuu/article/details/52764384