分享 Say goodbye to Capistrano, say hello to Mina.

sailtsao · 2013年03月10日 · 最后由 jasl 回复于 2013年03月14日 · 7165 次阅读

capistrano 大家都用过,不知道大家对他的感觉是啥,我的感觉是太复杂,网上找找教程也只是改改简单配置,还是有很多东西需要手动上服务器去管理
mina 相比 cap 来说,速度快是必须的了,本地生成 script 然后 ssh 到服务器去一次执行,而 cap 则需要 ssh 登录服务器好几次才行.mina 官网都形容是 really bloody fast...
其实速度都是最次要考虑的,最主要的用这种 gem 是为了方便,谁也不想每次部署都要执行一大堆的命令,太烦了。因为我用的是 nginx+unicorn,所以之前用 cap 的时候每次 cap deploy 之后都要连到服务器上去重启 unicorn,很是烦恼,而且第一次部署的时候还要进行 nginx 配置,unicorn 配置。如果这一切都能自动化该多好?
偶然一天在 ruby-china 上看到@huobazi推荐的 unicorn+nginx+mina 的 github 项目,简直是部署神器啊,有了这个项目配合 mina,你只需要在服务器上安装好 nginx,然后在你项目里面加上此项目的 lib 文件并改几个配置,恭喜你,所有一切的琐事你都不要操心了,此项目都帮你弄好了,什么 nginx 添加新网站配置文件,unicorn 配置,unicorn 重启,nginx 重启,rake 命令神马的都可以在本地轻松完成,而且速度超快。用 unicorn 和 nginx 的你难道不心动么?心动不如行动,快去试试吧,绝对可以让你不再害怕部署的繁琐操作 mina 官网 unicorn+nginx+mina 项目的 Github Page unicorn+nginx 的 cap 版我没有用过,只是搜了一下发现 cap 也有此类项目,对 cap 有感情的可以尝试

mint 确实快

嘿嘿 mina 谁用谁知道!

看了一遍文档

项目没有公开访问的 git 仓库,怎么做到本地打包,然后上传呢?

打包直接用 tar,那么上传呢?有没有类似 push 上传文件的方法

@kingwkb 你的意思是你的项目文件的 git url? 在 deploy 里面配置 set :repository, 'your git repo url'

前两天才用过,入手比较简单,也挺快 其实关键是最近 capistrano 对 rails4 支持的不好,部署不成,就干脆用 mina 了,不过可能是因为刚用,有些东西还是自己 ssh 到服务器那边搞的

unicorn 有现成的 recipe 没换掉 capistrano 主要还是因为 recipe 比较全面了 看例子 mina 天生支持 multi-stage 挺不错的 我对 capistrano 的 deploy.rb 做了些手术才达成的

这不就是让人爽歪歪的东西吗?

Cap 我还没开始用呢....

#5 楼 @sailtsao 我不是这个意思,我的意思是我的项目没有公网可以访问的 git,都是内网的,所以呢部署时候需要在本地把代码 tar 打包,然后上传

#7 楼 @jasl cap 也可以有 cap production deploy 这样子的用法

不知道 @sailtsao 说的 ssh 几次是什么意思,cap 也可以一次连接执行多个任务,比如 cap update_code link_files restart 这样

@nevill 那个测试过 不够 dry 而且不够灵活 我的方法https://github.com/jasl/start_up/blob/master/config/deploy.rb

真心不错,还提供了 sudo_setup,可以专门用另外一个有 sudo 权限的用户来执行一些需要管理员权限的配置

#12 楼 @jasl 可以说一下为什么不够 dry 呢?

看了你的 deploy.rb,我大概明白关键一点是你用了不同的 env 变量来区分 production 和 stage,我下面的例子是 stage / production 都用 'production' 作为 env 变量值。 至于说具体的配置,比如 database.yml 不同,可以在 after deploy:finalize_update 或者 deploy:create_symlink 这个步骤解决。

task :stage do
  set :user, "tester"
  set :target, "stage"
  server "stage.example.com", :app, :web, :db, :primary => true
end

task :production do
  set :user, "deployer"
  set :use_sudo, false
  set :target, "www"
  server "www.example.com", :app, :web, :db, :primary => true
end

set :rails_env, "production"
set :deploy_via, :copy
set :deploy_to, "/deploy/path"

@nevill 因为 set 各个变量要每个环境写一套,我那个还有些遗留代码没 cleanup 掉,但实际上完全可以set :user, deploy[:user]一条搞定,另外你说的具体配置不同 那还要增加钩子来解决,感觉太麻烦了,不同环境的特别的任务放到 deploy/:env 里然后一 load 就行了,如果你觉得 cap production deploy 好 其实完全可以做到这样 我扫了一眼 multi_stage 的实现,太复杂,如果不是为了做成 cap 的 ext,根本不用那么复杂

重写了自己的 multi_stage 实现,review 了下 github 上的,当初写的时候脑子不清楚

@nevill 我觉得他复杂主要是因为个人的洁癖,我的配置是用 yaml 统一管理的,所以我应该在 deploy.rb 里 load 他,但是 deploy/:env 里没有这个上下文 要重新加载 我觉得这完全不应该 你的写法也不错 解决了上边的问题,但是如果添加新的 env 要修改 deploy.rb 也不是很好

我新的实现利用 eval 读取 deploy/:env 没有感觉到用 task 包装有什么好处

需要 登录 后方可回复, 如果你还没有账号请 注册新账号