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. 成功