Capistrano 3 实现Rails自动化部署日志1 - tianlu1677/tianlu1677.github.io GitHub Wiki

#常用变量

set :application, 'MyLittleApplication'
fetch :application

fetch(:special_thing, 'some_default_value')
先获取special_thing,没有则取第二个值

deploy_to   default: -> { "/var/www/#{fetch(:application)}" }
scm: :git 
repo_url: '[email protected]:kaikeba/cms.git' # githu 的地址
deploy_to: '/home/kkb/**' #部署到远程服务器地址
linked_files: []# 软连的文件 %w(config/database.yml)
linked_dirs: [] # 软连的名称 %w(log tmp vendor/bundle public/system public/uploads )
default_env: {path: "#{ruby_path}/bin:$PATH"} # 一般是ruby的路径
branch: 'master' # 分支
keep_releases: 5
log_level: :debug


发版的流程

会依次执行一下 cap production deploy,

deploy
  deploy:starting
    [before]
      deploy:ensure_stage
      deploy:set_shared_assets
    deploy:check
  deploy:started
  deploy:updating
    git:create_release
    deploy:symlink:shared
  deploy:updated
    [before]
      deploy:bundle
    [after]
      deploy:migrate
      deploy:compile_assets
      deploy:normalize_assets
  deploy:publishing
    deploy:symlink:release
  deploy:published
  deploy:finishing
    deploy:cleanup
  deploy:finished
    deploy:log_revision

以下可用的hook

deploy:starting    - start a deployment, make sure everything is ready
deploy:started     - started hook (for custom tasks)
deploy:updating    - update server(s) with a new release
deploy:updated     - updated hook
deploy:publishing  - publish the new release
deploy:published   - published hook
deploy:finishing   - finish the deployment, clean up everything
deploy:finished    - finished hook

例如在发版之后 执行一些操作,

after :publishing, :exec_thing_task

版本回退 cap production deploy:rollback

deploy
  deploy:starting
    [before]
      deploy:ensure_stage
      deploy:set_shared_assets
    deploy:check
  deploy:started
  deploy:reverting
    deploy:revert_release
  deploy:reverted
    [after]
      deploy:rollback_assets
  deploy:publishing
    deploy:symlink:release
  deploy:published
  deploy:finishing_rollback
    deploy:cleanup_rollback
  deploy:finished
    deploy:log_revision

定义自己的任务

namespace :deply do
 after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      execute " kill -USR2 `cat #{root_path}/current/tmp/pids/unicorn.pid` "

      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end
end

会在deploy 目录下的任务
release_path 会显示全路径 /home/projects/kkb/**/2015232342343/
current_path 会显示  /home/projects/kkb/cms/current/

使用jenkin发版,会执行哪些重要的操作

1. 从github 上拉取代码
2. bundle exec cap office_staging deploy office_branch=hotfix
3. 打包代码 tar -cvzf archive.tar.gz Capfile Gemfile Gemfile.lock Guardfile README.md README.rdoc Rakefile Vagrantfile Version app bin config config.ru db lib log public solr test vendor
4. 检查rvm,应为使用了rvm来管理ruby的版本
5. 检查 share 目录和文件是否存在,不存在则写入。 `/usr/bin/env mkdir -pv /home/kkb/projects/cms/shared/log`
6. 压缩,打包
7. 创建 release_path 
`release_path: /home/kkb/projects/cms/releases/20151112080543 is created on all roles`
8. 创建临时文件 /tmp/tmp.1qDHMbknxd
9. 上传到服务器
10. 解压到release 目录下
`/usr/bin/env tar -xzf /tmp/tmp.1qDHMbknxd -C /home/kkb/projects/cms/releases/20151112080543`
删除 `/usr/bin/env rm /tmp/tmp.1qDHMbknxd`

11. 判断release 目录存在吗
/usr/bin/env if test ! -d /home/kkb/projects/cms/releases/20151112080543

12. 生成 软连的目录
13. 软连到目录和文件
ln -s /home/kkb/projects/cms/shared/log /home/kkb/projects/cms/releases/20151112080543/log

14. 执行bundle
~/.rvm/bin/rvm default do bundle install --path /home/kkb/projects/cms/shared/bundle --without development test --quiet

15. HOOK: 执行 before :updated :grunt 任务
16. 执行预编译
` bundle exec rake assets:precompile` 
17. 生成 assets_manifest_backup # TODO 什么是manifeat
/usr/bin/env mkdir -p /home/kkb/projects/cms/releases/20151112080543/assets_manifest_backup

18. 数据库脚本执行
rake db:migrate

19. 删除 current 目录
rm -rf /home/kkb/projects/cms/current 

20. 软连 current
/usr/bin/env ln -s /home/kkb/projects/cms/releases/20151112080543 /home/kkb/projects/cms/current

21. HOOK:  after :publishing, :restart
重启unicron
22. 检查 release 的个数,超过设定值则删掉

23. 成功