Back

[草稿] capistrano的原理

发布时间: 2015-07-03 01:05:00

裸代码:   没有数据库的配置文件,  没有服务器相关的配置文件,  也没有压缩各种css/js , 一般都是从git上直接clone下来的代码. 

传统的部署步骤:   

   1. ssh 到服务器.  2.  git pull .  3. restart  command ...   

   坏处是:  无法回滚,  每次都人肉, 特别麻烦. (虽然上面3个步骤看似很少, 但是需要一直盯着(比如, ssh 需要10秒, git pull 需要20秒, restart 也需要人肉输入, 这些都是时间上的损耗, 而且人肉做重复性的事情, 无趣, 容易出错. )

合理的部署是:  

   编写好 一个配置文件之后, 运行代码:  $ cap deploy  (一个命令) , 之后的所有事情, 都不用人参与了. 

结构: 

1.  有三个角色:       部署人员的机器,           目标服务器,         代码服务器(GIT)

 ( 见譞的本本上的图 ) 

每次部署, 都要做的事情: 

1.  SSH 到目标服务器

2. 把最新的代码,上传到目标服务器上.  这时候的代码是裸代码( 不能立刻部署, 因为很多配置文件都没有) 

我们不能把配置文件也放到git 里面, 比如: config/database.yml  , 每个人的数据库的 root , 密码都不一样.  

以及其他的东东(上传文件夹) 

原理:  每次部署, 都要用一个文件夹.  (方便回滚) 

回滚的方式有几种: 

      1)  code roll back.   (git checkout ...  )    这样不好,很多时候我们无法保证代码是没有被修改的. 被修改之后, checkout .. .会涉及到 代码合并.   这个情况, 在某些 紧急 BUG 出现时, 会特别明显.   

      2)  每个release 都用一个文件夹( 里面包含了完整的项目代码, 包括裸代码, 和 各种配置文件) .     比如:  201506,  201505  (时间戳命名)     ,然后, 有一个特殊的 文件夹(softlink, 叫 current )   web服务器 一直使用这个 current 文件夹. (不需要每次都改nginx... thin (rails server) 的配置文件)  , 只需要把 current 这个softlink , 指向不同的 release 文件夹就可以了.  

所以,  capistrano部署下的 文件结构是:

/opt/rails_app:  
current -> /opt/app/happystock_web/releases/20150518030114/ 
releases/
    20150210022441  20150210131018  20150228032307  20150304110004  20150310020737  20150320071854  20150505033300
    20150210025432  20150210132602  20150228113310  20150305014737  20150310102403  20150320082640  20150507030343
    20150210082413  20150227094142  20150304104119  20150310010954  20150319015536  20150504022043
shared/ 
    assets  config  files  log  pids  public  system

( shared 中所保存的内容, 以及部分目录结构, 是由 config/deploy.rb 这个配置文件决定的  ) 

3. 准备启动服务器:  
     1. 安装各种新增的rubygem,  

     2.  做必要的数据库迁移.   

     3.  配置各种文件.  

     4.  修改上传文件夹的soft link. 

     5. 其他,每次使用裸代码做部署的时候,都要人肉做的事情.  (修改保存日志的路径,  修改 rails server的配置,  ) 

     6. 编译,压缩 js/ css

4.  重启 服务器.     ( $ nginx -s reload,  $ kill -9 xxx   ,  $ thin start -C config/thin.yml ... )  

$ cap deploy:setup  # 建立需要的各种文件夹

$ cap deploy     # 部署

Back