部署 赞美 Mina,实在太好用了,写点心得给还在纠结的同学
最近重构代码完成需要部署,想着最近几年受够了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 我是每次读这个词都想到一句日语……
#6楼 @darkbaby123 everybody吗?
@Ryan 好像是这个意思,动画片里出现的最多。每次我听到这个词都一身冷汗。。。
#8楼 @darkbaby123 纳尼?为何是一身冷汗的节奏。。。
@Ryan 你想象一下,一个少年/少女满脸感动涕泪横流的看着周围的一群狐朋狗友……关键是前面的铺垫一般都不怎么感动……太狗血了一点
#10楼 @darkbaby123 这个确实挺脑残的。。。妥妥抛弃此类动画。
@Ryan 关键是现在日本游戏也是这种脑残节奏,FF都已经这样了…… PS:我们再扯下去这帖子会被挪到“瞎扯淡”里去?
#12楼 @darkbaby123 其实我们在部署瞎扯淡。。。PS:去看海贼王吧。
#13楼 @Ryan PS:海贼王太基友了,火影太励志了,死神太狗血了,还是看些小清新的,比如花开物语,搞笑大王,男子高中生的日常,琴浦小姐,我的朋友很少,重口味的,比如未来日记,罪恶王冠,寒蝉鸣泣之时,School Days(你觉得我会说告诉你们他中文名叫<<日在学校>>么?我才没那么低俗呢...)还有恶搞的,比如伊克西翁(神动漫,各大网站都屏蔽了,只有乐视影视有),热带雨林的爆笑生活
额...信息量有点大...基本上这些是立马会出现在我脑子里的动漫...
漏了一个治愈系的:爱杀宝贝,我保证你在看了两集以后会爱上他的...当初看罪恶王冠就靠这个动漫来中和啊...
重口的还可以看搞笑日和
PS:楼偏的厉害了,转回来...mina是日语里我们的意思...mina是个好东东...楼主比我总结的有深度...
PSPS:最近可以支持一个国产动漫"十万个冷笑话"一个月一集...质量不低...吐个槽:国产高铁侠蜡笔小新神马的屌爆了...
... 怎么突然跑去聊动漫了
这楼歪的有水平啊
mini 可以自己编译到 ubuntu phone 里面当服务器用吗?
我深深的感觉 @sailtsao 现实肯定是个话痨
@sevk 额,貌似你搞错了,我们讨论的是部署工具Mina(其实哪里有讨论了……)?还是你也是来歪楼的?
楼怎么歪成这样。
School Days 不是应该叫《好船》 么
真是好东西,cap一直搞不太懂,这个简单多了,谢谢分享
@WolfLee 这个……中文名我还真不敢说,太不和谐了
不就是日在校园吗 PS:java也有个很有名的网络框架叫Mina,这两个早晚要搞混
好像好久没更新了,而且我遇到一个很奇怪的问题,mina setup的时候提示输入密码,我输入后按回车它还在那里闪,再按一次报错
william@localhost's password:
william@localhost's password: Permission denied, please try again.
按第一次回车它还停在上一行,再按一次就报错
#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吧
#36楼 @williamherry 感觉没差。。。
#34楼 @tiseheaini 我遇到过,记得要设置终端什么的,要不密码读不进去,我想想。 #32楼 @williamherry
看起来真是不错~~
#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
有人遇到么
@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 中)
大家有其他意見嗎?