最近重构代码完成需要部署,想着最近几年受够了 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 的都知道要更新 submodule 要单独跑两个命令。这点我不知道 Capistrano 支不支持,不好评论,但 Mina 会在 clone 版本库的时候自动帮你把 git submodule init 和 git submodule update 两个命令跑了,省心。
Mina 只是今天开始用了一下,也算不上熟悉,也许有些结论并不正确。但它给我的感觉,就是保持扩展性的同时,剪掉了 Capistrano 复杂的部分,变得简单清爽。如果你不喜欢 Capistrano 的复杂,Mina 会是个不错的选择。
@huobazi 嗯,这个我看过,今天搞 Mina 第一件事就是在论坛上搜帖子~ 这个脚本我没完全用,感觉写的太复杂了。大部分的我用不到,就只把它的多服务器配置挪过来了。
#13 楼 @Ryan PS:海贼王太基友了,火影太励志了,死神太狗血了,还是看些小清新的,比如花开物语,搞笑大王,男子高中生的日常,琴浦小姐,我的朋友很少,重口味的,比如未来日记,罪恶王冠,寒蝉鸣泣之时,School Days(你觉得我会说告诉你们他中文名叫<<日在学校>>么?我才没那么低俗呢...) 还有恶搞的,比如伊克西翁 (神动漫,各大网站都屏蔽了,只有乐视影视有),热带雨林的爆笑生活
额...信息量有点大...基本上这些是立马会出现在我脑子里的动漫...
漏了一个治愈系的:爱杀宝贝,我保证你在看了两集以后会爱上他的...当初看罪恶王冠就靠这个动漫来中和啊...
重口的还可以看搞笑日和
PS:楼偏的厉害了,转回来...mina 是日语里我们的意思...mina 是个好东东...楼主比我总结的有深度...
PSPS:最近可以支持一个国产动漫"十万个冷笑话"一个月一集...质量不低...吐个槽:国产高铁侠蜡笔小新神马的屌爆了...
好像好久没更新了,而且我遇到一个很奇怪的问题,mina setup 的时候提示输入密码,我输入后按回车它还在那里闪,再按一次报错
william@localhost's password:
william@localhost's password: Permission denied, please try again.
按第一次回车它还停在上一行,再按一次就报错
p2 = fork do
trap("INT") {}
while (char = STDIN.getbyte rescue nil)
i.putc char if char
end
end
是这部分代码,这个项目 github 上好像好久没更新了,感觉不怎么靠谱,还是 cap 吧
#41 楼 @tiseheaini set_up 需要 sudo,我遇到一样的问题,你看 issue 41/51/99 都是设置 term_mode 的。
@tiseheaini Mina 本质上就是 ssh 上去执行脚本,如果 ssh 的账号拥有权限是不会出问题的。有可能是你 setup 时新建目录的地方需要 root 用户权限。
如果执行 sudo 操作,我记得 Mina 中有相应的配置。你可以 bundle open mina
打开 Mina 源码,搜索一下 sudoer。希望对你有帮助。
刚把 Capistrano 刚透彻,又出了这么一个东西,还是等他成熟一点吧,感觉取名为 nani 会更好点,就不会和 Java 的 NIO Framework 冲突了。
如果都自己写的话,cap 也可以啊。当初我用 cap 的时候就是全部自己写的。诸如
run "cd #{website_dir} && git pull origin master"
run "cd #{website_dir} && bundle install --binstubs ./binstubs/"
Rails 经验比较少,我的做法非主流。不过自己感觉完全够用了。太复杂的方案不好维护。
我主要就是拿 cap 部署些软件比如 mysql,mysql cluster,过程都写到 recipe 里几个命令就可以轻松的批量部署了,有时候还可以拿来做 cssh,对我们这种经常做实施的人来说太爽了,但开启 cap shell 时 ruby 占 cpu 狂高。mina 看起来好像还是太简单了还不能满足我的需求。
刚也转到 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} 文件夹,然后。。。部署出错,就是目录这个原因。
今天总算有时间来瞄了一眼 mina
初步感受,做 deploy 做的比 capistrano 更快速了;然后也因为如此只适合做 deploy,难说是好事还是坏事。
比如基本的:deploy_to
设置是必须的,因为无论做什么 task 前都会检查这个设置
原来还在用 capistrano 做做远程机器管理的东西(其实某还没开始看 chef)
所以对于部署,切换到 mina 应该是问题不大的
想做远程机器管理还是看看 chef 或者 puppet 来的好 XDDD
mina 中,默认的rails:assets_precompile
遇到
config.assets.precompile += ['xxx.css']
这样的文件不会预编译。
必须改成下面的。
rails:assets_precompile:force
抱歉,我頂個樓。 現在 2016 了,大家還是推薦 mina 嗎? 我都是用 Capistrano,而且我部署的不一定是 Rails 專案, 我跑的東西有些還是 docker 的,得手動跑 docker-compose 起來(我都寫在 capistrano deploy task 中)
大家有其他意見嗎?