部署 赞美 Mina,实在太好用了,写点心得给还在纠结的同学

darkbaby123 · 发布于 2013年3月20日 · 最后由 u1445594398 回复于 2016年4月01日 · 16775 次阅读
2575
本帖已被设为精华帖!

最近重构代码完成需要部署,想着最近几年受够了Capistrano,也该换换新欢了,遂试了试Mina。发现确实好用!

说下几点好处:

部署时生成的信息更简洁清楚

这个其实是我在意的一点,也是最烦Capistrano的一点,一个简单的部署任务,提示信息刷屏似的,混杂了一堆底层命令和IP地址,生怕你不知道脚本是在远程跑似的……因为信息太多,有时候出个bug,想跟踪看看哪一步错了,都要仔细分辨下……

其实我想看的就是,部署几大步骤简单列出来,版本库迁出,symlink配置文件,跑bundle,编译assets,重启服务器,某些步骤加一点额外信息就够了,没必要每个步骤都把细节全部列出来。

以下是从Mina部署的提示信息:

-----> Using RVM environment '1.9.3'
       Using /usr/local/rvm/gems/ruby-1.9.3-p392
-----> Creating a temporary build path
-----> Fetching new git commits
-----> Using git branch 'master'
       Cloning into '.'...
       done.
-----> Using this git commit

       User (5bf268b):
       > 重构项目

-----> Symlinking shared paths
-----> Installing gem dependencies using Bundler
       Using rake (10.0.3) 
       Using i18n (0.6.4) 
       Using multi_json (1.6.1) 
       ...
-----> Skipping asset precompilation
-----> Build finished
-----> Moving build to releases/13
-----> Updating the current symlink
-----> Launching
       .
-----> Done. Deployed v13
       Elapsed time: 8.00 seconds

是不是看着挺干净?该简洁的时候简洁,关键地方提示你一下,比如这次部署迁出的版本commit内容,assets被skip掉了(因为没有改变),等等。实际显示在终端中的效果还有高亮哦。

部署变快了

据说两者原理不同,Mina只用一个ssh连接,Capistrano用多个,这个我就不提了。说下个人觉得影响速度的另外一点。

Capistrano对编译Rails 3的assets非常蠢,每次部署都重新编译所有文件,当然你可以加一个turbo-sprockets-rails3去只编译改动过的文件。但Mina部署时会自动判断assets是否改动,对没有改动的文件直接使用老的编译版本,而且好像不需要单独的gem支持。

部署脚本简单,扩展性强

标准的部署脚本肯定不能满足各人的需求,大部分情况下都需要中途插入一些步骤,Capistrano使用回调的形式:

after "deploy:create_symlink"
  run  "ln -sf #{shared_path}/config/mongoid.yml #{current_path}/config/mongoid.yml"
end

而Mina提倡你自己写:

task :deploy => :environment do
  deploy do
    # Put things that will set up an empty directory into a fully set-up
    # instance of your project.
    invoke :'git:clone'
    invoke :'deploy:link_shared_paths'

    # blablabla 想写些啥自己搞定吧

    invoke :'bundle:install'
    invoke :'rails:assets_precompile'

    to :launch do
      queue './script/unicorn upgrade'
    end
  end
end

谁更简单,这点见仁见智。但个人觉得Mina的方式更简单清晰,不仅一眼就可以看出整个部署流程要执行哪些任务,而且也方便你随意修改。Capistrano中每次我要插入一些自定义任务时,都要先回忆一下它默认会跑哪几个任务,然后想想代码该放在那个任务的回调里,再想想是放before还是放after……

支持git submodule

用过git submodule的都知道要更新submodule要单独跑两个命令。这点我不知道Capistrano支不支持,不好评论,但Mina会在clone版本库的时候自动帮你把git submodule init和git submodule update两个命令跑了,省心。

小结

Mina只是今天开始用了一下,也算不上熟悉,也许有些结论并不正确。但它给我的感觉,就是保持扩展性的同时,剪掉了Capistrano复杂的部分,变得简单清爽。如果你不喜欢Capistrano的复杂,Mina会是个不错的选择。

共收到 67 条回复
15
huobazi · #1 · 2013年3月20日 2 个赞
2575
darkbaby123 · #2 · 2013年3月20日

@huobazi 嗯,这个我看过,今天搞Mina第一件事就是在论坛上搜帖子~ 这个脚本我没完全用,感觉写的太复杂了。大部分的我用不到,就只把它的多服务器配置挪过来了。

2575
darkbaby123 · #3 · 2013年3月20日

