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

darkbaby123 · 2013年03月20日 · 最后由 u1445594398 回复于 2016年04月01日 · 24731 次阅读
本帖已被管理员设置为精华贴

最近重构代码完成需要部署,想着最近几年受够了 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 会是个不错的选择。

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

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

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

mina...nima.....

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

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

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

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

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

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

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

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

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

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

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

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

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

这楼歪的有水平啊

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

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

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

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

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

楼怎么歪成这样。

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

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

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

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

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

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

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

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

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

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

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

p2 = fork do                                                                                        
  trap("INT") {}
  while (char = STDIN.getbyte rescue nil)
    i.putc char if char
  end
end

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

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

看起来真是不错~~

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

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

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

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

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

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

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

#46 楼 @James_Zhan 改名 nani 亮瞎了

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

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

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

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

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

Mark 了..哈哈

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

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

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

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

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

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

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

有人遇到么

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

@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 查看一下。

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

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

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

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

task :production do
  set domain: "xxxxxxxxx"
end

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

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

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

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

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

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

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

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

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

大家有其他意見嗎?

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