用 mina 部署单台服务器没问题。
但最近做分布式,因此需要跑一下 mina deploy 同时部署几台服务器,找了下没有相关的资料,求各位指点指点
首先感谢各位的耐心解答,不过搞了许多时间,表示疑惑越来越大。其中,
set :domains, %w[192.168.0.12 192.168.0.13]
domains.each do |domain|
p "begin to deploy server #{domain}"
set :domain, domain
invoke :deploy
run!
p "finish to deploy server #{domain}"
end
这种情况会造成:第一次循环正常,第二次循环 deploy 了两次
提示信息:
begin to deploy server 192.168.0.12
deploying.....
finish to deploy server 192.168.0.12
begin to deploy server 192.168.0.13
deploying.....
finish to deploy server 192.168.0.13
deploying...... ( server 192.168.0.13 )
可能的原因:该代码块循环后的代码会是:
p "begin to deploy server '192.168.0.12'"
set :domain, '192.168.0.12'
invoke :deploy # =》 第一次 queue
run! # 此时commands == [ 'invoke :deploy'] ( 当然这里应该是具体的命令,我笼统点写 )
p "finish to deploy server 192.168.0.12"
p "begin to deploy server 192.168.0.13"
set :domain, 192.168.0.13
invoke :deploy # => 第二次 queue
run! # 此时commands == [ 'invoke :deploy', 'invoke :deploy']
p "finish to deploy server 192.168.0.13"
所以第二次循环时,才会执行两次的 invoke: deploy。但是我直接输出 commands,发觉第二段确实是只有 一个 [' invoke :deploy'] 而已!并且 invoke 的 task,默认是只会被引用一次。 ###那为何这里重复运行了两次呢?
网上的解决方案是:
isolate do
domains.each do |domain|
p "begin to deploy server #{domain}"
set :domain, domain
invoke :deploy
run!
p "finish to deploy server #{domain}"
end
end
这样就正常了,而 isolate
的意思是:
Starts a new block where new commands are collected.
开辟一个新的 block 来新建集合 commands。
example
:
queue "sudo restart"
queue "true"
commands.should == ['sudo restart', 'true']
isolate do
queue "reload"
commands.should == ['reload']
end
commands.should == ['sudo restart', 'true']
###但是这样子做,循环后的所有代码不都是在同一个 block 下么?( 怎么还会起做作用??)为何不是这么做?
domains.each do |domain|
isolate do
p "begin to deploy server #{domain}"
set :domain, domain
invoke :deploy
run!
p "finish to deploy server #{domain}"
end
end
不过这样子做的话,第一次正常,第二次没有执行 invoke :deploy。
做了很多次试验,发现最终总是会多部署最后一个 server。看来这是跟invoke :deploy
这个特殊 task 有关了。