瞬间45次阅读……难道大家都是快下班无心做事了来刷RubyChina么~

2408
larryzhao · #4 · 2013年3月20日

是很不错, 之前看到就也想换用这个来着, 不过一直没下决心..

3196
ryan · #5 · 2013年3月20日 1 个赞

mina...nima.....

2575
darkbaby123 · #6 · 2013年3月20日

@larryzhao 可以试试,切换成本很低,为了以后的幸福生活花点时间还是值得的。 @Ryan 我是每次读这个词都想到一句日语……

3196
ryan · #7 · 2013年3月20日

#6楼 @darkbaby123 everybody吗?

2575
darkbaby123 · #8 · 2013年3月20日

@Ryan 好像是这个意思,动画片里出现的最多。每次我听到这个词都一身冷汗。。。

3196
ryan · #9 · 2013年3月20日

#8楼 @darkbaby123 纳尼?为何是一身冷汗的节奏。。。

2575
darkbaby123 · #10 · 2013年3月20日

@Ryan 你想象一下,一个少年/少女满脸感动涕泪横流的看着周围的一群狐朋狗友……关键是前面的铺垫一般都不怎么感动……太狗血了一点

3196
ryan · #11 · 2013年3月20日

#10楼 @darkbaby123 这个确实挺脑残的。。。妥妥抛弃此类动画。

2575
darkbaby123 · #12 · 2013年3月20日

@Ryan 关键是现在日本游戏也是这种脑残节奏,FF都已经这样了…… PS:我们再扯下去这帖子会被挪到“瞎扯淡”里去?

3196
ryan · #13 · 2013年3月20日

#12楼 @darkbaby123 其实我们在部署瞎扯淡。。。PS:去看海贼王吧。

96
sailtsao · #14 · 2013年3月20日

#13楼 @Ryan PS:海贼王太基友了,火影太励志了,死神太狗血了,还是看些小清新的,比如花开物语,搞笑大王,男子高中生的日常,琴浦小姐,我的朋友很少,重口味的,比如未来日记,罪恶王冠,寒蝉鸣泣之时,School Days(你觉得我会说告诉你们他中文名叫<<日在学校>>么?我才没那么低俗呢...)还有恶搞的,比如伊克西翁(神动漫,各大网站都屏蔽了,只有乐视影视有),热带雨林的爆笑生活
额...信息量有点大...基本上这些是立马会出现在我脑子里的动漫...
漏了一个治愈系的:爱杀宝贝,我保证你在看了两集以后会爱上他的...当初看罪恶王冠就靠这个动漫来中和啊... 重口的还可以看搞笑日和
PS:楼偏的厉害了,转回来...mina是日语里我们的意思...mina是个好东东...楼主比我总结的有深度...
PSPS:最近可以支持一个国产动漫"十万个冷笑话"一个月一集...质量不低...吐个槽:国产高铁侠蜡笔小新神马的屌爆了...

3196
ryan · #15 · 2013年3月20日

#14楼 @sailtsao 是的大王,对不起大王!叫我女王大人! PS:改天一定尝试下mina

2511
as181920 · #16 · 2013年3月20日

#14楼 @sailtsao 好多哦,都没看过,休息的时候就看过一个草莓棉花糖,很好看,哈哈。

96
sailtsao · #17 · 2013年3月20日

#16楼 @as181920 草莓棉花糖也很治愈,必看必看...日本动漫说实话已经无法超越了...国产高铁侠威武,国产嘟嘟(蜡笔小新)荡漾...

78
ashchan · #18 · 2013年3月20日

#7楼 @Ryan 是的,大家的意思。mina: 皆。

4491
bydmm · #19 · 2013年3月20日

... 怎么突然跑去聊动漫了

146
skandhas · #20 · 2013年3月20日

这楼歪的有水平啊

681
sevk · #21 · 2013年3月20日

mini 可以自己编译到 ubuntu phone 里面当服务器用吗?

1731
xiongbo · #22 · 2013年3月21日

我深深的感觉 @sailtsao 现实肯定是个话痨

96
sailtsao · #23 · 2013年3月21日

#22楼 @xiongbo 其实我话也不多...也就是现在天天憋在家里憋的...(# ̄▽ ̄#)

2575
darkbaby123 · #24 · 2013年3月21日

一夜起来楼都歪成这样了……不过今天好像有归正的迹象,还得继续歪一下…… @sailtsao 动漫达人啊!我这种还停留在钢之炼金术师和鲁鲁修的人是不是弱爆了……十万个冷笑话确实不错 @Ryan 海贼王看过一段时间,最大的收获就是从“怎么每个人都是那种西瓜嘴”到“其实这家伙还挺帅的”……

2575
darkbaby123 · #25 · 2013年3月21日

@sevk 额,貌似你搞错了,我们讨论的是部署工具Mina(其实哪里有讨论了……)?还是你也是来歪楼的?

15
huobazi · #26 · 2013年3月21日

楼怎么歪成这样。

96
WolfLee · #27 · 2013年3月21日

School Days 不是应该叫《好船》 么

3093
williamherry · #28 · 2013年3月21日

真是好东西,cap一直搞不太懂,这个简单多了,谢谢分享

96
sailtsao · #29 · 2013年3月21日

#27楼 @WolfLee 刚去百度知道补习了下才了解了这个词的意思...您才是ruby界的acg大神啊...崇拜...我该被nice boat了... PS:你们不许再歪楼了!!!

2575
darkbaby123 · #30 · 2013年3月21日

@WolfLee 这个……中文名我还真不敢说,太不和谐了

96
goinaction · #31 · 2013年3月21日

不就是日在校园吗 PS:java也有个很有名的网络框架叫Mina,这两个早晚要搞混

3093
williamherry · #32 · 2013年3月21日

好像好久没更新了,而且我遇到一个很奇怪的问题,mina setup的时候提示输入密码,我输入后按回车它还在那里闪,再按一次报错

william@localhost's password: 
william@localhost's password:        Permission denied, please try again.

按第一次回车它还停在上一行,再按一次就报错

96
aptx4869 · #33 · 2013年3月21日

#26楼 @huobazi 楼怎么歪成这样。 这一定是时臣的错

1189
tiseheaini · #34 · 2013年3月21日

#1楼 @huobazi #32楼 @williamherry 同样遇到这样的问题,不知道为什么??

2511
as181920 · #35 · 2013年3月21日

#32楼 @williamherry 还没用过,感觉是要看看文件权限是否够,而不是密码不对,可以看mina这一段具体执行什么shell代码

3093
williamherry · #36 · 2013年3月21日
p2 = fork do                                                                                        
  trap("INT") {}
  while (char = STDIN.getbyte rescue nil)
    i.putc char if char
  end
end

是这部分代码,这个项目github上好像好久没更新了,感觉不怎么靠谱,还是cap吧

808
lihuazhang · #37 · 2013年3月21日

#36楼 @williamherry 感觉没差。。。

15
huobazi · #38 · 2013年3月21日

#34楼 @tiseheaini 我遇到过,记得要设置终端什么的,要不密码读不进去,我想想。 #32楼 @williamherry

3657
teacafe2000 · #40 · 2013年3月21日

看起来真是不错~~

1189
tiseheaini · #41 · 2013年3月21日

#39楼 @huobazi 貌似不是,是在 mina setup 时的问题,不是 mina deploy时出问题 这样的问题应该很普遍才对,可为什么 google 都找不到,我的环境 ubuntu 12.04 32位

15
huobazi · #42 · 2013年3月21日

#41楼 @tiseheaini set_up需要sudo,我遇到一样的问题, 你看 issue 41/51/99 都是设置 term_mode的。

96
sailtsao · #43 · 2013年3月21日

这问题没碰到过...我设置的ssh登录,然后账号设置成不需要密码...so我根本看不到提示密码的情况...

2575
darkbaby123 · #44 · 2013年3月22日

@tiseheaini Mina本质上就是ssh上去执行脚本,如果ssh的账号拥有权限是不会出问题的。有可能是你setup时新建目录的地方需要root用户权限。 如果执行 sudo 操作,我记得Mina中有相应的配置。你可以 bundle open mina 打开Mina源码,搜索一下 sudoer。希望对你有帮助。

3093
williamherry · #45 · 2013年3月22日

@huobazi 好像我的就是这个问题,感谢,不过还是学cap吧,虽然难点

96
James_Zhan · #46 · 2013年3月22日

刚把Capistrano刚透彻,又出了这么一个东西,还是等他成熟一点吧,感觉取名为nani会更好点,就不会和Java的NIO Framework冲突了。

1189
tiseheaini · #47 · 2013年3月22日

#44楼 @darkbaby123 谢谢,我再折腾折腾

96
ranmocy · #48 · 2013年3月23日

#46楼 @James_Zhan 改名 nani 亮瞎了

5877
ericliu · #49 · 2013年3月23日

以前只管用cap,不管写。觉得好麻烦。

mina,有新目标了,呵呵。这几天一直在折腾服务器。受教了,谢谢!

2220
hexawing · #50 · 2013年3月24日

只玩过passenger+Nginx的人茫然地看着各位歪楼……

3468
tylerlong · #51 · 2013年3月24日

如果都自己写的话, cap也可以啊. 当初我用cap的时候就是全部自己写的. 诸如 run "cd #{website_dir} && git pull origin master" run "cd #{website_dir} && bundle install --binstubs ./binstubs/"

Rails经验比较少, 我的做法非主流. 不过自己感觉完全够用了. 太复杂的方案不好维护.

96
jokaye · #52 · 2013年3月24日

Mark了..哈哈

96
kevinbin · #53 · 2013年3月25日

我主要就是拿cap部署些软件比如mysql,mysql cluster,过程都写到recipe里几个命令就可以轻松的批量部署了,有时候还可以拿来做cssh,对我们这种经常做实施的人来说太爽了,但开启cap shell时ruby占cpu狂高。mina看起来好像还是太简单了还不能满足我的需求。

778
foyo99 · #54 · 2013年3月25日

cap是挺烦的. 我也试试Mina.

96
wym205 · #55 · 2013年3月26日

感谢推荐turbo-sprockets-rails3,试了下很好使

540
iceskysl · #56 · 2013年3月27日

Capistrano一直不喜欢,没理由的不喜欢,之前还改过vlad用~

2847
yujing_z · #57 · 2013年3月28日

刚也转到mina了,参照https://github.com/alfuken/mina-rails-unicorn-nginx-god

不过这货用的freebsd,跟ubuntu还是有些不一样。感觉可以写个ubuntu的receipt

410
yakjuly · #58 · 2013年4月02日

Gemfile中 用了 私有 git服务器的 gem。使用mina出错了。

Could not find devise_cas_authenticatable-1.1.2 in any of the sources

日志是
bundle install --without development:test --path "./vendor/bundle" --binstubs bin/ --deployment

有人遇到么

15
huobazi · #59 · 2013年4月02日

#58楼 @yakjuly 我猜你的deploy账户要有你的私有git服务器git clone 权限 最好是 添加了ssh key的

2575
darkbaby123 · #60 · 2013年4月02日

@yakjuly Could not find devise_cas_authenticatable-1.1.2 in any of the sources 有可能是楼上提到的情况,但也有可能提示在你的gem server中找不到指定版本的 devise_can_authenticatable插件吧?如果你是自己搭建gem server的话。 建议你ssh上去手动跑bundle install查看一下。

410
yakjuly · #61 · 2013年4月03日

@huobazi @darkbaby123 昨天发完评论后 查了下 发现是模板中写着

set :deploy_to, '/home/xxx/#{application}' 

忘了这是原来capistrano的 还是 mina默认生成的, 没注意修改。 结果发现服务器上创建了一个 #{application} 文件夹,然后。。。部署出错, 就是目录这个原因。

920
nouh · #62 · 2013年4月15日

想对多个环境进行部署怎么弄, 比如一个staging, 一个production. domain似乎只能设定一个

2511
as181920 · #63 · 2013年4月15日
task :production do
  set domain: "xxxxxxxxx"
end
96
AReverie · #64 · 2013年5月28日

今天总算有时间来瞄了一眼mina

初步感受,做deploy做的比capistrano更快速了;然后也因为如此只适合做deploy,难说是好事还是坏事。

比如基本的:deploy_to设置是必须的,因为无论做什么task前都会检查这个设置

原来还在用capistrano做做远程机器管理的东西(其实某还没开始看chef)

所以对于部署,切换到mina应该是问题不大的

想做远程机器管理还是看看chef或者puppet来的好XDDD

2913
zealinux · #65 · 2013年6月08日

@darkbaby123 如果我只想调用deploy里的launch部分。 mina命令是什么

2913
zealinux · #66 · 2013年8月02日

mina中,默认的rails:assets_precompile 遇到 config.assets.precompile += ['xxx.css']这样的文件不会预编译。 必须改成下面的。 rails:assets_precompile:force

96
u1445594398 · #67 · 2016年4月01日

抱歉,我頂個樓。 現在 2016 了,大家還是推薦 mina 嗎? 我都是用 Capistrano,而且我部署的不一定是 Rails 專案, 我跑的東西有些還是 docker 的,得手動跑 docker-compose 起來(我都寫在 capistrano deploy task 中)

大家有其他意見嗎?

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